3、SPI 四种工作模式(Mode0~Mode3)详解归纳总结
SPI 的四种工作模式,说白了就是时钟极性(CPOL)和时钟相位(CPHA)的排列组合。刚接触 SPI 时,我也被这几个模式绕晕过。后来调了一个传感器,死活读不到数据,抓波形才发现是模式没对上——嗯,从那以后我把这四种模式彻底搞清楚了。
3.1 CPOL 与 CPHA:两个关键参数
- CPOL(Clock Polarity):空闲时时钟线的电平。
CPOL=0 → 空闲低电平;CPOL=1 → 空闲高电平。 - CPHA(Clock Phase):数据采样发生在哪个边沿。
CPHA=0 → 第一个边沿采样;CPHA=1 → 第二个边沿采样。
你想想看,两个参数各有两种取值,组合起来正好是 2×2=4 种模式。我个人习惯用一张表格记下它们:
| 工作模式 | CPOL | CPHA | 空闲时钟电平 | 数据采样边沿 | 数据输出边沿 |
|---|---|---|---|---|---|
| Mode 0 | 0 | 0 | 低电平 | 上升沿 | 下降沿 |
| Mode 1 | 0 | 1 | 低电平 | 下降沿 | 上升沿 |
| Mode 2 | 1 | 0 | 高电平 | 下降沿 | 上升沿 |
| Mode 3 | 1 | 1 | 高电平 | 上升沿 | 下降沿 |
3.2 Mode 0(CPOL=0, CPHA=0)——最常用
空闲时时钟为低。第一个边沿(上升沿)采样数据,第二个边沿(下降沿)输出数据。其实大部分 SPI 器件默认都是 Mode 0。我在项目中遇到过好几款 Flash 和 SD 卡,直接用 Mode 0 就能通。所以如果你不确定从设备支持哪种模式,可以先试试 Mode 0。
3.3 Mode 1(CPOL=0, CPHA=1)
空闲也是低电平,但数据是在第二个边沿(下降沿)采样的。这种模式不太常见,但有些 ADC 会用。我第一次调一个 16 位 ADC 时,数据老是错位,后来查手册发现它要求 Mode 1。印象很深。
3.4 Mode 2(CPOL=1, CPHA=0)
空闲高电平,在第一个边沿(下降沿)采样。Mode 2 和 Mode 0 正好是“空闲电平颠倒”的关系。有些电机驱动芯片用这种模式,我调一款步进电机驱动时就遇到过,当时一看波形就明白:空闲高,下降沿采数。
3.5 Mode 3(CPOL=1, CPHA=1)
空闲高电平,在第二个边沿(上升沿)采样。Mode 3 也很常见,跟 Mode 0 一样是“亲民模式”。我曾经同时挂两个传感器,一个要求 Mode 0,一个要求 Mode 3,结果 MCU 只能配一种模式……最后不得已上了软件 SPI 才搞定。
3.6 四种模式速查指南
调板子时怎么快速确定模式?我的办法就三步:
- 翻从设备数据手册,找 “SPI Timing” 章节。
- 看波形图:空闲时 CLK 是低还是高(确定 CPOL)?数据采样是第一个边沿还是第二个边沿(确定 CPHA)?
- 对照上表匹配模式。
举个例子: 一段典型 SPI 时序代码的配置(以 STM32 HAL 为例):
// Mode 0: CPOL=0, CPHA=0
SPI_InitTypeDef spi;
spi.CLKPhase = SPI_PHASE_1EDGE; // 第一个边沿采样
spi.CLKPolarity = SPI_POLARITY_LOW; // 空闲低电平
// Mode 3: CPOL=1, CPHA=1
spi.CLKPhase = SPI_PHASE_2EDGE; // 第二个边沿采样
spi.CLKPolarity = SPI_POLARITY_HIGH; // 空闲高电平
现实中我还发现一个问题:有些国产芯片手册写得不规范,比如只写“在时钟上升沿采样”,却不写空闲电平。这时候你就得看时序图里 CLK 起始的电平,或者直接用逻辑分析仪实测。我吃过一次亏——一个温湿度传感器手册漏写了 CPHA 值,抓波形才发现它其实用的是 Mode 2。
- Mode 0:空闲低,上升沿采 → 最常用。
- Mode 1:空闲低,下降沿采 → 少用。
- Mode 2:空闲高,下降沿采 → 跟 Mode 0 电平反。
- Mode 3:空闲高,上升沿采 → 跟 Mode 1 电平反。
说白了就是:CPOL 定空闲电平,CPHA 定采样发生在第几个边沿。记住这个,就不会迷糊。
最后放一张我常用的模式选择逻辑图,帮你理清思路:
调 SPI 说白了就是四个参数——CPOL 和 CPHA。分清它们,再看设备手册或者抓个波形,基本不会走偏。我个人习惯把所有 SPI 器件都优先用 Mode 0 试,不行再切。不过千万别偷懒省掉逻辑分析仪那一步,否则可能踩坑。嗯,这四种模式,你应该已经心里有数了。