QSPI与SPI的对比分析

做嵌入式这些年,我接触过的总线少说也有十几种。但要说最基础、最常见、又最容易出坑的,还得是SPI。而QSPI,说白了就是SPI的“四车道升级版”。很多人觉得它们差不多,拿SPI那套时序去怼QSPI,结果板上调试时死活不通——光是我亲耳听到的类似案例就不下五次。所以这一章,咱们把两兄弟放一起,逐条拆开来看。

引脚与连线:SPI 4根线,QSPI至少6根

SPI标准接口只需要四根信号:SCLK、MOSI、MISO、CS。QSPI呢?它在SPI基础上把数据线扩充成了四根——IO0、IO1、IO2、IO3,再加上SCLK和CS,总共六根。当然,有些QSPI控制器也支持只接两根或三根数据线的降配模式,但那是后话了。

我在一个FPGA项目里遇到过这样的问题:硬件工程师按SPI的PCB布局画了QSPI的走线,结果IO2和IO3两根线绕了一大圈,信号延迟比IO0大了将近2ns,导致四线模式下数据采样错误。嗯,这里要注意——QSPI的四根数据线必须等长,尤其是在高频下。

参数 SPI QSPI
引脚数(最少) 4(SCLK, MOSI, MISO, CS) 6(SCLK, IO0-IO3, CS)
数据线方向 单向(MOSI/MISO独立) 双向(四根IO均可收发)
全双工支持 ✅ 原生全双工 ❌ 半双工(读写不能同时)
⚠️ 注意:QSPI的半双工特性导致它无法像标准SPI那样同时在MOSI和MISO上传送数据。如果你需要同时读写,QSPI反而更慢。一次只做一件事,这是QSPI的代价。

通信速率:QSPI用“并行”换带宽

SPI的速率上限取决于主从器件的驱动能力和PCB信号质量。常见的SPI时钟跑个几十MHz没问题,高端的能到100MHz以上。但QSPI呢?它把单根数据线上的比特率搬到了四根线上并行传输——同样100MHz时钟下,QSPI的理论吞吐是SPI的四倍。

举个例子:你要从Flash里读1MB数据。SPI在100MHz下,单线每时钟1bit,理论需要约80ms。QSPI在同样频率下,每时钟4bit,理论只需要20ms。你想想看,这个差距在启动时间敏感的场合就是“能亮屏”和“黑屏半秒”的区别。

不过,QSPI的速率提升是有前提的——它牺牲了全双工,并且对信号偏差更敏感。我曾经在一个板子上把QSPI时钟跑到120MHz,结果IO2线的眼图已经快睁不开了,后来降到80MHz才稳定。所以说,标称速率和实际速率之间,还隔着一条PCB走线的质量。

场景 SPI QSPI
单帧小数据(< 64字节) ★★★(开销低) ★★(命令+地址编码开销大)
大块连续读(如Flash读取) ★★ ★★★★★
全双工交互(传感器) ★★★★★ 不支持

时序差异:边沿对齐与数据采样

SPI的四种模式(CPOL/CPHA组合)很多人搞混。QSPI呢?它基本只工作在Mode 0或Mode 3——也就是CPHA=0或CPHA=1的其中一种,而且多数厂家默认用Mode 0。为什么?因为QSPI四线模式下,数据线变成双向,你想想看,如果还要同时处理四种模式,接收端的采样窗口会变得极其复杂。

具体到时序图上:SPI在SCLK的每个边沿采一个bit,而QSPI在SCLK每个边沿同时采四个bit。所以QSPI的时钟边沿对齐要求更高——四个数据信号必须在SCLK边沿附近保持足够稳定的建立/保持时间。我记得以前调试一个国产QSPI Flash,手册上写的建立时间只有2ns,但实际测量发现至少需要3.5ns才能稳定采到数据。嗯,这种事情最好在前期就用示波器量一下。

📐 实测小技巧:调试QSPI时序时,不要只看单根数据线的眼图,要同时看四根线的叠加眼图。用示波器的“彩色余辉”模式能看到四根线的实际采样裕量。如果最差的那根线眼图开口太小,赶紧降频或调整PCB等长。

数据传输方式:从单线到四线的演化

SPI的数据传输就是连续的单线串流,简单直接。QSPI则多了指令、地址、空转周期、数据这四个阶段,而且每个阶段使用的数据线宽度可以不同。例如读Flash的典型流程:发送指令(1线)→ 发送地址(1线或4线)→ 等待(空转周期)→ 返回数据(4线)。这个多阶段切换正是QSPI协议的复杂度所在。

我曾经遇到过一个问题:用某个MCU的QSPI控制器读Flash,数据总是不对。后来抓波形发现,指令阶段用的是四线模式,而Flash却期望指令在单线模式下发送——结果第一个字节就错了位。避免这种坑的最好办法:查阅你所用Flash的QSPI指令手册,看清楚每个阶段的数据线宽度配置。

💡 经验之谈:如果QSPI通讯时前几个字节正确、后面全乱,大概率是“数据线切换时机”没对齐——控制器在某个字节的中间时刻切换了IO方向,导致从那以后相位错位。这时你需要检查sck的空闲电平是否在切换时保持了正确极性。

避坑指南:我曾经掉过的坑

  • 坑1:QSPI Flash的“Dummy Cycle”被忽略。很多Flash在快速读指令后需要几个空时钟周期才能输出有效数据。我曾经漏加了两个dummy cycle,结果读出的一直是0xFF——这不是坏片,是时序没对齐。
  • 坑2:信号跨时钟域处理。如果QSPI控制器时钟域和系统总线时钟域不同步,FIFO深度不够就会溢出。我见过一个案例,DMA读QSPI Flash时FIFO只有4字节,CPU一响应中断就丢数据。
  • 坑3:PCB走线不等长。前面已经提过了,四根IO线如果相差超过时钟周期的5%,高速下很容易误码。我的原则是:100MHz以上时,四根数据线之间的长度差控制在1mm以内。
SPI与QSPI数据通道对比 SPI vs QSPI 数据通道对比 SPI 四线结构 SCLK —— 时钟线(单向) MOSI —— 主出从入(单向) MISO —— 主入从出(单向) CS —— 片选 QSPI 六线结构 SCLK —— 时钟线(单向) IO0(数据0)—— 双向 IO1(数据1)—— 双向 IO2(数据2)—— 双向 IO3(数据3)—— 双向 核心差异 SPI:全双工,但同一时刻只能传1bit数据。 QSPI:半双工,但同一时刻可传4bit数据 → 吞吐量提升至4倍(同频下)。

写在最后(本章小结)

SPI和QSPI不是替代关系,而是互补关系。SPI适合需要全双工、小数据量、低速稳定的场景;QSPI适合需要高吞吐、大数据块、单向传输的场景。你选哪个,取决于你的系统瓶颈是带宽还是延迟。另外,别被厂商标称的“四线模式”骗了——QSPI的速度优势只在“四线数据输出阶段”体现,指令和地址阶段它和SPI一样慢。所以实际计算吞吐量时,一定要把协议开销算进去。