1. SPI协议基础从四线制到时钟配置第一次接触SPI协议时我被它的简洁性惊艳到了。相比UART需要精确匹配波特率SPI通过四根线就能实现高速全双工通信。这四根线分别是SCLKSerial Clock时钟信号线由主机控制MOSIMaster Out Slave In主机输出从机输入MISOMaster In Slave Out主机输入从机输出SS/CSSlave Select片选信号线低电平有效实际项目中遇到过最头疼的问题就是时钟配置。SPI的时钟极性和相位有四种组合方式模式0-3这取决于两个关键参数CPOL时钟极性决定时钟空闲时的电平状态0空闲时为低电平1空闲时为高电平CPHA时钟相位决定数据采样的边沿0在第一个时钟边沿采样1在第二个时钟边沿采样举个例子使用STM32CubeMX配置SPI时如果外设芯片手册要求模式1CPOL0CPHA1而工程师错误配置为模式0就会导致数据采样错位。我曾用逻辑分析仪抓取过这种异常波形发现数据偏移了半个时钟周期。2. 单主机-单从机通信实战2.1 硬件连接要点在面包板上搭建SPI电路时有几点经验值得分享线长控制SCLK频率超过10MHz时建议导线长度不超过20cm上拉电阻CS线通常需要4.7kΩ上拉电阻信号完整性可以用100Ω电阻串联在信号线上抑制振铃最近调试一个SPI温度传感器MAX31865时发现MISO线上有毛刺。后来在传感器输出端并联47pF电容解决了问题这是典型的信号完整性问题。2.2 软件驱动开发以STM32 HAL库为例初始化代码应该包含这些关键参数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; hspi1.Init.CLKPhase SPI_PHASE_1EDGE; hspi1.Init.NSS SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_8;数据传输时有个细节容易忽略SPI是全双工协议即使只发送不接收也需要调用接收函数。我曾经这样处理单工通信// 错误示例只发送不接收 HAL_SPI_Transmit(hspi1, txData, 2, 100); // 正确做法 uint8_t dummy; HAL_SPI_TransmitReceive(hspi1, txData, dummy, 2, 100);3. 多从机系统设计两种经典架构对比3.1 独立片选方案这是最直观的多从机连接方式每个从机独占一条CS线。在PCB布局时要注意CS走线尽量等长避免CS线与高频信号线平行走线预留测试点方便逻辑分析仪连接实际项目中我设计过最多控制8个SPI从机的系统使用74HC138译码器扩展CS线。关键是要处理好CS信号的切换时序// 切换从机示例 void SelectSlave(uint8_t slave_num) { HAL_GPIO_WritePin(GPIOA, ALL_CS_PINS, GPIO_PIN_SET); // 先关闭所有从机 HAL_GPIO_WritePin(GPIOA, 1 slave_num, GPIO_PIN_RESET); // 选中指定从机 HAL_Delay(1); // 等待从机准备就绪 }3.2 菊花链方案这种方案特别适合LED驱动芯片如WS2812或移位寄存器。它的优势是节省IO口但要注意数据需要按从机数量进行移位最后一个从机的输出需要接回主机形成闭环传输延迟随从机数量增加而累积调试菊花链系统时我总结出一个技巧先单独测试每个从机再逐步增加链上设备。曾经有个项目因为第三个74HC595损坏导致整个链路失效用二分法排查很快定位了问题点。4. 高级技巧与故障排查4.1 时钟速率优化SPI时钟不是越快越好。根据传输距离和线材质量我常用的经验值板内通信≤25MHz10cm排线≤10MHz50cm以上≤1MHz可以通过分段测试确定最佳速率uint32_t baudrates[] {SPI_BAUDRATEPRESCALER_256, 64, 16, 4, 2}; for(int i0; i5; i) { hspi1.Init.BaudRatePrescaler baudrates[i]; HAL_SPI_Init(hspi1); if(SPI_Test()) break; // 实现自己的测试函数 }4.2 常见故障处理这些是我踩过的坑数据错位检查CPOL/CPHA配置间歇性通信失败可能是CS信号抖动增加10ns延时从机无响应测量电源电压SPI设备对电压敏感通信距离短尝试降低时钟速率或改用差分SPI逻辑分析仪是排查SPI问题的利器。我习惯先抓取正常波形保存为参考异常时对比分析。Wireshark的SPI插件也能直观显示数据流。