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的典型套路。

曾经踩过的坑: 我刚开始以为QSPI全程都是四线,结果发现命令部分必须用单线,否则Flash不认。后来查手册才知道,命令阶段用单线是协议规定的,目的是保持兼容性。

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个时钟就传输完了。

对比SPI:标准SPI读ID需要32个时钟才能读完4字节,QSPI只用8个时钟,速度提升4倍。

我整理了一个表格,方便你对照波形看各个时间段的含义:

时间段 时钟个数 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个上升沿。

有些Flash的空周期长度不一样,比如8个时钟。这时候总时钟数就是8+8+8=24。建议先查芯片手册确认。

4.5 波形分析实操

拿到波形后,先把光标移到CS下降沿,作为时间零点。然后逐个时钟找数据。我推荐用分析仪的“光标对”功能,测量第一个时钟和最后一个时钟的时间差,算一下实际频率。

举个例子:如果测得SCK周期是40ns,那频率就是25MHz。如果SCK波形边沿不陡,说明信号质量可能有问题,查一下走线长度或驱动能力。我在一个项目里遇到过,CS毛刺导致解析错误,后来加了一个10kΩ上拉电阻才解决。

4.6 本章核心结构

QSPI读ID命令时序简图 CS SCK DQ0 1 0 0 1 1 1 1 1 Dummy (高阻) D0[0:1] D1[0:1] D2[0:1] D3[0:1] DQ1 高阻 高阻 D0[2:3] D1[2:3] D2[2:3] D3[2:3] DQ2 高阻 高阻 D0[4:5] D1[4:5] D2[4:5] D3[4:5] DQ3 高阻 高阻 D0[6:7] D1[6:7] D2[6:7] D3[6:7] 命令字节 (0x9F) 空周期 (Dummy) 数据输出 (4字节) 数据阶段每2个时钟输出1字节(4线各2位),共8个时钟完成4字节

这张图里我做了抽象:命令阶段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的威力在数据阶段才体现。如果你看到的波形数据阶段也只有DQ0有信号,那八成是模式设置错了。

好,这一帧抓完之后,你应该能清晰分辨QSPI的三个阶段了。接下来多抓几次不同命令,对比波形差异,经验自然就有了。嗯,我自己也是从这种最简单的波形开始,一步一步啃下来的。