2. SPI工作模式:CPOL和CPHA详解
SPI的四种工作模式,说白了就是时钟极性(CPOL)和时钟相位(CPHA)的排列组合。很多初学者看到这四个模式就头大,觉得要死记硬背。其实不用,你只要理解了CPOL和CPHA各自控制什么,模式自然就记住了。
2.1 CPOL和CPHA到底是什么?
先说说这两个参数的本质:
- CPOL(Clock Polarity):决定时钟空闲时的电平。CPOL=0,空闲时SCK为低电平;CPOL=1,空闲时SCK为高电平。
- CPHA(Clock Phase):决定数据采样发生在哪个时钟边沿。CPHA=0,在第一个边沿采样;CPHA=1,在第二个边沿采样。
嗯,这里要注意:第一个边沿和第二个边沿,是相对于每个数据位传输周期来说的。一个完整的SCK周期有两个边沿——上升沿和下降沿。
核心记忆法:
CPOL决定"闲着的时候干啥",CPHA决定"啥时候干活(采样)"。
2.2 四种工作模式的时序图分析
我个人习惯把四种模式分成两组来理解:
Mode 0(CPOL=0, CPHA=0)
这是最常用的模式,也是大多数SPI设备的默认模式。我项目中遇到过的传感器,十有八九都是Mode 0。
- 空闲时SCK为低电平
- 在SCK的第一个边沿(上升沿)采样数据
- 在第二个边沿(下降沿)输出数据
Mode 1(CPOL=0, CPHA=1)
- 空闲时SCK为低电平
- 在SCK的第二个边沿(下降沿)采样数据
- 在第一个边沿(上升沿)输出数据
Mode 2(CPOL=1, CPHA=0)
- 空闲时SCK为高电平
- 在SCK的第一个边沿(下降沿)采样数据
- 在第二个边沿(上升沿)输出数据
Mode 3(CPOL=1, CPHA=1)
- 空闲时SCK为高电平
- 在SCK的第二个边沿(上升沿)采样数据
- 在第一个边沿(下降沿)输出数据
我的小技巧:你发现规律了吗?CPHA=0时,采样都在第一个边沿;CPHA=1时,采样都在第二个边沿。至于第一个边沿是上升还是下降,那要看CPOL——CPOL=0时第一个边沿是上升沿,CPOL=1时第一个边沿是下降沿。
2.3 时序图SVG展示
下面我用SVG画了一张四种模式的时序对比图,你可以直观地看到区别:
2.4 模式匹配原则
模式匹配这件事,说白了就是一句话:主设备和从设备的模式必须一致。你想想看,如果主设备在上升沿采样,从设备却在下降沿输出数据,那读到的数据肯定不对。
我曾经踩过的坑:有一次调试一个温湿度传感器,死活读不到正确数据。查了半天,发现传感器数据手册上写的是Mode 2,但我代码里配的是Mode 0。改过来之后,数据就正常了。所以拿到一个新器件,第一件事就是看数据手册里的时序图,确认它工作在哪个模式。
匹配原则其实很简单:
- 查数据手册:从设备的数据手册里通常会明确写出支持的SPI模式
- 看时序图:如果手册没写,就看时序图——空闲时SCK是高还是低(确定CPOL),数据在哪个边沿采样(确定CPHA)
- 配置主设备:在Linux内核的SPI设备树或驱动代码中,设置对应的模式
2.5 实际开发中的选择建议
我个人在实际项目中的经验是:
- 优先选Mode 0:兼容性最好,大多数SPI外设都支持
- 如果Mode 0不行:再试Mode 3,这两个模式在时钟边沿上是对称的
- Mode 1和Mode 2:用得少,但某些特定器件(比如一些ADC)会用到
一个小技巧:如果你不确定从设备的模式,可以用逻辑分析仪抓一下从设备在空闲时的SCK电平,以及它在收到数据时是在哪个边沿变化的。这样就能反推出它需要的模式。
嗯,关于SPI的工作模式,核心就是这些。你只要记住CPOL决定空闲电平,CPHA决定采样边沿,四种模式就是这两个参数的排列组合。下次再遇到SPI通信问题,先检查模式对不对,能省下不少调试时间。
总结一下:
- Mode 0:CPOL=0, CPHA=0,空闲低,上升沿采样
- Mode 1:CPOL=0, CPHA=1,空闲低,下降沿采样
- Mode 2:CPOL=1, CPHA=0,空闲高,下降沿采样
- Mode 3:CPOL=1, CPHA=1,空闲高,上升沿采样
主从设备的模式必须一致,这是SPI通信能正常工作的前提。