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的速率上限取决于主从器件的驱动能力和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才能稳定采到数据。嗯,这种事情最好在前期就用示波器量一下。
数据传输方式:从单线到四线的演化
SPI的数据传输就是连续的单线串流,简单直接。QSPI则多了指令、地址、空转周期、数据这四个阶段,而且每个阶段使用的数据线宽度可以不同。例如读Flash的典型流程:发送指令(1线)→ 发送地址(1线或4线)→ 等待(空转周期)→ 返回数据(4线)。这个多阶段切换正是QSPI协议的复杂度所在。
我曾经遇到过一个问题:用某个MCU的QSPI控制器读Flash,数据总是不对。后来抓波形发现,指令阶段用的是四线模式,而Flash却期望指令在单线模式下发送——结果第一个字节就错了位。避免这种坑的最好办法:查阅你所用Flash的QSPI指令手册,看清楚每个阶段的数据线宽度配置。
避坑指南:我曾经掉过的坑
- 坑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适合需要全双工、小数据量、低速稳定的场景;QSPI适合需要高吞吐、大数据块、单向传输的场景。你选哪个,取决于你的系统瓶颈是带宽还是延迟。另外,别被厂商标称的“四线模式”骗了——QSPI的速度优势只在“四线数据输出阶段”体现,指令和地址阶段它和SPI一样慢。所以实际计算吞吐量时,一定要把协议开销算进去。