2、时钟极性CPOL与时钟相位CPHA的物理含义归纳总结

刚接触SPI时,我总觉得CPOL和CPHA这俩参数很抽象。明明手册上写着“时钟极性”和“时钟相位”,可到底怎么影响通信呢?说白了,它们决定了SCK线上的电平怎么走,以及数据在哪一刻被“咔嚓”一下捕获。今天我就把这对兄弟的物理含义掰开揉碎了讲清楚。

2.1 CPOL – 时钟空闲时的电平

CPOL的全称是Clock Polarity。它只问一个问题:当SPI总线空闲(CS拉高、没有数据传输)时,SCK线保持高电平还是低电平?

  • CPOL = 0:空闲时SCK为低电平。数据传输时,第一个边沿是上升沿,传输结束回到低。
  • CPOL = 1:空闲时SCK为高电平。数据传输时,第一个边沿是下降沿,传输结束回到高。

你想想看,这就像两个人约定“不说话时保持沉默”还是“不说话时保持嘈杂”。我曾在项目里把从设备的CPOL设反了,结果SCK空闲时两边电平打架,MCU的IO直接短路——那烟冒得,至今难忘。所以别小看这个极性,物理上它决定了驱动器的输出状态。

核心理解:CPOL改变的是SCK的空闲电平,并不改变数据采样的边沿顺序。采样边沿由CPHA决定。

2.2 CPHA – 数据在哪个边沿被采样

CPHA是Clock Phase,它控制的是数据采样时刻相对于SCK边沿的相位关系。注意,这里的“相位”不是正弦波里的相位,而是“第几个边沿”的意思。

  • CPHA = 0:在SCK的第一个边沿(第一个跳变)采样数据。通俗讲,数据在SCK从空闲状态第一次跳变时被“拍下来”。
  • CPHA = 1:在SCK的第二个边沿(即第一个边沿之后的另一个跳变)采样数据。换句话说,第一个边沿只是切换数据输出,第二个边沿才采样。

我记得有一次调试一个温湿度传感器,明明极性对了,可读回来的数据总是错位一位。后来抓波形发现,原来是CPHA设成了0,而传感器要求CPHA=1,数据采样晚了一个边沿。说白了,就像两个人拍照,一个说“我喊茄子你就按快门”,另一个说“我喊茄~你就按”,节奏不对,照片就糊了。

2.3 四种组合模式一览

CPOL和CPHA各取0/1,组合出四种标准SPI模式。下面这个表我建议你收藏,调试时对着看。

模式 CPOL CPHA 空闲SCK电平 数据采样边沿 数据输出边沿 常见设备举例
0 0 0 低 上升沿 下降沿 W25Q系列Flash, SD卡(部分)
1 0 1 低 下降沿 上升沿 AD7685、部分LCD驱动
2 1 0 高 下降沿 上升沿 MAX7219、某些RF模块
3 1 1 高 上升沿 下降沿 ENC28J60、NFC芯片

我个人的记忆技巧:CPOL=0空闲低,CPOL=1空闲高;CPHA=0采样在第一个边沿(上升或下降因CPOL而异),CPHA=1采样在第二个边沿。你对着时序图看一遍,一辈子忘不了。

2.4 物理含义的终极归纳

到这里,你应该能感受到CPOL和CPHA并非什么玄学,而是实实在在的物理信号约定:

  1. CPOL 定义了SCK的直流偏置(空闲电平)。它影响总线驱动器的静态功耗和抗干扰能力。例如空闲低时,下拉电阻可以省掉;空闲高时,上拉电阻可能跟SCK冲突。
  2. CPHA 定义了发起数据传输的时刻和采样的相位差。它决定了从设备内部移位寄存器的时钟边沿选择,错了会导致数据移位或丢失。
  3. 两者组合形成了四种不同的时序“方言”。主从双方必须说同一种方言,否则数据理解就会出错。

我曾经遇到一个奇葩案例:某国产传感器手册没写SPI模式,我按默认模式0调,死活不通。后来用示波器抓了它的SCK和MISO波形,发现它在SCK空闲高时,MISO数据只在下降沿变化——这不就是模式2(CPOL=1, CPHA=0)吗?改过来立马正常。所以你看,懂得物理含义,你就能自己“破译”未知设备的时序。

CPOL与CPHA组合关系 – SPI四模式 CPOL:空闲电平 CPHA:采样边沿 模式0 CPOL=0 CPHA=0 模式1 CPOL=0 CPHA=1 模式2 CPOL=1 CPHA=0 模式3 CPOL=1 CPHA=1 空闲SCK低 → 第1边沿上升沿采样 空闲SCK高 → 第1边沿下降沿采样 同一SPI总线上的所有设备必须使用相同的CPOL+CPHA组合

重要提醒:CPOL和CPHA是独立设置的,但很多MCU的SPI外设把它们打包在一个寄存器里。我曾经因为误解了某款STM32的SPI_CR1寄存器位定义,把CPOL和CPHA写反了,调了整整一下午。一定要仔细看芯片参考手册的SPI模式编号描述(通常也是0~3),而不是只依赖CPOL/CPHA位值。

好了,现在你应该能闭着眼睛说出:模式0是CPOL=0/CPHA=0,空闲低,上升沿采样;模式3是CPOL=1/CPHA=1,空闲高,上升沿采样。嗯,其实这两种是最常见的。下次调试的时候,先确认从设备手册里的波形图,再看SCK空闲电平,最后看数据变化发生在哪个边沿——三步走,永不踩坑。