1. SPI通信基础:四线制与工作模式
SPI(Serial Peripheral Interface)作为一种同步串行通信协议,在嵌入式系统中扮演着重要角色。我第一次在STM32项目中使用SPI驱动OLED显示屏时,曾困惑于为何需要四根线而不是像UART那样两根线就能工作。实际上,SPI的四线制设计正是其高速可靠传输的关键。
SPI总线由以下四条信号线构成:
- SCLK(Serial Clock):时钟信号线,由主设备产生
- MOSI(Master Out Slave In):主设备输出从设备输入数据线
- MISO(Master In Slave Out):主设备输入从设备输出数据线
- SS/CS(Slave Select/Chip Select):从设备选择信号线(低电平有效)
实际布线时要注意:SCLK信号频率较高,走线应尽量短且避免锐角转弯。我曾因SCLK走线过长导致1MHz以上通信失败,缩短到5cm内问题立即解决。
SPI有四种工作模式,由CPOL(Clock Polarity)和CPHA(Clock Phase)两个参数决定:
- 模式0:CPOL=0(时钟空闲低电平),CPHA=0(数据在时钟第一个边沿采样)
- 模式1:CPOL=0,CPHA=1(数据在时钟第二个边沿采样)
- 模式2:CPOL=1(时钟空闲高电平),CPHA=0
- 模式3:CPOL=1,CPHA=1
不同厂商设备可能默认不同模式。例如,ST7789显示屏通常用模式0,而NRF24L01无线模块需要模式3。配置错误会导致通信完全失败——这是我调试时遇到的第一个坑,现象是能检测到时钟信号但收不到任何数据。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件层实现要点与常见问题
2.1 主从设备连接方式
标准SPI拓扑中,主设备通过单独的SS线控制多个从设备。但在实际项目中,我发现三种实用连接方式:
-
独立片选型(最常用):
- 每个从设备有独立的SS线
- 主设备GPIO引脚数量需≥从设备数
- 优势:各设备可独立控制
- 缺点:GPIO资源消耗大
-
菊花链型:
- 所有从设备共用SS线
- 数据通过MISO-MOSI级联传输
- 优势:节省
