一、SPI时序基础:CPOL和CPHA详解
SPI通信,说白了就是主设备和从设备之间的一场「默契配合」。配合得好不好,关键就看两个参数——CPOL和CPHA。我刚开始接触SPI时,总觉得这两个概念绕来绕去,后来踩过几次坑才真正搞明白。
1.1 CPOL:时钟极性
CPOL决定的是空闲时时钟线的电平状态。很简单:
- CPOL = 0:空闲时SCK为低电平
- CPOL = 1:空闲时SCK为高电平
嗯,这里要注意:空闲时钟电平指的是没有数据传输时,时钟线保持的状态。我见过不少新手把「空闲电平」和「有效电平」搞混,其实它们完全是两码事。
1.2 CPHA:时钟相位
CPHA决定的是数据在哪个时钟边沿被采样。我个人习惯这样记:
- CPHA = 0:在第一个边沿采样数据
- CPHA = 1:在第二个边沿采样数据
为什么会这样?你想想看,一个时钟周期有两个边沿——上升沿和下降沿。CPHA就是告诉从设备:「兄弟,你是在第一个边沿读数据,还是第二个?」
1.3 四种工作模式(Mode 0 ~ Mode 3)
CPOL和CPHA组合起来,就得到了SPI的四种标准模式。我在项目中遇到过最常用的就是Mode 0,但有些传感器芯片偏偏要用Mode 3,这时候就得小心了。
| 模式 | CPOL | CPHA | 空闲时钟电平 | 数据采样边沿 | 数据输出边沿 |
|---|---|---|---|---|---|
| Mode 0 | 0 | 0 | 低电平 | 上升沿 | 下降沿 |
| Mode 1 | 0 | 1 | 低电平 | 下降沿 | 上升沿 |
| Mode 2 | 1 | 0 | 高电平 | 下降沿 | 上升沿 |
| Mode 3 | 1 | 1 | 高电平 | 上升沿 | 下降沿 |
核心记忆法:Mode 0和Mode 3正好相反——一个空闲低电平、上升沿采样;一个空闲高电平、上升沿采样。Mode 1和Mode 2也是对称关系。
1.4 数据采样与输出边沿
这里有个关键点:采样边沿和输出边沿总是相反的。为什么?因为主设备在某个边沿输出数据,从设备就需要在另一个边沿来采样,这样才能保证数据稳定。
我曾经调试过一个ADC芯片,死活读不到正确数据。折腾了半天,发现是CPHA配反了——从设备在下降沿采样,我却按上升沿来发送数据。嗯,这种低级错误,犯过一次就再也不会忘了。
1.5 空闲时钟电平
空闲时钟电平看似简单,但实际设计中容易出问题。我建议你注意两点:
- 电平稳定性:空闲时SCK必须保持固定电平,不能有毛刺。否则从设备可能误判为开始信号。
- 与片选信号的配合:通常片选信号拉低后,SCK才开始产生时钟。片选拉高后,SCK回到空闲电平。
个人经验:如果你不确定从设备支持哪种模式,先试试Mode 0。据统计,市面上超过70%的SPI器件默认支持Mode 0。如果不行,再试Mode 3——这两个是最常见的。
避坑指南:我曾经遇到过一款国产Flash芯片,数据手册上写的是Mode 0,实际测试发现必须用Mode 1才能正常工作。所以,别完全相信数据手册,示波器才是最好的老师。
1.6 四种模式的时序波形对比
为了让你更直观地理解,我画了一张时序对比图。这张图把四种模式的采样点和输出点都标出来了。
这张图里,红色箭头标出了每个模式的采样位置。你可以看到:Mode 0和Mode 3的采样点都在上升沿,但空闲电平不同;Mode 1和Mode 2的采样点都在下降沿,空闲电平也不同。
我的建议:设计SPI控制器时,最好把四种模式都做成可配置的。用两个寄存器位来控制CPOL和CPHA,这样你的IP核就能兼容市面上绝大多数的SPI从设备。我之前的项目就是这么做的,后来换芯片时只需要改寄存器配置,不用改RTL代码,省了不少事。
好了,SPI时序基础就讲到这里。记住一句话:CPOL管空闲电平,CPHA管采样时机。搞清楚了这两个参数,四种模式自然就通了。