4、抓取第一个QSPI帧
好,到这一步,我们终于要动手了。前面聊了那么多理论,说实话,不亲手抓一次波形,心里总是没底。这一节我们就来捕获一次最简单的QSPI读ID命令,看看CS、SCK和四根数据线到底是怎么跳的。
4.1 准备环境
我用的逻辑分析仪是24MHz采样率、8通道的。你手头的只要是8通道以上都行,采样率建议至少是SCK频率的4倍。QSPI时钟一般跑几十兆,24MHz勉强够,但我个人习惯用50MHz以上,波形边沿看得更清楚。
通道分配是这样:
- CH0 → CS(片选,低电平有效)
- CH1 → SCK(时钟)
- CH2 → DQ0(数据线0)
- CH3 → DQ1(数据线1)
- CH4 → DQ2(数据线2)
- CH5 → DQ3(数据线3)
- CH6、CH7 空着,备用
我这里被测设备是一颗常见的QSPI Flash,命令格式和JEDEC标准一致。读ID指令是0x9F,在QSPI模式下,命令字节还是通过单线(DQ0)发送,后面空周期(Dummy)也是单线,但数据返回时四根线一起用。嗯,这里第一次接触可能会晕,你想想看:命令阶段只有1根线,数据阶段4根线,这是QSPI的典型套路。
4.2 触发设置
要捕获第一帧,触发条件很关键。我通常选CS下降沿作为触发。把逻辑分析仪的触发源设为CH0,触发类型选“下降沿”。为什么?因为CS拉低代表一次传输的开始,这个信号最干净,不容易误触发。
采样深度建议设大一点,比如1M样本,这样能保证看到完整的命令+空周期+数据。要是采样深度太小,数据读到一半就截断了,又要重新抓。
4.3 开始捕获
按下捕获按钮,然后让主控发送读ID命令。如果你用的是现成的开发板,通常是调用库函数就能触发。我自己的习惯是在代码里加一个延时,好让分析仪有时间准备。比如先延时100ms再发命令,这样捕获窗口能对准。
// 伪代码示意
delay_ms(100);
spi_qspi_send_command(0x9F, 8); // 发送命令字节
spi_qspi_send_dummy(4); // 4个空周期(有些芯片是8个)
spi_qspi_read_data(buffer, 4); // 读取4字节的ID数据
你看,代码里命令是8位,空周期4个时钟,数据4字节(32位)。这组参数是标准JEDEC读ID的典型值。不同芯片可能略有差异,但大同小异。
4.4 观察波形
捕获成功后,分析仪界面应该能看到一段波形。我们逐个信号来分析。
4.4.1 CS(片选)
CS从高电平跳变到低电平,这就是帧的开始。在整个传输过程中CS保持低,直到所有数据读完后才拉高。
4.4.2 SCK(时钟)
SCK是一串连续的方波。每个时钟周期采集一次数据。注意看:第一个字节(命令)期间,每个时钟只从DQ0上读1位,所以8个时钟共8位。
4.4.3 DQ0~DQ3(数据线)
重点来了。命令阶段:DQ0上依次出现1 0 0 1 1 1 1 1,也就是0x9F。DQ1、DQ2、DQ3在这个阶段保持高阻或固定电平(看芯片设计)。
空周期阶段:时钟继续跑,但DQ0上可能是高阻或固定电平,芯片内部在准备数据。
数据阶段:从第N个时钟开始(取决于空周期个数),四根数据线同时输出。比如第一字节数据高两位从DQ3、DQ2、DQ1、DQ0同时输出……其实就是每个时钟输出4位,这样4字节数据只需要8个时钟就传输完了。
我整理了一个表格,方便你对照波形看各个时间段的含义:
| 时间段 | 时钟个数 | DQ0状态 | DQ1~DQ3状态 | 数据流向 |
|---|---|---|---|---|
| 命令字节 | 8 | 输出0x9F(MSB first) | 高阻/忽略 | 主机→从机 |
| 空周期 | 4 | 高阻/不定 | 高阻 | 等待 |
| 数据字节1 | 2 | 输出第1-2位 | 输出第3-8位 | 从机→主机 |
| 数据字节2 | 2 | 输出第9-10位 | 输出第11-16位 | 从机→主机 |
| 数据字节3 | 2 | 输出第17-18位 | 输出第19-24位 | 从机→主机 |
| 数据字节4 | 2 | 输出第25-26位 | 输出第27-32位 | 从机→主机 |
注意,数据阶段每个字节只占2个时钟,因为四线同时传输。4字节共8个时钟。加上命令8时钟和空周期4时钟,总共20个时钟。你数一下波形里的SCK个数,应该是20个上升沿。
4.5 波形分析实操
拿到波形后,先把光标移到CS下降沿,作为时间零点。然后逐个时钟找数据。我推荐用分析仪的“光标对”功能,测量第一个时钟和最后一个时钟的时间差,算一下实际频率。
举个例子:如果测得SCK周期是40ns,那频率就是25MHz。如果SCK波形边沿不陡,说明信号质量可能有问题,查一下走线长度或驱动能力。我在一个项目里遇到过,CS毛刺导致解析错误,后来加了一个10kΩ上拉电阻才解决。
4.6 本章核心结构
这张图里我做了抽象:命令阶段8个时钟,DQ0上依次输出0x9F的二进制位;空周期4个时钟,所有数据线高阻;数据阶段8个时钟,四线同时输出,共还原出4字节ID。你对照自己的波形,应该能一眼找到这些特征。
4.7 常见问题与排查
- CS拉低后没有时钟? 检查主控QSPI初始化是否成功,或者示波器看看SCK引脚是否有信号。
- DQ0命令阶段波形乱跳? 可能是电平不匹配(3.3V vs 1.8V)或者探头的接地没接好。
- 数据阶段DQ1~DQ3始终为低? 说明芯片可能工作在单线SPI模式,QSPI模式未正确开启。需要在发送读ID前发送“使能QSPI模式”的命令。
好,这一帧抓完之后,你应该能清晰分辨QSPI的三个阶段了。接下来多抓几次不同命令,对比波形差异,经验自然就有了。嗯,我自己也是从这种最简单的波形开始,一步一步啃下来的。