3. QSPI 接口协议详解:四线 / 双线 / 单线模式,时钟极性与相位

讲 QSPI 之前,得先把它和传统 SPI 的关系说清楚。说白了,QSPI 就是 SPI 的“加宽车道”版本。标准 SPI 一次只能走 1 bit 数据,QSPI 可以同时走 4 bit。但协议底层用的还是同样的时钟、同样的极性和相位规则。我个人习惯把 QSPI 看成 SPI 的「数据总线扩展」——线多了,但控制逻辑没变。

3.1 单线模式(标准 SPI)

单线模式就是我们最熟悉的 SPI:SCK(时钟)、MOSI(主出从入)、MISO(主入从出),再加一个片选 CS。数据在 SCK 的某个边沿被采样,另一个边沿变化。在 QSPI 控制器里,单线模式只占用两根数据线(IO0、IO1),跟普通 SPI 一模一样。很多 Flash 上电默认就是单线模式,需要发命令才能切换到双线或四线。

我在项目里遇到过,有些新手直接拿 QSPI Flash 当普通 SPI 用,结果发现读取速度还不如普通 SPI 快——因为控制器配置不一致。实际上 QSPI 的单线模式跟标准 SPI 完全兼容,只要把 IO2、IO3 拉高或拉低就行。

3.2 双线模式(Dual SPI)

双线模式把 MOSI 和 MISO 合并成两条双向数据线:IO0 和 IO1。发送地址或命令时可能还是单线,但传输数据时两条线同时工作,一次传输 2 bit。速度直接翻倍。Flash 里常用的 Read Dual Output(0x3B)命令就是这个模式。

我曾经调试过一个项目,在读取大块图片数据时,双线模式让传输时间从 2.3ms 降到了 1.2ms。代价就是 Flash 必须支持 Dual 模式,而且初始化时要多发一个配置命令。

3.3 四线模式(Quad SPI)

四线模式才是 QSPI 的真正核心。它使用 IO0~IO3 四条数据线,一次传输 4 bit。注意,这四条线都是双向的。命令阶段通常还是用单线(或者也可以用四线发命令,取决于 Flash 是否支持 QPI 模式,那是另一个故事了)。数据阶段四条线同时喷数据,理想状态下读取速度是单线的 4 倍。

很多 XIP 场景下,Flash 默认切换到 Quad Output(0x6B)或 Quad I/O(0xEB)命令,配合高时钟频率(100MHz+),读取带宽可以超过 400Mbps。但要注意:四线模式对 PCB 布线要求更高,四条数据线长度差不能太大,否则信号歪斜会吃掉时序裕量。

模式数据线数量每时钟传输 bit 数典型命令我常用的场景
单线 (Standard SPI)110x03 (Read)只读配置、小量数据
双线 (Dual SPI)220x3B (Read Dual Output)中等带宽需求,如 LCD 刷图
四线 (Quad SPI)440xEB (Read Quad I/O)XIP 执行代码,大块数据搬运
我的小习惯:初始化时先读 Flash 的 ID 和状态寄存器,确认它支持哪些模式。有些老款 Flash 只认 0x03 单线读,强行切 Quad 会直接挂掉。

3.4 时钟极性与相位(CPOL 和 CPHA)

这一个知识点要是搞错了,你读回来的数据全是 0,或者全是 0xFF。我刚开始做 QSPI 驱动时就被坑过一次——调了一下午,最后发现是时钟极性配反了。

时钟极性(CPOL)决定时钟空闲电平:

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

时钟相位(CPHA)决定数据在哪个边沿被采样:

  • CPHA = 0:数据在第一个边沿被采样(即 SCK 从空闲到有效电平的边沿)
  • CPHA = 1:数据在第二个边沿被采样(即 SCK 回到空闲电平的边沿)

组合起来就是四种模式,大多数 QSPI Flash 默认工作在 模式 0(CPOL=0, CPHA=0)或 模式 3(CPOL=1, CPHA=1)。嗯,这里要注意:QSPI 控制器的时钟模式必须和 Flash 侧完全一致,否则时序对不上。

QSPI 时钟极性 / 相位四种模式时序图 模式 0 : CPOL=0, CPHA=0 ▲ 采样 ▲ 采样 空闲低,上升沿采数据 模式 1 : CPOL=0, CPHA=1 ▼ 采样 ▼ 采样 空闲低,下降沿采数据 模式 2 : CPOL=1, CPHA=0 ▼ 采样 ▼ 采样 空闲高,下降沿采数据 模式 3 : CPOL=1, CPHA=1 ▲ 采样 ▲ 采样 空闲高,上升沿采数据
避坑指南:我曾经在更换 Flash 型号后忘记调整时钟模式,芯片一直读 0xFF。查了两天才发现新 Flash 默认是模式 3,而旧项目代码配的是模式 0。记着:每次换 Flash 或者换 MCU 平台,必须先确认双方 CPOL/CPHA 一致。

为什么大多数 Flash 默认用模式 0 或模式 3?因为这两个模式都在时钟的上升沿采样数据,MCU 的主频高时更容易满足建立时间。模式 0 和模式 3 的区别只是空闲电平,但实际波形完全对称。我个人建议:如果 MCU 和 Flash 都支持,统一用模式 3——因为很多控制器在模式 3 下 IO 时序的保持时间更宽松。

你想想看,QSPI 的四条数据线同时在时钟边沿采样,任何一根线如果因为 PCB 走线长度差导致 1~2ns 的歪斜,都可能造成误码。所以硬件上除了配对时钟模式,还要尽量等长布线。如果实在凑不齐等长,就在初始化时把时钟频率降一档,用时间换稳定。