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画了一张四种模式的时序对比图,你可以直观地看到区别:

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) ↑采样 ↑采样 SCK 采样点 时钟边沿

2.4 模式匹配原则

模式匹配这件事,说白了就是一句话:主设备和从设备的模式必须一致。你想想看,如果主设备在上升沿采样,从设备却在下降沿输出数据,那读到的数据肯定不对。

我曾经踩过的坑:有一次调试一个温湿度传感器,死活读不到正确数据。查了半天,发现传感器数据手册上写的是Mode 2,但我代码里配的是Mode 0。改过来之后,数据就正常了。所以拿到一个新器件,第一件事就是看数据手册里的时序图,确认它工作在哪个模式。

匹配原则其实很简单:

  1. 查数据手册:从设备的数据手册里通常会明确写出支持的SPI模式
  2. 看时序图:如果手册没写,就看时序图——空闲时SCK是高还是低(确定CPOL),数据在哪个边沿采样(确定CPHA)
  3. 配置主设备:在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通信能正常工作的前提。

专注资料整理