QSPI 的四种模式(CPOL, CPHA)

做 QSPI 通信,绕不开的两个参数:CPOL(时钟极性)和 CPHA(时钟相位)。

说白了,它们决定了时钟线空闲时是什么电平,以及数据在哪个边沿被采样。为什么重要?我见过太多人在这上面栽跟头——明明波形看起来都对,就是读不出正确数据,最后发现主从设备模式没对上。

CPOL 和 CPHA 到底在定义什么?

你想想看,时钟线 SCK 在没传输数据的时候(片选 CS 无效期间),总要维持一个固定电平。CPOL 就是管这个的:

  • CPOL = 0:空闲时 SCK 为低电平
  • CPOL = 1:空闲时 SCK 为高电平

那 CPHA 呢?它决定了数据采样发生在时钟的第一个跳变沿还是第二个跳变沿:

  • CPHA = 0:在第一个边沿采样
  • CPHA = 1:在第二个边沿采样

这两个参数组合起来,正好就是 4 种模式。嗯,这里要注意:第一个边沿指的是从空闲状态开始的第一个跳变。CPOL=0 时空闲是低,第一个边沿就是上升沿;CPOL=1 时空闲是高,第一个边沿就是下降沿。

核心记忆口诀:“CPOL 定空闲,CPHA 定第几沿。CPHA=0 采第一个沿,CPHA=1 采第二个沿。”

四种模式速查表

下面这个表我建议你直接截图存下来,调试的时候对着看,能省不少时间。

模式 CPOL CPHA 空闲电平 采样边沿 数据输出边沿
模式 0 0 0 低 上升沿(第一个) 下降沿
模式 1 0 1 低 下降沿(第二个) 上升沿
模式 2 1 0 高 下降沿(第一个) 上升沿
模式 3 1 1 高 上升沿(第二个) 下降沿

时序波形对比——一张图看懂

文字描述总是不够直观。下面这张 SVG 图把四种模式的时钟波形和数据采样点画在一起,你可以对照着看:

QSPI 四种模式时序波形对比图 QSPI 四种模式时序波形对比 模式 0 CPOL=0, CPHA=0 采样 模式 1 CPOL=0, CPHA=1 采样 模式 2 CPOL=1, CPHA=0 采样 模式 3 CPOL=1, CPHA=1 采样 ▬ SCK 时钟线 - - - 数据线 MOSI/MISO ▲ 采样点 注意:模式0和模式3的采样沿都是上升沿,但它们空闲电平不同。 模式1和模式2的采样沿都是下降沿,同样空闲电平相反。

个人经验:我在调试一块 QSPI Flash 时,手册里写的是模式 3,但我把主控配成了模式 0。波形显示时钟完全反相,数据线也错位了一个边沿。后来用示波器仔细比对采样点,才找到原因——说白了就是 CPOL 配反了,导致采样时刻正好落在数据跳变上。

实际项目怎么选模式?

你手上拿到的 QSPI 器件(Flash、ADC、传感器等),数据手册里一定会写明支持的 SPI 模式。有时候它会写“支持模式 0 和模式 3”,有时候只写“CPOL=0, CPHA=0”。

我的习惯是:先看从设备手册的时序图,确认空闲电平是低还是高,然后看数据被采样的边沿。如果手册上没给模式编号,你就按 CPOL/CPHA 去配,错不了。

为什么我强调要先看从设备?因为很多主流 QSPI Flash(比如 Winbond、Macronix)默认工作在模式 0 或模式 3,而有的 MCU 默认是模式 0。如果不统一,通信直接失败。

避坑指南——我曾经踩过的坑

  • 主从模式必须一致:主控和从设备必须工作在同一个模式下。我曾经天真地以为“只要边沿对上就行”,结果数据少了一位。后来发现 CPHA 不一致会导致数据移位一个时钟周期。
  • 不要只看名字:有的芯片手册把模式写成“SPI mode 0”但实际时序图显示空闲高——那可能是手册写错了。请以时序图为准。
  • 四线 QSPI 的采样沿和单线一样:QSPI 只是把数据线从 1 根变成 4 根(或者更多),但时钟极性和相位的定义完全沿用标准 SPI。别被“Quad”吓到,模式配置是一样的。
  • 高速时注意建立/保持时间:模式本身不会导致时序问题,但高速下采样沿必须避开数据跳变区。有些器件在模式 0 下要求数据在上升沿之前稳定,你如果配成了模式 1,采样沿刚好是数据跳变,那就白忙了。

警告:不要在初始化代码中随便改 CPOL/CPHA。一定先确认从设备的时序要求,再编程。改错后波形看起来可能“差不多”,但数据正确率会急剧下降。我曾经调试一块 QSPI Nor Flash,读 ID 有时对有时错,最后发现是温度变化导致时钟边沿漂移,但根本原因是模式配错了半个周期。

小结

四种模式其实不难记。你只要抓住两个关键点:

  1. 空闲电平看 CPOL
  2. 采样边沿看 CPHA

然后把它们组合起来,就是完整的模式定义。实际项目中,我遇到最多的是模式 0 和模式 3,因为很多 MCU 默认模式 0,而大部分 Flash 支持模式 0 或模式 3。当你发现通信不稳定时,先用示波器抓一下 SCK 和数据线,对照上面那张图确认采样点位置。嗯,这一步能解决 80% 的问题。