时钟极性(CPOL)与时钟相位(CPHA)深度解析

SPI 的时钟配置,说白了就是两件事:时钟空闲时是高还是低,以及数据在时钟的哪个边沿被采集。这两个参数分别叫 CPOL 和 CPHA。很多工程师在这上面栽过跟头,我当年第一次调 SPI 屏幕时,画面花成一团,折腾了半天才发现是 CPHA 配反了。

咱们先看 CPOL 和 CPHA 各自管什么,再看它们组合出来的四种模式。

CPOL:时钟极性

CPOL 决定的是 SPI 时钟线(SCLK)在空闲状态时的电平。

  • CPOL = 0:空闲时时钟为低电平(0)。
  • CPOL = 1:空闲时时钟为高电平(1)。

你想想看,空闲状态就是没有数据传输的时候。CPOL=0 时,时钟线一直拉着低电平;CPOL=1 时,时钟线一直拉着高电平。就这么简单。

我的习惯:如果从设备手册里没明确写 CPOL,我会先看时序图里时钟线的起始电平。起始是低,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 四种工作模式时序对比 模式 0 (CPOL=0, CPHA=0) SCLK 采样点 模式 1 (CPOL=0, CPHA=1) SCLK 采样点 模式 2 (CPOL=1, CPHA=0) SCLK 采样点 模式 3 (CPOL=1, CPHA=1) SCLK 采样点 图例: 采样点(红色) SCLK 时钟线(蓝色) 注意:模式 0 和模式 2 在第一个边沿采样,模式 1 和模式 3 在第二个边沿采样。

如何选择正确的模式

实际项目中,模式的选择不是由你决定的,而是由从设备决定的。每个 SPI 从设备的数据手册里都会明确写出它支持哪种模式,或者用时序图告诉你数据是在哪个边沿被采集的。

我个人的做法是:

  1. 先看数据手册:找到 SPI 接口章节,看有没有直接写 "SPI Mode 0" 或 "CPOL=0, CPHA=1" 这样的描述。
  2. 看时序图:如果手册没写模式编号,就看时序图。找到 SCLK 和 MOSI/MISO 的波形,看数据变化和时钟边沿的关系。
  3. 确认空闲电平:看 SCLK 在数据传输开始前的电平,确定 CPOL。
  4. 确认采样边沿:看数据在哪个时钟边沿被采集,确定 CPHA。
我曾经踩过的坑:有一次调试一个温湿度传感器,手册上写的是 "Mode 0",但我用逻辑分析仪抓出来的波形怎么看都不对。后来仔细看手册才发现,那个传感器实际上要求的是 Mode 1,手册写错了。从那以后,我再也不完全相信手册上的模式编号,一定亲自看时序图确认。

常见误区

  • 误区一:认为 CPHA=0 就是上升沿采样。不对,CPHA=0 是第一个边沿采样,至于是上升还是下降,要看 CPOL。
  • 误区二:认为模式 0 和模式 3 是一样的。它们采样边沿都是上升沿,但空闲电平不同,不能混用。
  • 误区三:认为所有 SPI 设备都支持四种模式。很多设备只支持其中一两种,配置错了直接不工作。
调试小技巧:如果你不确定从设备用的是什么模式,可以先用逻辑分析仪抓一下主设备发出的时钟和数据波形。看空闲电平确定 CPOL,看数据变化和时钟边沿的关系确定 CPHA。这比翻手册快多了。