1. SPI协议基础认知
SPI(Serial Peripheral Interface)作为嵌入式领域最常用的同步串行通信协议之一,其四线制的硬件设计在各类传感器、存储芯片和显示模块中广泛应用。我第一次接触SPI是在调试一块OLED屏幕时,当时被CLK线那规律的方波信号所震撼——原来硬件通信可以如此优雅。
SPI采用主从架构,通常由一个主设备(MCU)和一个或多个从设备(外设)组成。四根信号线各司其职:
- SCLK(Serial Clock):由主设备产生的时钟信号,像乐队的指挥棒一样同步数据传输节奏
- MOSI(Master Out Slave In):主设备输出数据线,如同讲话时的声带振动
- MISO(Master In Slave Out):主设备输入数据线,相当于聆听时的耳膜接收
- SS/CS(Slave Select/Chip Select):从设备选择线,类似房间的门铃——只有被选中的设备才会响应
实际布线时建议给每条信号线串联22Ω电阻,能有效抑制信号反射。我曾因省略这个电阻导致ILI9341显示屏出现雪花噪点,排查了整整两天。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SPI硬件层深度解析
2.1 时钟极性CPHA与相位CPOL
SPI最让人困惑的莫过于时钟极性与相位的四种组合模式。通过示波器抓取不同模式下的波形后,我发现可以这样理解:
- CPOL=0:时钟空闲时为低电平,像钢琴的黑键等待被按下
- CPOL=1:时钟空闲时为高电平,如同白键已经按下待释放
- CPHA=0:数据在时钟第一个边沿采样,好比在日出时记录温度
- CPHA=1:数据在时钟第二个边沿采样,就像在日落时读取温度计
模式0(CPOL=0, CPHA=0)是最常见的配置,适用于大多数EEPROM和传感器。而模式3(CPOL=1, CPHA=1)则在某些RFID芯片中使用较多。调试ADXL345加速度计时,就因模式设置错误导致读取的数据全是0xFF。
2.2 多从机连接方案对比
当系统需要连接多个SPI设备时,有三种典型方案:
- 独立片选型(推荐方案):
c复制// STM32配置示例 void SPI_SelectDevice(GPIO_TypeDef* Port, uint16_t Pin) { HA
