时钟极性(CPOL)与时钟相位(CPHA)深度解析
SPI 的时钟配置,说白了就是两件事:时钟空闲时是高还是低,以及数据在时钟的哪个边沿被采集。这两个参数分别叫 CPOL 和 CPHA。很多工程师在这上面栽过跟头,我当年第一次调 SPI 屏幕时,画面花成一团,折腾了半天才发现是 CPHA 配反了。
咱们先看 CPOL 和 CPHA 各自管什么,再看它们组合出来的四种模式。
CPOL:时钟极性
CPOL 决定的是 SPI 时钟线(SCLK)在空闲状态时的电平。
- CPOL = 0:空闲时时钟为低电平(0)。
- CPOL = 1:空闲时时钟为高电平(1)。
你想想看,空闲状态就是没有数据传输的时候。CPOL=0 时,时钟线一直拉着低电平;CPOL=1 时,时钟线一直拉着高电平。就这么简单。
CPHA:时钟相位
CPHA 决定的是数据在时钟的哪个边沿被采样。
- CPHA = 0:数据在时钟的第一个边沿被采样。
- CPHA = 1:数据在时钟的第二个边沿被采样。
这里要注意,「第一个边沿」和「第二个边沿」是相对于每个数据位传输周期来说的。一个时钟周期有两个边沿:上升沿和下降沿。CPHA=0 用第一个,CPHA=1 用第二个。
为什么会这样设计?说白了就是为了适应不同从设备的数据建立时间和保持时间要求。有些芯片需要数据在时钟沿之前就稳定,有些则可以在时钟沿之后才稳定。
四种工作模式组合
CPOL 和 CPHA 各有两种取值,组合起来就是四种模式。我见过不少工程师把这四种模式背得滚瓜烂熟,但一到实际调试还是搞混。其实你只要记住一个核心逻辑:CPOL 定空闲电平,CPHA 定采样边沿。
| 模式 | CPOL | CPHA | 空闲时钟电平 | 数据采样边沿 | 数据输出边沿 |
|---|---|---|---|---|---|
| 模式 0 | 0 | 0 | 低电平 | 上升沿(第一个边沿) | 下降沿 |
| 模式 1 | 0 | 1 | 低电平 | 下降沿(第二个边沿) | 上升沿 |
| 模式 2 | 1 | 0 | 高电平 | 下降沿(第一个边沿) | 上升沿 |
| 模式 3 | 1 | 1 | 高电平 | 上升沿(第二个边沿) | 下降沿 |
嗯,这里要注意一个容易混淆的点:CPHA=0 时,采样边沿是第一个边沿,但这个边沿可能是上升沿也可能是下降沿,具体取决于 CPOL。CPOL=0 时第一个边沿是上升沿,CPOL=1 时第一个边沿是下降沿。所以模式 0 和模式 2 的采样边沿是不同的。
- 模式 0 和模式 3 的采样边沿都是上升沿(但空闲电平不同)。
- 模式 1 和模式 2 的采样边沿都是下降沿(但空闲电平不同)。
- CPHA=0 时,数据在第一个边沿采样,数据变化发生在第二个边沿。
- CPHA=1 时,数据在第二个边沿采样,数据变化发生在第一个边沿。
四种模式的时序对比
光看表格可能还不够直观。我画了一张时序对比图,把四种模式放在一起,你一看就明白了。
如何选择正确的模式
实际项目中,模式的选择不是由你决定的,而是由从设备决定的。每个 SPI 从设备的数据手册里都会明确写出它支持哪种模式,或者用时序图告诉你数据是在哪个边沿被采集的。
我个人的做法是:
- 先看数据手册:找到 SPI 接口章节,看有没有直接写 "SPI Mode 0" 或 "CPOL=0, CPHA=1" 这样的描述。
- 看时序图:如果手册没写模式编号,就看时序图。找到 SCLK 和 MOSI/MISO 的波形,看数据变化和时钟边沿的关系。
- 确认空闲电平:看 SCLK 在数据传输开始前的电平,确定 CPOL。
- 确认采样边沿:看数据在哪个时钟边沿被采集,确定 CPHA。
常见误区
- 误区一:认为 CPHA=0 就是上升沿采样。不对,CPHA=0 是第一个边沿采样,至于是上升还是下降,要看 CPOL。
- 误区二:认为模式 0 和模式 3 是一样的。它们采样边沿都是上升沿,但空闲电平不同,不能混用。
- 误区三:认为所有 SPI 设备都支持四种模式。很多设备只支持其中一两种,配置错了直接不工作。