1. SPI协议基础:SPI总线物理层、四线制时序与四种工作模式详解
1.1 SPI总线物理层概述
SPI(Serial Peripheral Interface,串行外设接口)是一种全双工、同步、主从架构的串行通信总线,由Motorola公司在20世纪80年代中期推出。在嵌入式Linux系统中,SPI广泛用于连接传感器、ADC/DAC、LCD控制器、闪存、RF模块等外设。
物理层采用四线制接口,所有信号线均为数字电平信号(通常为3.3V或1.8V逻辑电平):
| 信号线 | 名称 | 方向(主→从) | 功能描述 |
|---|---|---|---|
| SCLK | 串行时钟 | 主→从 | 由主设备产生,决定数据传输速率和同步节拍 |
| MOSI | 主出从入 | 主→从 | 主设备发送数据到从设备 |
| MISO | 主入从出 | 从→主 | 从设备发送数据到主设备 |
| CS | 片选 | 主→从 | 低电平有效,选中特定从设备进行通信 |
关键概念:SPI是全双工协议——在每个时钟周期,主设备通过MOSI发送一位数据,同时从设备通过MISO返回一位数据。因此一次传输的字节数由主设备决定,从设备不能主动发起传输。
1.2 四线制时序详解
SPI的时序以SCLK边沿为基准,数据在时钟的上升沿或下降沿被采样/移出。下图展示了SPI单字节传输的典型时序关系:
时序要点:
- CS拉低:主设备将CS置为低电平,通知从设备准备接收/发送数据。
- SCLK产生:主设备按设定频率产生时钟脉冲,每个脉冲传输1位数据。
- 数据同步:MOSI和MISO上的数据在SCLK的特定边沿被采样(取决于CPHA)。
- CS拉高:传输完成后CS拉高,从设备释放总线。
1.3 四种工作模式(CPOL/CPHA)详解
SPI协议通过两个参数定义时钟极性和相位,组合出四种工作模式。主设备和从设备必须使用相同的模式才能正常通信。
| 模式 | CPOL | CPHA | 时钟空闲电平 | 数据采样边沿 | 数据移出边沿 |
|---|---|---|---|---|---|
| 模式0 | 0 | 0 | 低电平 | 上升沿 | 下降沿 |
| 模式1 | 0 | 1 | 低电平 | 下降沿 | 上升沿 |
| 模式2 | 1 | 0 | 高电平 | 下降沿 | 上升沿 |
| 模式3 | 1 | 1 | 高电平 | 上升沿 | 下降沿 |
常见错误:在嵌入式Linux驱动开发中,设备树中配置的spi-cpol和spi-cpha必须与从设备数据手册严格一致。模式不匹配会导致数据错位或通信完全失败,且逻辑分析仪上波形看起来“有信号”但数据全是乱码。
1.4 四种模式波形对比
下图直观对比了四种模式下SCLK与数据采样的关系: