QSPI硬件接口详解
咱们做嵌入式的人,对SPI都不陌生。但QSPI这玩意儿,说白了就是标准SPI的“四车道”升级版。我刚开始接触时也觉得无非是多加几根数据线,结果第一版样机死活跑不到预期速度,查到最后才发现是片选信号的处理有问题。
这一节咱们就把QSPI的硬件接口掰开揉碎,从引脚定义到片选再到时钟,把那些容易踩坑的地方全讲清楚。
引脚定义
QSPI在信号线上比标准SPI多了三条数据线。标准SPI用一条主出从入(MOSI)和一条主入从出(MISO),而QSPI把这两条线加上另外两条共四条双向数据线,同时还能切换回单线模式向下兼容。
下面是QSPI设备的典型引脚:
| 引脚名称 | 方向(Master→Slave) | 功能说明 |
|---|---|---|
| CS / nCS | Master → Slave | 片选信号,低电平有效 |
| CLK / SCLK | Master → 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模拟独占模式。
我以前有过一次血的教训:MCU上电时GPIO默认是高阻,QSPI Flash的CS引脚悬空,Flash检测到低电平就以为是有效片选,结果从芯片里读出了随机的垃圾数据,查了一整天。后来在所有CS线上加了10kΩ上拉,再没出现过。
时钟信号
时钟信号是QSPI通信的心跳。它决定了数据在哪个边沿采样,以及通信的最高速度。
QSPI的时钟模式沿用了标准SPI的那一套,通过CPOL(时钟极性)和CPHA(时钟相位)组合成四种模式。绝大多数Nor Flash和QSPI控制器都工作在模式0:CPOL=0,CPHA=0,即空闲时SCK为低电平,数据在第一个时钟边沿(上升沿)采样。
| 模式 | CPOL | CPHA | 空闲电平 | 采样边沿 |
|---|---|---|---|---|
| 0 | 0 | 0 | 低 | 上升沿 |
| 1 | 0 | 1 | 低 | 下降沿 |
| 2 | 1 | 0 | 高 | 下降沿 |
| 3 | 1 | 1 | 高 | 上升沿 |
嗯,这里要注意:你在配置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)之间的完整信号连接关系:
关键要点总结: 引脚定义上,D0~D3都是双向口,注意GPIO方向配置;片选信号要加硬上拉防止浮空;时钟模式首选模式0,高频时注意PCB走线等长和阻抗匹配。
实用小技巧: 在原理图设计阶段,我习惯在每条QSPI信号线上串联一个22Ω电阻(靠近主控端)。虽然低频时不需要,但万一需要调试高频时,这个电阻可以有效抑制过冲和振铃,而且不占地方。成本几乎为零,却能省下不少排查信号完整性的时间。