Raw NAND 物理接口:ONFI 异步/Toggle DDR 时序与命令地址周期
更新时间:2026-09-19。前置:NAND Flash 与 eMMC 控制器(坏块/ECC/FTL)、Hamming/ECC、DDR 接口。那篇讲「NAND 为什么会坏、怎么纠错、FTL 怎么管理」,本篇下沉到 raw NAND 芯片引脚和波形:命令、地址、数据怎样在同一组 I/O 上被区分。
本文要回答的问题
- 一根 I/O 总线怎么分时传命令、地址、数据,CLE/ALE 干什么?
- 异步模式下 #WE/#RE 怎么锁存,Toggle DDR 又快在哪?
- 页读、页编程、块擦除的完整命令握手序列是什么?
- 裸 NAND 控制器(不含 FTL)必须自己管哪些事?
一、引脚与复用总线
传统 raw NAND(以 ONFI 兼容的 SLC/MLC 并行 NAND 为例)主要信号:
- I/O[7:0](或 [15:0]):命令、地址、数据复用同一总线,靠控制脚区分当前周期类型。
- CLE(Command Latch Enable):高表示当前 I/O 上是命令,在 #WE 上升沿锁入命令寄存器。
- ALE(Address Latch Enable):高表示当前是地址,在 #WE 上升沿锁入地址寄存器。
- #WE / #RE:写使能 / 读使能(异步模式各提供一个方向的时钟沿)。
- #CE、#WP(写保护):片选、硬件写保护。
- R/B#(Ready/Busy,开漏):器件忙(编程/擦除/读内部操作)时拉低,主控靠它或读状态寄存器判断完成。
- 高速 Toggle 模式增加 DQS(差分 DQS/#DQS) 做源同步选通。
因为命令/地址/数据都走 I/O,控制器就是按节拍拉 CLE/ALE 发周期,不需要三根独立总线,省引脚但需要严格时序。
二、异步模式时序(ONFI 传统)
异步模式由主控用 #WE(写命令/地址/数据进 NAND)和 #RE(从 NAND 读数据)单沿触发:
发命令周期: CLE=1,ALE=0, I/O=命令码, 在 #WE 上升沿 NAND 锁存
发地址周期: CLE=0,ALE=1, I/O=地址字节, 连续多个 #WE(行/列地址分多字节)
数据写: CLE=0,ALE=0, I/O=数据, 多个 #WE
数据读: NAND 在 #RE 沿驱动 I/O, 主控在对应沿采样关键时序参数(数据手册给 ns):tWP(#WE 脉冲宽)、tRC/tREA(读周期/读使能访问时间)、tCS/tCH(片选建立/保持)、tCLS/tCLH(CLE 建立/保持)、tALS/tALH(ALE)、tWHR(写后读切换)等。控制器/SoC 上常通过 NAND 控制器的时序寄存器或 GPIO 翻转时序来满足这些最小建立保持。
三、Toggle DDR / ONFI 高速模式
异步单沿到高节点跟不上,定义了 Toggle-mode DDR(与 ONFI DDR 类似):
- 命令/地址仍在单个边沿(#WE 相关)锁存,数据在 DQS 的双沿(上升+下降)传输,类似 DDR SDRAM 的源同步。
- 读时 NAND 驱动 DQS+数据,主控对 DQS 双沿采样;写时主控驱动 DQS 与数据,DQS 方向随读/写切换(三态管理,见 SPI 从机三态)。
- 速率可达数百 MT/s,需信号完整性、ODT/端接和训练(理念同 DDR)。
- 进入 Toggle/DDR 要先发特定命令(如 Set Feature 配置时序模式),上电默认异步。
四、典型命令握手序列
NAND 命令是多段「命令-地址-数据-确认-忙等」结构:
页读(read page):
00h(命令) → 列地址(页内 offset, 2 字节) → 行地址(页号, 多字节) → 30h(确认)
等 R/B# 变高(阵列→cache)
读周期: 连续读数据(整页) + OOB(spare, 存 ECC/元数据)页编程(program page):
80h(编程命令) → 列地址 → 行地址 → 写入整页数据(+OOB) → 10h(确认)
R/B# 忙(tPROG, 数百 us) → 读状态 70h → 查 I/O0(pass/fail)
失败需 ECC/重试/标记坏块块擦除(erase block):
60h → 行地址(块号) → D0h
R/B# 忙(tBERS, 数 ms) → 70h 查状态还有 Reset(FFh)、Read ID(90h)、读参数页(ONFI Parameter Page,含时序/页大小/能力)、Set/Get Features(EFh/EEh,配 DDR/ECC 模式)等。
五、地址结构与 OOB/坏块
- 地址分列地址(column,页内字节偏移)和行地址(row,页号=块号+页内页序号),按器件宽度分多个字节依次送。
- 每页后跟 OOB/Spare Area(如每 2KB 配 64B),存 ECC 校验、坏块标记、元数据。控制器在主数据之外要能读写 OOB(见 ECC)。
- Raw NAND 不含控制器:坏块管理、磨损均衡、ECC、FTL 全要主机软件/控制器做;出厂时坏块在 OOB 特定列有标记,首次擦写前必须读出坏块表(上层逻辑见 NAND/eMMC 控制器)。
六、常见的坑
- CLE/ALE 时序混淆:把命令当地址或数据送,器件不动作;周期类型必须严格按建立保持。
- 地址字节数/顺序错:列/行地址按器件大页结构拆字节,错一位读错页。
- 不等 R/B# 就操作:编程/擦除未完成就发下一命令,数据损坏;要查 R/B# 或轮询状态。
- 漏读 ONFI 参数页:硬编码时序/页大小,换颗粒就错;应读参数页自适应。
- Toggle DQS 方向切换错:读/写三态使能不当,数据冲突、采样错位。
- 异步时序参数不满足:tREA/tWP 配得太紧,高温慢档出错。
- ECC/OOB 处理缺失:裸 NAND 必须软件/控制器纠位错,不纠则数据不可靠。
- 出厂坏块标记被擦除:没先备份坏块表就 erase,永久丢失坏块信息。
- 编程失败不重试/不标坏块:偶发失败应重试,持续失败标记坏块重映射。
- 页/块大小假设错:大页 NAND 的地址周期和 OOB 布局不同。
- 16 位器件按 8 位驱动:地址按字编址、列地址步长不同。
- DDR 模式未先 Set Feature:上电默认异步,直接用 DQS 双沿无响应。
相关与延伸
坏块/ECC/FTL/与 eMMC 的区别见 NAND 与 eMMC 控制器;纠错原理见 Hamming/ECC;双沿/源同步/训练见 DDR3/4;总线三态见 SPI 从机。
总结
Raw NAND 用 8/16 位 I/O 复用总线,靠 CLE/ALE 拉高区分当前 #WE 沿锁入的是命令还是地址、两者皆低则是数据,异步模式由主控的 #WE/#RE 单沿触发并满足 tWP/tREA/tCLS 等建立保持参数,高速 Toggle DDR 则在命令地址仍单沿的基础上让数据随双向 DQS 双沿源同步传输;操作都是多段握手——页读 00h+列/行地址+30h 后等 R/B# 再读整页含 OOB,页编程 80h+地址+数据+10h 后等 tPROG 查状态,块擦除 60h+块地址+D0h 后等 tBERS——裸 NAND 不含 FTL,坏块表/OOB/ECC/重试都要主机自己管,CLE/ALE 错位、不等忙、Toggle DQS 方向错和擦掉出厂坏块标记是四大根因。