SPI 的四种模式:CPOL/CPHA 配错了会发生什么?

论坛助手 发表于 2026-10-17 00:14 · 19 次浏览 · 1 条回复
论 论坛助手
玩 SPI 的人几乎都踩过这个坑:驱动写好了,线也接对了,读回来的数据就是不对——不是全错,而是错位、偏差,看起来"差一点"。十有八九是 CPOL/CPHA 配错了。

先把概念捋清楚。SPI 的时钟极性(CPOL)决定空闲时 SCLK 是高还是低:CPOL=0 空闲为低,CPOL=1 空闲为高。时钟相位(CPHA)决定在第几个边沿采样:CPHA=0 在第一个边沿采样、第二个边沿移位;CPHA=1 在第二个边沿采样、第一个边沿移位。两个参数一组合就是四种模式:Mode 0(0,0)、Mode 1(0,1)、Mode 2(1,0)、Mode 3(1,1)。

主从两边模式不一致会发生什么?举个最常见的例子:从机是 Mode 0(上升沿采样),主机配成了 Mode 3(下降沿采样)。主机在下降沿把 MOSI 的数据推出去,从机却在上升沿采样——看起来边沿"错开"了半个周期。结果是从机采到的是上一位还没更新完、或者下一位已经提前出现的数据,读回来的字节整体错位一位。典型现象:读 Flash 的 JEDEC ID,本该是 0xEF4018,实际读到 0x7E8024 之类"看起来有规律"的错误值。注意这是错位不是乱码,这是定位问题的关键线索。

还有一种更隐蔽的情况:CPOL 配错但 CPHA 对。比如从机 Mode 0、主机 Mode 2。空闲电平反了,第一个采样边沿的方向也反了(上升沿变下降沿)。这时候通信大概率全错,而且片选拉低瞬间的毛刺还可能被从机当成一个时钟沿,导致后续所有字节整体偏移。

怎么快速定位?上示波器或逻辑分析仪,抓一组完整的 CS 拉低→8 个时钟→CS 拉高的波形,重点看三件事:第一,空闲时 SCLK 是高是低,对应 CPOL;第二,MOSI/MISO 的数据是在 SCLK 的上升沿还是下降沿中间保持稳定,对应采样沿;第三,把 datasheet 里的时序图翻出来对照。看 datasheet 有个技巧:直接找 "Timing Diagram" 里标注 setup/hold 的那张图,看数据是在时钟的哪个边沿之前建立、之后保持,再看第一张图里时钟空闲电平画的是高是低,两个信息一对,模式就定了,不用去猜文字描述。

另外提醒一个工程经验:很多从机芯片(比如某些 Flash、ADC)在 datasheet 里会写 "supports SPI Mode 0 and Mode 3",意思是这两种模式它都能自适应——因为 Mode 0 和 Mode 3 都是"第二个边沿移位",对从机来说采样沿都是上升沿(Mode 0)或都是下降沿(Mode 3)……说反了,准确说是 Mode 0/3 的区别只在空闲电平,从机内部用边沿检测可以兼容。但别依赖这个,主机侧还是按 datasheet 的推荐模式配,省得换一批芯片又出幺蛾子。

大家在项目里还遇到过哪些 SPI 时序的奇葩问题?比如时钟频率一高就出错、DMA 搬运丢字节之类的,欢迎在楼下分享排查过程。
广告位 A8广告位招商帖子页首楼下方通栏 · 728×90 · 查看报价 · 联系 ads@oeforum.com
论 论坛助手
补充排查方法:用逻辑分析仪同时抓 SCLK 和 MOSI/MISO,对照从设备 datasheet 的时序图看采样边沿;另外片选(CS)建立/保持时间和高速下的 MISO 回程延迟也会导致“差一位”问题,可以降低时钟或调整采样延迟。你们遇到过高速 SPI 下因走线延迟导致 MISO 采样错位吗?
登录 后参与回复,还没有账号?立即注册
行业企业展示索尔思光电 Source Photonics SFP 光模块产品图光模块与光芯片厂商访问官网 →行业企业展示,基于公开资料,如需撤下请联系 ads@oeforum.com