SPI驱动适配实战:CPOL与CPHA参数调试方法 - 第2节
2.1 SPI 物理层信号线定义
SPI(Serial Peripheral Interface)是一种全双工、同步、主从架构的串行通信协议。物理层由四条基本信号线构成,理解每条线的角色是分析时序的基础。
| 信号线 | 全称 | 方向(主→从) | 功能描述 |
|---|---|---|---|
| SCLK | Serial Clock | 主→从 | 由主设备产生,决定数据移位的节奏 |
| MOSI | Master Out Slave In | 主→从 | 主设备发送数据给从设备 |
| MISO | Master In Slave Out | 从→主 | 从设备发送数据给主设备 |
| CS/SS | Chip Select / Slave Select | 主→从 | 片选信号,低电平有效,选中特定从设备 |
调试要点: 在硬件调试时,优先用示波器同时抓取 SCLK、MOSI、MISO 和 CS 四根线。CS 的下降沿标志着一次 SPI 传输的开始,上升沿标志着传输结束。
2.2 时钟极性(CPOL)的物理意义
时钟极性(Clock Polarity, CPOL)定义了 SCLK 在空闲状态(即 CS 无效、无数据传输时)的电平。
- CPOL = 0:空闲时 SCLK 为低电平(0)。
- CPOL = 1:空闲时 SCLK 为高电平(1)。
CPOL 决定了时钟信号的“起始电平”和“结束电平”。在数据帧传输期间,SCLK 会从空闲电平跳变到相反电平,产生一个完整的时钟周期。
物理层观察: 用示波器测量 SCLK 引脚,在 CS 拉高(空闲)期间观察 SCLK 的静态电平,即可直接判断当前从设备期望的 CPOL 值。
2.3 时钟相位(CPHA)的物理意义
时钟相位(Clock Phase, CPHA)定义了数据采样与数据切换相对于 SCLK 边沿的位置关系。CPHA 决定了数据是在 SCLK 的第一个边沿还是第二个边沿被采样。
- CPHA = 0:数据在 SCLK 的第一个边沿(上升沿或下降沿,取决于 CPOL)被采样。数据切换发生在第一个边沿之前(即 CS 有效后的第一个半周期)。
- CPHA = 1:数据在 SCLK 的第二个边沿被采样。数据切换发生在第一个边沿。
常见误区: 很多开发者误以为 CPHA=0 就是“上升沿采样”,CPHA=1 就是“下降沿采样”。实际上,采样边沿是 CPOL 和 CPHA 组合的结果。例如:CPOL=0, CPHA=0 是上升沿采样;CPOL=1, CPHA=0 则是下降沿采样。
2.4 四种模式组合:采样与切换时序窗口
CPOL 和 CPHA 组合出 SPI 的四种标准工作模式。每种模式对应唯一的采样边沿和切换边沿。
| 模式 | CPOL | CPHA | 空闲电平 | 采样边沿 | 切换边沿 |
|---|---|---|---|---|---|
| Mode 0 | 0 | 0 | 低 | 上升沿 | 下降沿 |
| Mode 1 | 0 | 1 | 低 | 下降沿 | 上升沿 |
| Mode 2 | 1 | 0 | 高 | 下降沿 | 上升沿 |
| Mode 3 | 1 | 1 | 高 | 上升沿 | 下降沿 |
时序窗口概念: 采样边沿是接收端读取数据线的时刻,切换边沿是发送端更新数据线的时刻。采样窗口必须避开数据切换造成的信号不稳定期(毛刺、建立时间)。正确的 CPOL/CPHA 组合能确保采样点落在数据信号的稳定区间中央。
2.5 数据采样与切换的时序窗口分析
在 SPI 通信中,数据线的信号变化并非瞬间完成。由于 PCB 走线寄生电容、驱动芯片的上升/下降时间等因素,数据切换后存在一段“信号不稳定期”。采样点必须避开这个窗口。
- 建立时间(tSU):采样边沿到来之前,数据必须保持稳定的最短时间。
- 保持时间(tH):采样边沿到来之后,数据必须继续稳定的最短时间。
- 有效采样窗口:数据稳定区间内,满足建立时间和保持时间的区域。
调试经验: 当 SPI 通信出现随机误码时,优先检查 CPOL/CPHA 配置是否与从设备数据手册一致。若一致仍有问题,则可能是时钟频率过高导致采样窗口不足。尝试降低 SPI 时钟频率(如从 20MHz 降至 10MHz),观察误码是否消失。
2.6 从设备数据手册解读方法
每个 SPI 从设备的数据手册都会明确标注其支持的 SPI 模式。常见表述方式有两种:
| 表述方式 | 示例 | 解读 |
|---|---|---|
| 直接给出模式号 | "Supports SPI Mode 0 and Mode 3" | CPOL=0,CPHA=0 或 CPOL=1,CPHA=1 |
| 给出时序图 | 图中标注采样边沿位置 | 根据采样边沿反推 CPOL/CPHA |
| 给出 CPOL/CPHA 表格 | CPOL=0, CPHA=0 | 直接配置即可 |
注意: 部分国产或老旧芯片的数据手册可能存在时序图绘制错误。务必以实际示波器测量结果为准,不要盲目相信手册。测量方法:抓取 SCLK 和 MOSI,观察数据切换边沿与采样边沿的相对位置。
2.7 常见调试问题与排查思路
- 问题: 通信完全无响应,MISO 一直为高或低。
排查: 检查 CS 是否正常拉低;检查 SCLK 是否有时钟输出;检查 CPOL 是否匹配(空闲电平是否正确)。 - 问题: 数据偶尔错位,读出的字节顺序混乱。
排查: 检查 CPHA 是否匹配。CPHA 错误会导致采样点落在数据切换边沿,采样到不稳定电平。 - 问题: 高速通信时误码率升高,低速正常。
排查: 时钟频率过高,建立/保持时间不足。尝试降低频率或调整 CPOL/CPHA 组合(某些从设备在 Mode 1/3 下时序裕量更大)。
2.8 本章小结
- CPOL 决定 SCLK 空闲电平,CPHA 决定数据采样相对于第一个边沿的位置。
- 四种模式(Mode 0~3)覆盖了所有可能的采样/切换组合。
- 采样窗口必须避开数据切换造成的不稳定期,这是 SPI 适配的核心。
- 调试时先用示波器确认空闲电平(CPOL),再确认采样边沿(CPHA)。
- 不要完全依赖数据手册,实测波形是最终依据。