QSPI硬件接口详解

咱们做嵌入式的人,对SPI都不陌生。但QSPI这玩意儿,说白了就是标准SPI的“四车道”升级版。我刚开始接触时也觉得无非是多加几根数据线,结果第一版样机死活跑不到预期速度,查到最后才发现是片选信号的处理有问题。

这一节咱们就把QSPI的硬件接口掰开揉碎,从引脚定义到片选再到时钟,把那些容易踩坑的地方全讲清楚。

引脚定义

QSPI在信号线上比标准SPI多了三条数据线。标准SPI用一条主出从入(MOSI)和一条主入从出(MISO),而QSPI把这两条线加上另外两条共四条双向数据线,同时还能切换回单线模式向下兼容。

下面是QSPI设备的典型引脚:

引脚名称方向(Master→Slave)功能说明
CS / nCSMaster → Slave片选信号,低电平有效
CLK / SCLKMaster → Slave时钟信号,提供数据传输节拍
D0 / I/O0双向数据线0,在标准SPI模式下作为MOSI
D1 / I/O1双向数据线1,在标准SPI模式下作为MISO
D2 / I/O2双向数据线2,在QSPI扩展模式使用
D3 / I/O3双向数据线3,在QSPI扩展模式使用

你想想看,多了两对数据线,理论上数据传输吞吐量就是标准SPI的四倍。但代价就是PCB布线变得麻烦——四根数据线加时钟再加片选,一共六根信号,做等长处理时简直让人头大。我个人习惯是先把时钟线和片选线布好,再集中处理数据线组,这样能减少后续调整的返工量。

这里有个重要的区别大家要记住:标准SPI的MISO/MOSI是单向的,而QSPI的I/O线全是双向。这意味着你的MCU的GPIO必须配置成开漏或推挽加上方向切换逻辑。我在项目中遇到过有人直接用普通推挽输出连D2/D3,结果读数据时把Slave的输出怼死了,烧了两片Flash才反应过来。

片选信号

片选(CS)是QSPI通信的“门禁”。它低有效时,Slave芯片才会响应主机的操作。高电平时Slave进入高阻状态,数据线释放为三态。

实际项目中片选信号最容易出问题的地方有两个:

  • 信号毛刺:片选线太长或者驱动能力不足时,容易在高低切换时出现多次跳变。我曾经在一片国产Nor Flash上遇到过,每次发指令前CS都有几个纳秒的毛刺,导致Flash误以为收到了两次片选,直接跳过命令头。
  • 多器件共享总线:QSPI只能一主一从,不能像标准SPI那样挂多个Slave共用数据线。你千万别想着给三个Flash分别接CS然后把数据线并联——相信我,那样会互相干扰到怀疑人生。如果需要多个QSPI设备,老老实实每个分配独立的QSPI控制器或者用片选加GPIO模拟独占模式。
警告: 片选信号在进入Slave芯片之前,一定要加一个足够的上拉电阻(典型值4.7kΩ~10kΩ)。否则MCU未初始化时片选引脚会处于高阻,浮空的CS极大概率导致Slave误进入命令模式,上电就乱发数据。

我以前有过一次血的教训:MCU上电时GPIO默认是高阻,QSPI Flash的CS引脚悬空,Flash检测到低电平就以为是有效片选,结果从芯片里读出了随机的垃圾数据,查了一整天。后来在所有CS线上加了10kΩ上拉,再没出现过。

时钟信号

时钟信号是QSPI通信的心跳。它决定了数据在哪个边沿采样,以及通信的最高速度。

QSPI的时钟模式沿用了标准SPI的那一套,通过CPOL(时钟极性)和CPHA(时钟相位)组合成四种模式。绝大多数Nor Flash和QSPI控制器都工作在模式0:CPOL=0,CPHA=0,即空闲时SCK为低电平,数据在第一个时钟边沿(上升沿)采样。

模式CPOLCPHA空闲电平采样边沿
000低上升沿
101低下降沿
210高下降沿
311高上升沿

嗯,这里要注意:你在配置MCU的QSPI控制器时,必须和Slave芯片手册里的时序图仔细核对。我见过有人在ST的HAL库里默认用了模式3,结果连上W25Q64怎么都读不到ID,换了模式0就好了。

时钟频率方面,QSPI可以跑到很高,普通的Nor Flash支持80MHz甚至166MHz。但高频信号对PCB走线要求就上来了。我建议时钟线的长度尽量控制在5厘米以内,并且和其他数据线做等长,差分走法虽然没必要,但包地处理是必须的。跑40MHz以下可以凑合,超过80MHz时每条数据线的长度偏差不要超过0.5英寸,否则时延偏差会导致数据采样错误。

另外,部分QSPI控制器支持DDR模式(双倍数据速率),时钟的上升沿和下降沿都采样数据。这时候时钟信号的质量就至关重要了——抖动必须控制在几百皮秒以内。我记得一次调试时,CPU的QSPI时钟输出波形有过冲,DDR模式下每两个字节就错一个,后来在时钟脚串了个22Ω电阻才搞定。

下面这张图展示了主控(Master)与Flash(Slave)之间的完整信号连接关系:

QSPI硬件接口信号连接图 QSPI 主控 ↔ Flash 信号连接 主控 Master (MCU / SoC) CS CLK D0 (I/O0) D1 (I/O1) D2 (I/O2) D3 (I/O3) Slave Flash (Nor Flash) nCS CLK I/O0 I/O1 I/O2 I/O3 nCS SCLK D0 (双向) D1 (双向) D2 (双向) D3 (双向) 时钟与数据线需做等长处理,片选加4.7kΩ~10kΩ上拉

关键要点总结: 引脚定义上,D0~D3都是双向口,注意GPIO方向配置;片选信号要加硬上拉防止浮空;时钟模式首选模式0,高频时注意PCB走线等长和阻抗匹配。

实用小技巧: 在原理图设计阶段,我习惯在每条QSPI信号线上串联一个22Ω电阻(靠近主控端)。虽然低频时不需要,但万一需要调试高频时,这个电阻可以有效抑制过冲和振铃,而且不占地方。成本几乎为零,却能省下不少排查信号完整性的时间。