2. SPI 总线基础:协议原理与四线制
SPI(Serial Peripheral Interface,串行外设接口)由 Motorola 公司推出,是一种全双工、同步、主从式的串行通信总线。在网关设备中,SPI 常用于连接高速 ADC/DAC、LCD 控制器、以太网 MAC/PHY 芯片、FPGA 配置接口等对吞吐率要求较高的外设。理解 SPI 的协议原理、四线制信号定义以及时钟极性与相位的配置,是进行总线抽象层适配的第一步。
核心要点:SPI 没有像 I²C 那样的标准应答机制和固定帧格式,其灵活性体现在时钟参数可编程、数据帧长可配置(通常 8/16/32 位)、以及多从机片选独立管理。这种灵活性也意味着驱动适配时必须精确匹配从机设备的时序要求。
2.1 四线制信号定义
标准 SPI 总线使用四条信号线完成主从设备之间的数据交换,下表列出了每条信号线的名称、方向与功能描述:
| 信号线 | 全称 | 方向(主→从) | 功能描述 |
|---|---|---|---|
| SCLK | Serial Clock | 主机输出 → 从机输入 | 由主机产生的同步时钟信号,决定数据移位的速率和边沿 |
| MOSI | Master Out Slave In | 主机输出 → 从机输入 | 主机向从机发送数据的单向数据线 |
| MISO | Master In Slave Out | 从机输出 → 主机输入 | 从机向主机回复数据的单向数据线 |
| CS | Chip Select | 主机输出 → 从机输入 | 片选信号,低电平有效;主机通过拉低特定从机的 CS 线来选中通信目标 |
设计提示:在网关硬件设计中,如果 SPI 总线上挂载多个从机,每个从机必须独占一条 CS 线。主机 GPIO 资源紧张时,可使用 GPIO 扩展器或译码器(如 3-8 译码器)来扩展片选信号。
下图展示了 SPI 四线制在单主单从模式下的典型连接拓扑:
2.2 时钟极性与相位(CPOL / CPHA)
SPI 协议没有规定数据在时钟的哪个边沿采样,而是通过两个参数——时钟极性(CPOL)和时钟相位(CPHA)——来定义主从设备之间的同步时序。这两个参数共同决定了 SPI 的四种工作模式(Mode 0 ~ Mode 3)。
2.2.1 参数定义
| 参数 | 取值 | 含义 |
|---|---|---|
| CPOL | 0 | SCLK 空闲状态为低电平(低电平有效) |
| CPOL | 1 | SCLK 空闲状态为高电平(高电平有效) |
| CPHA | 0 | 数据在 SCLK 的第一个边沿(上升沿或下降沿)被采样 |
| CPHA | 1 | 数据在 SCLK 的第二个边沿被采样 |
常见适配错误:驱动开发中最常见的 SPI 通信失败原因就是 CPOL/CPHA 配置与从机数据手册不一致。例如,从机要求 Mode 0(CPOL=0, CPHA=0),但主机默认配置为 Mode 3(CPOL=1, CPHA=1),导致数据采样边沿完全错位,接收到的数据全部为乱码。
2.2.2 四种工作模式
将 CPOL 和 CPHA 组合,得到 SPI 的四种标准模式。下表总结了每种模式的时钟空闲电平、数据采样边沿和数据移位边沿:
| 模式 | CPOL | CPHA | 空闲时钟电平 | 数据采样边沿 | 数据移位边沿 |
|---|---|---|---|---|---|
| Mode 0 | 0 | 0 | 低电平 | 上升沿(第一个边沿) | 下降沿 |
| Mode 1 | 0 | 1 | 低电平 | 下降沿(第二个边沿) | 上升沿 |
| Mode 2 | 1 | 0 | 高电平 | 下降沿(第一个边沿) | 上升沿 |
| Mode 3 | 1 | 1 | 高电平 | 上升沿(第二个边沿) | 下降沿 |
记忆技巧:Mode 0(CPOL=0, CPHA=0)是最常用的模式,绝大多数 SPI 从机芯片默认支持 Mode 0。在驱动适配初期,如果从机数据手册没有明确说明,可以先尝试 Mode 0 进行通信验证。
2.2.3 时序波形对比
下图以 8 位数据传输为例,对比了 Mode 0 和 Mode 3 的 SCLK、MOSI 和 MISO 波形关系。注意观察空闲电平以及数据采样点的位置差异: