读 SPI NAND 时,一个很容易混淆的问题是:为什么手册说下降沿输出数据,而主控又在上升沿采样?
这里涉及两个不同的动作:发送端更新输出,接收端采样锁存。对于本文讨论的常见 SDR、Mode 0 / Mode 3 读数据阶段,NAND 在下降沿触发输出更新,主控通常在随后的上升沿采样。tCLQV 描述下降沿到新数据有效之间的延迟。
本文使用 Etron EM73D044VCS-H 手册中的参数作为示例,并明确标出计算假设。配图是重新绘制的教学示意,不是示波器实测波形。具体芯片、控制器和 DDR / DTR 模式,应查对应手册。
1. 谁提供时钟,谁输出数据,谁采样?
先分清信号的方向。以标准单线 SPI 为例:1
| 信号 | 方向 | 作用 |
|---|---|---|
| SCLK | 主控 → NAND | 提供传输节拍 |
| CS# | 主控 → NAND | 选中芯片,界定命令事务 |
| MOSI / SI | 主控 → NAND | 发送命令、地址或写入数据 |
| MISO / SO | NAND → 主控 | 返回读数据或状态 |
图 1:本文聚焦读数据阶段。Quad 读会并行使用多根 IO,每根都要满足相应时序要求。可打开原图放大查看。
“输出更新”指发送端把下一位数据送到引脚;“采样”指接收端在一个选定时刻读取引脚,并将电平锁存下来。
| 阶段 | 发送端 | 接收端 | 常见 Mode 0 / 3 的边沿关系 |
|---|---|---|---|
| 发送命令、地址 | 主控 | NAND | 主控在下降沿更新,NAND 在上升沿锁存;传输首位需按模式提前准备 |
| 读取数据 | NAND | 主控 | NAND 在下降沿触发输出更新,主控通常在随后上升沿采样 |
使用硬件 SPI时,软件配置模式、频率、传输长度并提交数据;控制器内部的分频器、移位逻辑和接收逻辑负责生成与执行时序。CPU 通常无需为每个 bit 手动翻转时钟。
2. tCLQV 到底表示哪一段时间?
常见符号是 tCLQV,英文为 Clock Low to Output Valid。可以按 CL → QV 来理解:从时钟下降沿,到输出数据有效。若看到 tQLCV,先核对字母顺序和该手册的参数说明。2
两个参数一起看,会更清楚:
| 参数 | 说明 | 如何使用 |
|---|---|---|
tCLQV(max) |
下降沿后,新数据最迟多久有效 | 判断采样是否太早 |
tCLQX(min) |
下降沿后,旧数据至少保持多久 | 配合下一次下降沿,确定本拍数据最早可能失效的时刻 |
本文参考颗粒规定 tCLQV(max)=7 ns、tCLQX(min)=2 ns,对应温度 −40~85 ℃、VCC 2.7~3.6 V、负载 30 pF。这不是所有 SPI NAND 的通用数值。
2.1 放大 50 MHz 的一拍读数据
假设时钟为 50 MHz、占空比 50%,周期就是 20 ns。以下把读数据阶段某次下降沿记作 0 ns,暂时忽略走线延迟。
图 2:按规格保证边界绘制,而不是假定每次实际延迟都恰好为 7 ns。可打开原图放大查看。
| 时刻 | 发生什么 | 如何理解 |
|---|---|---|
| 0 ns | SCLK 下降沿 | NAND 开始响应这次输出更新 |
| 0~2 ns | 旧数据仍有保持保证 | 不能立刻把引脚电平当作新数据 |
| 2~7 ns | 规格不保证属于旧数据还是新数据 | 是有效性不确定区,并非电平必须一直跳变 |
| 最迟 7 ns | 本拍新数据有效 | 实际延迟可以小于 7 ns |
| 10 ns | 随后上升沿,主控采样 | 相对最晚有效时刻还有 3 ns,仍需扣除主控建立时间等预算 |
| 20 ns | 下一次下降沿 | 开始更新下一拍,本拍数据仍有最小保持保证 |
| 22 ns | 本拍的保证有效区到达右边界 | 之后不再保证仍是本拍数据 |
不确定区不等于持续翻转。 如果相邻两拍都是 1,引脚甚至可能没有明显跳变,时序约束仍然存在。
2.2 采样前后都需要数据稳定
主控的接收器还有两个要求:
- 建立时间
tSU,RX:采样前,数据需要已经稳定多久。 - 保持时间
tH,RX:采样后,数据还需要继续稳定多久。
所以“数据刚好在采样时刻变有效”通常仍不够。真正应寻找的是:能够容纳建立时间和保持时间的采样窗口。
3. 为什么选择下降沿更新?能在上升沿采样吗?
可以,在 Mode 0 / 3 中,上升沿正是通常的采样边沿。
将更新与采样安排在不同边沿,是为了给数据传播和稳定留时间。若发送端刚在某个边沿触发更新,接收端就在同一时刻采样,新数据可能尚未到达,读到的仍可能是上一拍。
3.1 CPOL 和 CPHA 分别管什么?
- CPOL:时钟空闲时是高电平还是低电平。
- CPHA:在第一个边沿还是第二个边沿采样。
两个配置组合成四种模式:3
| 模式 | CPOL | CPHA | 空闲电平 | 更新输出 | 采样输入 |
|---|---|---|---|---|---|
| Mode 0 | 0 | 0 | 低 | 下降沿* | 上升沿 |
| Mode 1 | 0 | 1 | 低 | 上升沿 | 下降沿 |
| Mode 2 | 1 | 0 | 高 | 上升沿* | 下降沿 |
| Mode 3 | 1 | 1 | 高 | 下降沿 | 上升沿 |
* CPHA=0 时,传输首位必须在第一个采样边沿前准备好。图 2 放大的是已有时钟运行的读数据阶段,不是 CS# 刚拉低时的第一个边沿。
图 3:Mode 0 和 Mode 3 都在上升沿采样,但传输起点不同;此图暂不展开电气传播延迟。可打开原图放大查看。
3.2 能交换两个边沿的职责吗?
“上升沿更新、下降沿采样”在 SPI 中也存在,对应 Mode 1 / 2。但必须主控与 NAND 双方都支持。
例如本文参考颗粒支持 Mode 0 / 3。仅把主控的 CPHA 改掉,不会改变 NAND 支持的模式。通信双方若没有遵循同一套时序约定,就可能读取错误。
4. 把一拍时序放回完整的 NAND 读操作
常见缓存读取流程分为三步:发起内部页读、等待就绪、通过 SPI 读取 Cache。下图用参考颗粒的命令举例:2
图 4:流程段不按实际时间比例;轮询可重复多次,各命令事务的 CS# 边界按手册处理。可打开原图放大查看。
- Page Read,13h:提交行地址,让芯片把目标页从存储阵列读入 Cache。
- Get Feature,0Fh:读取状态,等待内部操作结束,并按手册检查相关状态。
- Read Cache,0Bh:提交列地址和规定的 Dummy,再读取缓存数据。
示例颗粒的 0Bh 命令后跟 16-bit 列地址和一个 Dummy byte,再输出数据;其他芯片、指令或模式可能不同。
4.1 tR、Dummy 与 tCLQV 不能混为一谈
| 概念 | 约束哪个阶段 | 常见单位 |
|---|---|---|
tR |
芯片内部把一页从阵列读到 Cache | µs |
| Dummy cycles | 读命令规定的、有效数据开始前的等待时钟 | 周期数 |
tCLQV |
数据输出期间,每拍下降沿到新数据有效 | ns |
增加前导 Dummy 并不会自动扩大后续每一拍的采样窗口。 如果每一拍都因频率太高而采样过早,应检查数据阶段的时钟频率和采样位置。
5. 为什么 50 MHz 正常,100 MHz 可能读错?
50% 占空比下,50 MHz 的半周期是 10 ns,100 MHz 的半周期只有 5 ns。若 tCLQV(max)=7 ns,100 MHz 的默认上升沿可能早于新数据有效。
这说明这个采样位置无法覆盖最坏情况,并不等于 NAND 本身的最大频率只能到约 71 MHz。
5.1 用一个简化模型算清楚
以下以本拍下降沿为 0,忽略走线延迟、时钟偏斜和抖动:
| 量 | 计算方式 |
|---|---|
周期 T,单位 ns |
T = 1000 / f(MHz) |
| 采样时刻 | t_sample = T / 2 + δ |
| 最早允许采样 | tCLQV(max) + tSU,RX |
| 最晚允许采样 | T + tCLQX(min) − tH,RX |
δ 是相对随后上升沿的采样延后。采样时刻应落在上述两个边界之间;实际设计还需留出额外裕量。
tSU,RX、tH,RX是主控接收器的要求。NAND 手册中的输入建立、保持时间,例如tDVCH、tCHDX,约束的是 NAND 接收命令或写数据,不能直接拿来当作主控读数据的要求。
5.2 三个采样场景放在一起比较
取 tCLQV(max)=7 ns、tCLQX(min)=2 ns,并假设主控建立时间为 1 ns、保持时间为 0.5 ns:
图 5:三行使用相同时间比例。深绿色条是已经扣除主控建立、保持要求的可采样区间。可打开原图放大查看。
| 场景 | 周期 T | 采样时刻 | 允许采样区间 | 结论 |
|---|---|---|---|---|
| 50 MHz,默认上升沿 | 20 ns | 10 ns | 8~21.5 ns | 落在窗口内,最小剩余裕量 2 ns |
| 100 MHz,默认上升沿 | 10 ns | 5 ns | 8~11.5 ns | 采样过早,建立侧还差 3 ns |
| 100 MHz,延后 4 ns | 10 ns | 9 ns | 8~11.5 ns | 落在窗口内,最小剩余裕量 1 ns |
有些控制器支持接收采样时钟移相。例如 ST 的 QUADSPI 应用文档介绍了 SDR 采样移位功能。具体能延后多少、相对哪个边沿、适用哪些模式,需要查对应主控手册。4
这也解释了“芯片支持 104 MHz”与“最坏输出延迟为 7 ns”为什么可以同时成立:系统还需要在正确的数据窗口内采样,不能只检查标称最大频率。
采样也不是越晚越好。 在上面的 100 MHz 示例中,若采样移到 14 ns,保持侧会超出窗口 2.5 ns,已无法保证锁存本拍数据。
6. 测试和调试时,按什么顺序检查?
- 确认模式和指令。 核对 Mode、SDR / DDR、x1 / x4、Dummy 配置;先确保协议阶段正确。
- 收集两端参数。 NAND 侧关注
tCLQV(max)、tCLQX(min);主控侧关注接收建立、保持和采样移位能力。 - 核对电气条件。 温度、电压、负载、驱动能力、板级传播和时钟抖动都会影响实际裕量。
- 看有翻转的数据波形。 可使用已有测试数据中的
0xAA/0x55等模式。在 NAND 引脚附近观察 SCLK 与输出数据,采用手册规定的测量阈值,考虑探头负载和通道间时差。 - 扫描可用窗口。 先低频确认数据,再扫描频率或控制器支持的采样延迟;寻找连续正确区间,选择中间位置,并在目标电压、温度和负载下复核。
一次读取成功,并不能证明所有条件下都满足时序;而一个采样位置失败,也不等于 NAND 阵列中的存储数据一定损坏。
7. 一个贴近工作的练习
已知:
- SPI 时钟 100 MHz,占空比 50%。
tCLQV(max)=7 ns,tCLQX(min)=2 ns。- 主控建立时间 1 ns,保持时间 0.5 ns。
- 暂时忽略板级延迟和抖动。
问题:把主控采样放在下降沿后 9 ns,是否满足这个简化模型?
参考答案:周期为 10 ns,允许采样区间为 [7+1, 10+2−0.5],即 8~11.5 ns。
9 ns 落在其中,建立侧剩余 1 ns、保持侧剩余 2.5 ns,因此最小剩余裕量为 1 ns。它相当于比随后 5 ns 的上升沿延后 4 ns。
能否在真实硬件上采用这个设置,还取决于控制器支持的采样位置与实际板级时序。
理解这些参数时,先抓住一个先后关系:发送端触发更新,等数据有效,接收端再在窗口内采样。
参考资料
-
Analog Devices:Introduction to SPI Interface。SPI 信号方向、数据移出与采样的基本概念。 ↩︎
-
Etron EM73D044VCS-H SPI NAND Flash Datasheet,Rev 1.1。第 12 页 SPI 模式;第 19~20 页页读和读缓存;第 35~36 页 AC 参数与输出时序。本文 7 ns / 2 ns 只作为该手册条件下的规格示例。 ↩︎ ↩︎
-
Microchip:SPI Transfer Modes,表 31-3。CPOL、CPHA 与前后边沿的对应关系。 ↩︎
-
STMicroelectronics:AN4760,Introduction to Quad-SPI。采样移位及相关功能;具体设置请查目标主控参考手册。 ↩︎