SPI协议详解:从基础原理到高级应用
2026/7/19 6:53:18 网站建设 项目流程

1. SPI协议基础解析

SPI(Serial Peripheral Interface)是一种同步串行通信协议,由摩托罗拉在1980年代初期开发,现已成为嵌入式系统中最常用的短距离芯片间通信标准之一。作为全双工、主从架构的四线制接口,SPI以其简单高效的特性在各类传感器、存储设备和外设控制中占据重要地位。

1.1 核心特性与拓扑结构

SPI采用主从式架构,包含以下关键信号线:

  • SCLK(Serial Clock):主设备产生的同步时钟
  • MOSI(Master Out Slave In):主设备输出/从设备输入数据线
  • MISO(Master In Slave Out):主设备输入/从设备输出数据线
  • SS(Slave Select):从设备片选信号(低电平有效)

典型应用中,SPI支持三种拓扑配置:

  1. 标准多从机结构:每个从机独立SS线,共享SCLK/MOSI/MISO
  2. 菊花链结构:所有从机共用SS线,数据级联传输
  3. 扩展器结构:通过解码器扩展SS选择能力

实际应用中需注意:当使用多从机标准结构时,非选中从机的MISO必须设为高阻态,否则会导致总线冲突。对于不支持三态输出的从机,需要额外添加三态缓冲器。

1.2 时钟模式与数据传输

SPI协议通过CPOL(Clock Polarity)和CPHA(Clock Phase)两个参数定义四种工作时序模式:

模式CPOLCPHA数据输出时刻数据采样时刻
000SCLK下降沿/SS激活时SCLK上升沿
101SCLK上升沿SCLK下降沿
210SCLK上升沿/SS激活时SCLK下降沿
311SCLK下降沿SCLK上升沿

数据传输过程遵循以下步骤:

  1. 主设备拉低目标从机的SS线
  2. 主设备产生时钟信号(频率通常1-50MHz)
  3. 每个时钟周期完成1bit全双工传输
  4. 传输完成后主设备停止时钟并释放SS线

2. SPI硬件实现细节

2.1 典型硬件接口设计

在STM32等MCU中实现SPI接口时,需关注以下硬件特性:

  • 移位寄存器:通常8/16/32位宽度
  • 时钟预分频:设置SCLK频率(如fPCLK/2, fPCLK/4等)
  • 数据对齐:MSB-first或LSB-first
  • DMA支持:减轻CPU负担

以STM32F4配置SPI1为例:

// SPI1初始化代码示例 SPI_HandleTypeDef hspi1; hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL=0 hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA=0 hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; // 10.5MHz @42MHz PCLK HAL_SPI_Init(&hspi1);

2.2 特殊应用场景实现

2.2.1 SPI Flash读写

W25Q系列SPI Flash典型操作序列:

  1. 写使能(WREN 0x06)
  2. 页编程(PP 0x02)或扇区擦除(SE 0x20)
  3. 读状态寄存器(RDSR 0x05)等待操作完成
  4. 快速读(FAST_READ 0x0B)获取数据
// W25Q128JV读取ID示例 uint8_t cmd[4] = {0x9F, 0x00, 0x00, 0x00}; // JEDEC ID命令 uint8_t id[3]; HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, cmd, id, 4, HAL_MAX_DELAY); HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_SET); // id[0]=制造商(EFh), id[1]=设备类型(40h), id[2]=容量(18h)
2.2.2 传感器数据采集

ICM-42688-P六轴IMU的SPI接口特点:

  • 支持模式0/3
  • 最高时钟频率24MHz
  • 寄存器地址自动递增(bit6=1)
  • 读取时最高位需置1
// ICM42688读取加速度数据 uint8_t tx[7] = {0x2D | 0x80, 0, 0, 0, 0, 0, 0}; // 读ACCEL_DATA寄存器 uint8_t rx[7]; HAL_GPIO_WritePin(IMU_CS_GPIO_Port, IMU_CS_Pin, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, tx, rx, 7, HAL_MAX_DELAY); HAL_GPIO_WritePin(IMU_CS_GPIO_Port, IMU_CS_Pin, GPIO_PIN_SET); int16_t accel_x = (rx[1]<<8) | rx[2];

3. SPI高级应用技术

3.1 增强型SPI变体

类型数据线数量比特率提升典型应用
Dual SPI22xSPI Flash读取
Quad SPI44x高速存储器接口
QPI/SQI44x全命令QSPI Flash
DDR SPI1/2/42x高性能存储控制器

3.2 DMA优化策略

SPI结合DMA可显著提升效率,关键配置要点:

  1. 配置DMA流为外设到内存/内存到外设模式
  2. 设置合适的数据宽度(8/16/32位)
  3. 启用DMA中断处理传输完成事件
  4. 注意缓存一致性(必要时使用SCB_CleanDCache)

STM32F4 DMA示例:

// SPI1 TX DMA配置 hdma_spi1_tx.Instance = DMA2_Stream3; hdma_spi1_tx.Init.Channel = DMA_CHANNEL_3; hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE; hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; HAL_DMA_Init(&hdma_spi1_tx); __HAL_LINKDMA(&hspi1, hdmatx, hdma_spi1_tx);

4. 常见问题与调试技巧

4.1 典型故障排查表

现象可能原因解决方案
无数据通信SS信号未激活检查SS线连接和软件控制
数据错位时钟模式不匹配确认主从设备CPOL/CPHA设置
仅单向通信正常MISO/MOSI接线错误交换主从设备数据线连接
高频通信不稳定走线过长/阻抗不匹配缩短走线长度,添加终端电阻
DMA传输数据异常缓存未同步调用SCB_CleanDCache等函数

4.2 逻辑分析仪调试

使用Saleae Logic等工具分析SPI信号时:

  1. 设置正确的采样率(至少4倍于SCLK频率)
  2. 配置正确的时钟极性和相位
  3. 添加SS线作为触发条件
  4. 解码时可设置不同的数据帧大小

典型SPI信号异常:

  • 时钟抖动:检查电源稳定性
  • 数据毛刺:检查信号走线交叉干扰
  • SS信号抖动:优化软件控制时序

4.3 软件模拟SPI实现

当硬件SPI资源不足时,可用GPIO模拟:

void SoftSPI_Write(uint8_t data) { for(int i=0; i<8; i++) { HAL_GPIO_WritePin(SPI_SCK_GPIO_Port, SPI_SCK_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(SPI_MOSI_GPIO_Port, SPI_MOSI_Pin, (data & 0x80) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(SPI_SCK_GPIO_Port, SPI_SCK_Pin, GPIO_PIN_SET); data <<= 1; } }

注意事项:

  • 时钟频率通常不超过1MHz
  • 严格保证setup/hold时间
  • 中断服务中禁用模拟SPI操作
  • 可针对特定从机优化时序

在实际项目中,我曾遇到STM32硬件SPI与某型号Flash兼容性问题,最终发现是Flash要求的时钟空闲状态时间不足。通过在传输间插入5us延时解决了问题。这提醒我们,即使模式匹配,仍需仔细检查器件手册中的时序参数。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询