2. SPI 协议基础:物理层、四线制与全双工通信
SPI(Serial Peripheral Interface,串行外设接口)是一种由 Motorola 公司提出的同步、全双工、主从式串行通信总线。在嵌入式系统中,SPI 因其高速、简单、硬件开销低的特点,被广泛用于传感器、ADC/DAC、显示驱动、存储芯片(如 Flash/SD 卡)等外设。理解 SPI 的物理层信号定义、时钟极性与相位配置,是后续在 Zephyr OS 中正确配置 SPI 驱动并优化通信性能的基础。
2.1 SPI 总线物理层与四线制信号
标准的 SPI 总线使用 四根信号线 实现主从设备之间的全双工通信。这四根线分别是:
| 信号线名称 | 缩写 | 方向(主设备视角) | 功能描述 |
|---|---|---|---|
| 串行时钟 | SCLK / SCK | 输出 → 从设备 | 由主设备产生,决定数据传输的速率与同步节拍 |
| 主出从入 | MOSI | 输出 → 从设备 | 主设备发送数据给从设备的数据线 |
| 主入从出 | MISO | 输入 ← 从设备 | 从设备发送数据给主设备的数据线 |
| 片选信号 | CS / SS | 输出 → 从设备 | 主设备选择并激活特定从设备,低电平有效 |
SPI 总线采用 主从架构:主设备(通常是 MCU)负责产生时钟信号并控制片选线;从设备(外设芯片)在片选信号有效时,根据时钟信号同步收发数据。由于 MOSI 和 MISO 是独立的物理线路,SPI 能够在每个时钟周期内同时完成一位数据的发送和接收,从而实现真正的 全双工通信。
2.2 时钟极性与相位(CPOL / CPHA)
SPI 协议定义了 4 种通信模式,由时钟极性(CPOL)和时钟相位(CPHA)两个参数组合决定。这两个参数决定了数据在 SCLK 的哪个边沿被采样、哪个边沿被切换。
- CPOL(Clock Polarity,时钟极性):定义 SCLK 在空闲状态(CS 有效但无数据传输时)的电平。
- CPOL = 0:空闲时 SCLK 为低电平。
- CPOL = 1:空闲时 SCLK 为高电平。
- CPHA(Clock Phase,时钟相位):定义数据采样发生在 SCLK 的第一个边沿还是第二个边沿。
- CPHA = 0:数据在 SCLK 的第一个边沿(上升沿或下降沿,取决于 CPOL)被采样。
- CPHA = 1:数据在 SCLK 的第二个边沿被采样。
下表总结了 4 种 SPI 模式的详细配置:
| SPI 模式 | CPOL | CPHA | 空闲时钟电平 | 数据采样边沿 | 数据切换边沿 |
|---|---|---|---|---|---|
| 模式 0 | 0 | 0 | 低电平 | 上升沿(第一个边沿) | 下降沿 |
| 模式 1 | 0 | 1 | 低电平 | 下降沿(第二个边沿) | 上升沿 |
| 模式 2 | 1 | 0 | 高电平 | 下降沿(第一个边沿) | 上升沿 |
| 模式 3 | 1 | 1 | 高电平 | 上升沿(第二个边沿) | 下降沿 |
2.3 全双工通信原理
SPI 的全双工特性源于其独立的发送和接收数据路径。在每一个 SCLK 时钟周期内,主设备和从设备同时执行以下操作:
- 主设备 将一位数据从发送移位寄存器输出到 MOSI 线。
- 从设备 将一位数据从发送移位寄存器输出到 MISO 线。
- 在时钟的采样边沿,主设备采样 MISO 线获取从设备发送的位,从设备采样 MOSI 线获取主设备发送的位。
- 移位寄存器移动一位,准备下一个时钟周期的数据传输。
这种机制意味着:要接收 N 个字节的数据,主设备必须同时发送 N 个字节的数据(通常为 0x00 或 0xFF 等虚拟数据)。反之亦然,主设备发送 N 个字节数据时,也会同时接收到 N 个字节的数据(可能为无效数据)。
2.4 本章小结
本章从物理层信号定义出发,详细介绍了 SPI 总线的四线制结构、时钟极性与相位的 4 种工作模式,以及全双工通信的数据流原理。掌握这些基础知识后,你将能够正确理解外设数据手册中的时序要求,并为后续在 Zephyr OS 中配置 SPI 驱动参数(如 spi_config 结构体中的 operation 字段)打下坚实的理论基础。