
1. SPI总线接口概述SPISerial Peripheral Interface是一种同步串行通信协议由Motorola在1980年代提出现已成为嵌入式系统和芯片间通信的行业标准。与I2C、UART等其他串行协议相比SPI以其全双工、高速率可达数十MHz和简单硬件实现的特性在存储器、传感器、显示模块等外设连接中占据重要地位。典型的SPI系统包含一个主设备Master和一个或多个从设备Slave通过四根基本信号线建立通信SCLKSerial Clock主设备提供的时钟信号MOSIMaster Out Slave In主设备发送数据线MISOMaster In Slave Out从设备发送数据线SS/CSSlave Select/Chip Select从设备选择信号低电平有效关键特性SPI没有官方标准规范不同厂商的实现可能存在细节差异但核心通信机制保持一致。实际应用中需特别注意时钟极性和相位的配置。2. SPI工作模式深度解析2.1 四种通信模式SPI通过CPOLClock Polarity和CPHAClock Phase两个参数定义了四种工作模式模式CPOLCPHA时钟空闲状态数据采样边沿000低电平上升沿101低电平下降沿210高电平下降沿311高电平上升沿模式0最常用适用于多数SPI Flash和传感器。模式3在SD卡通信中较为常见。实际选择需严格参照器件数据手册。2.2 时钟速率考量SPI时钟速率理论上仅受物理线路特性限制实际应用中需考虑主从设备支持的最高频率如STM32H7 SPI可达108MHz线路长度和PCB布局高速时需阻抗匹配从设备响应时间如EEPROM写入需要延迟经验法则长距离传输应降低时钟速率1MHz以下可有效减少信号完整性问题。高速SPI10MHz建议使用阻抗控制的PCB设计。3. 多从机系统设计3.1 硬件拓扑方案独立片选型每个从设备独占一个CS引脚优点通信互不干扰缺点占用MCU引脚资源n个从机需要n3根线菊花链型设备串联数据依次传递优点仅需4根线CS共享缺点软件协议复杂整体速率受限于最慢设备3.2 软件地址分配技巧对于不支持硬件CS的从机可通过协议层实现寻址// 软件片选示例以SPI Flash为例 void spi_flash_select(uint8_t dev_id) { GPIO_WriteLow(CS_PORT, ALL_CS_MASK); // 拉低所有CS GPIO_WriteHigh(CS_PORT, 1dev_id); // 激活目标设备 }PCB布局要点等长走线特别是SCLK到各从设备的长度差1/10波长终端匹配电阻高速时在末端接100Ω电阻避免直角走线会产生电磁辐射4. 典型问题排查指南4.1 无数据返回故障现象主设备发送正常但MISO始终无信号检查步骤确认从设备电源正常实测电压非空载测量验证CS信号是否有效示波器观察下降沿检查模式设置CPOL/CPHA需主从一致测量SCLK是否到达从设备可能线路断路案例某AMOLED屏SPI接口不响应最终发现是模式配置错误需Mode 3但配置为Mode 0。4.2 数据错位问题现象接收数据与预期存在位偏移解决方案检查字节顺序MSB/LSB first确认时钟相位CPHA设置在第一个有效时钟边沿前保持数据稳定CPHA0时// STM32CubeMX生成的SPI配置示例Mode 3 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_HIGH; // CPOL1 hspi1.Init.CLKPhase SPI_PHASE_2EDGE; // CPHA15. 高级应用技巧5.1 DMA优化方案对于高速数据传输如LCD刷新启用DMA可大幅降低CPU负载STM32配置要点设置DMA为循环模式Circular对齐数据宽度PSIZEMSIZE启用传输完成中断// STM32H7 SPI DMA配置 hdma_spi1_tx.Init.Request DMA_REQUEST_SPI1_TX; 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;5.2 自动片选波形优化常规CS信号在每字节传输间会产生毛刺改进方案硬件方案添加RC滤波R100Ω, C10pF软件方案在SPI空闲时手动保持CS有效void spi_write_continuous(uint8_t* data, uint32_t len) { CS_LOW(); HAL_SPI_Transmit(hspi1, data, len, 1000); // 不立即拉高CS }6. 协议对比与选型6.1 SPI vs I2C vs UART特性SPII2CUART速度可达100Mbps通常1Mbps通常12Mbps引脚数4nCS22拓扑结构点对点/菊花链多主多从点对点硬件复杂度简单中等简单错误检测无有ACK有奇偶校验选型建议高速场景选SPI如显示屏、Flash多设备总线选I2C如传感器阵列长距离通信选UART加电平转换7. 特殊场景处理7.1 低功耗设备唤醒某些SPI设备如BQ79600具有休眠模式需要特殊唤醒序列保持CS低电平至少500μs发送特定唤醒命令如0xA5等待1ms唤醒时间开始正常通信void spi_wakeup_device(void) { CS_LOW(); delay_us(600); // 超时设计 uint8_t cmd 0xA5; HAL_SPI_Transmit(hspi1, cmd, 1, 100); delay_ms(1); // 稳定等待 }7.2 电平转换方案当主从设备电压不匹配时如3.3V MCU与5V外设专用芯片TXS0108E自动方向转换分立元件MOSFET方案成本低但速度受限电阻分压仅适用于5V→3.3V单向传输注意避免直接连接不同电压器件可能损坏IO口或导致逻辑错误。