烧录成功但不开机 · PPI NAND(并行 NAND)量产排查手册
编制日期 2026-09-21 | 版本号 Rev 1.0
XTX 芯天下 · FAE 现场技术文档 | 面向 8/16bit 并行异步 NAND(ONFI / Toggle)| 2026-09 版
PPI NAND 的 AC 时序、ECC 算法强度、控制器寄存器配置以具体平台手册(海思 Hi35xx、瑞芯微 RK33xx、联咏 NT9x 等)和器件 datasheet 为准;本文仅展示排查机制,不代替 datasheet。
- 并行 NAND 存在两套互不完全兼容的协议体系:ONFI(含 NV-DDR 系列)与 Toggle DDR,后由 JEDEC JESD230 做互操作收敛。器件的识别路径、参数页结构、时序模式编号都要先确认属于哪一套。
- 本文出现的时序参数名(tR / tREA / tRP / tREH / tRC / tRLOH / tCOH / tRHOH / tWHR / tRR)与量级均为说明机制的示例,具体数值必须查该料号 datasheet 的 AC 特性表。
- 控制器寄存器名、位域、初始化顺序、ECC 强度档位以平台用户手册与 SDK 驱动源码为准,不同平台(甚至同平台不同芯片)差异极大,本文只给「要查哪一类寄存器」。
- 命令码(FFh / 90h / ECh / EEh / EFh / 70h 等)是并行 NAND 的常见写法,但并非所有器件与所有平台都一致,动手前逐条核对 datasheet。
一句话结论:并行 NAND 的烧录 Verify PASS 只证明
「写进去的字节与源镜像一致」,不证明「主控的 NAND 控制器读得懂这些字节」。
PPI NAND 与 SPI NAND 的关键差别在于:SPI 侧只需对上协议与 ECC,而 PPI 侧还要额外把
并行总线的 AC 时序、控制器寄存器配置、初始化顺序、ECC 引擎归属四件事全部与平台驱动对齐——
这四件里任意一件错位,校验都会 100% 通过,系统 0% 起不来。
这份文档解决什么
解决的是并行 NAND(PPI NAND / Raw NAND / 8bit-16bit 异步 NAND)在烧录器上校验 100% 通过、 贴板后却不启动这一类问题的定位与根治方法,适用于联咏、海思、瑞芯微等中低端 AP / SoC 仍在使用并行 NAND 作为启动或存储介质的量产场景。全文按「现象 → 机制 → 类目 → 立即动作 → 根治动作」组织, 第 9 章是可直接翻查的速查表,第 11 章是可带进车间的核查清单。
怎么用这份文档
- 先按串口输出定画像:把「不开机」归到第 1 章的六种画像之一,确定是哪一段起不来,不要一上来就换芯片。
- 拿第 2 章的对照表认清对象:先确认自己面对的是并行 NAND,别把 SPI NAND 的经验直接套过来。
- 抓一份「已知好板」基线:把能正常启动那块板的启动日志、控制器寄存器值、时序参数、ECC 配置各存一份。
- 一次只改一个变量:ECC 开关、时序模式、坏块策略、偏移配置每次只动一处,改完全片重烧再上电。
- 用装板实跑闭环:任何配置变更,最终判定以「装板跑通完整启动 + 关键功能 + 一次断电重启」为准。
1. 问题本质:PPI NAND 的特殊性
并行 NAND 烧录校验 100% 通过、贴板却不开机,绝大多数不是芯片坏了, 而是「主控的 NAND 控制器被配置成的样子」与「这颗器件的实际参数」不一致。 本章先把现象还原成机制,再把 PPI NAND 与 SPI NAND 的本质差别讲清楚——后面五章的所有排查动作都建立在这个差别上。
1.1 六种数据画像
现场接到「烧好了但不开机」,第一件事是接串口、上电、把输出贴出来,然后按下面六类归档。 六类对应的是同一机制在不同启动阶段的暴露,不是六种独立故障; 归档的价值在于它直接决定了从第 3 章到第 8 章该先翻哪一章。
1.2 校验通过,到底证明了什么
这是全文最关键的一张表。烧录器的校验(Verify)本质是把写进去的内容读回来与源镜像逐字节比对, 它检验的是「数据搬运」这一件事;而系统能否跑起来,取决于主控侧的「数据解释」规则。 并行 NAND 比串行 NAND 多出来的时序层与寄存器层,恰恰是校验完全不参与的两层。
| 校验通过能证明 | 校验通过不能证明 | 由谁决定 |
|---|---|---|
| 烧录器缓冲区里的数据与源镜像逐字节一致 | 目标 SoC 能读懂这些字节 | 平台驱动 / BootROM |
| 每个被写的页都编程成功(FAIL 位为 0) | 控制器被配成了正确的位宽与时序 | 控制器寄存器配置 |
| 在烧录器当前的时序下读写正常 | 在目标板的时序下也正常(两者不是一回事) | 平台 AC 时序配置 |
| OOB 里写进去的字节与烧录配置一致 | OOB 布局与驱动的 ECC 布局一致 | 驱动 ECC 配置 |
| 这一颗在烧录器上能跑 | 这一颗装到目标板上能跑 | 装板实跑 |
| 这一颗能跑 | 这一批 / 这个料号 / 这个批次都能跑 | 首件确认 + 装板抽检 |
1.3 PPI NAND 到底特殊在哪
把 PPI NAND 理解成「加大版本的 SPI NAND」是本文档要纠正的第一直觉。两者在三个层面根本不同:
- 物理层不同:PPI 用 8 或 16 根数据线加 7 根以上控制线,命令 / 地址 / 数据三态复用同一组引脚, 靠 CLE / ALE 两根专用线区分当前是哪种周期;没有时钟线,数据的锁存边沿由 RE# / WE# 自己携带。
- 时序层不同:SPI 的时序由 SCLK 频率与 SPI 模式决定,主控给个时钟就行; PPI 的建立 / 保持 / 脉宽 / 周期全部依赖主控寄存器里的等待周期数,与器件 AC 特性逐项对表。
- ECC 层不同:并行 NAND 平台上 ECC 几乎总是由 SoC 内置的硬件 ECC 引擎(BCH / RS)承担, 而不是器件片上完成;于是「烧录器要不要算 ECC」这件事本身就成了一个可错的变量。
「烧录通过 ≠ 贴板能跑」。只要现象是「校验 100%% 通过但系统不起来」,就不要把时间花在怀疑芯片质量上——先查主控侧的四层配置是否对齐。并行 NAND 的现场统计里,器件本体不良的概率远低于配置错位的概率。
1.4 一句话机制:三方规则 + 四层配置
SPI NAND 场景只需要「烧录器侧 / 镜像侧 / 驱动侧」三方规则对齐; 并行 NAND 还要在这三方之外,额外把主控侧的四层配置全部对齐:
| 层 | 要对齐的内容 | 配错后的典型症状 | 配错的高发原因 |
|---|---|---|---|
| 物理层 | 总线位宽(8bit / 16bit)、引脚复用与驱动强度 | 读 ID 全 FF 或全 00,像没焊芯片 | 引脚还在 GPIO 态,或 16bit 器件被当成 8bit 用 |
| 协议层 | ONFI / Toggle 识别路径、参数页解析、时序模式 | 识别不到器件,或容量 / 页大小识别成错值 | 参数页字段解读错,或器件不在内建 ID 表里 |
| 时序层 | tR / tREA / tRP / tREH / tRC / tRLOH 及全套 AC 参数 | 偶发位错、ECC 报错、随温度电压漂移 | 沿用别的料号的时序参数或直接取默认值 |
| ECC 层 | 生成方、校验强度、每步保护字节数、OOB 布局 | 大量不可纠错误,或空白页被判错 | 烧录器默认开 ECC,与 SoC 硬件 ECC 打架 |
不要用 SPI NAND 的排查套路去套 PPI NAND。SPI NAND 的问题大多收敛在「坏块 + ECC + 偏移」三件事上;并行 NAND 在这三件事之外,还有「控制器有没有被正确初始化」和「时序参数有没有对上器件」这两个结构性新增维度。换句话说:SPI NAND 出问题,多半是数据层的事;PPI NAND 出问题,有相当比例是控制器层的事——而控制器层的问题,读回校验永远查不出来。
2. PPI NAND vs SPI NAND 关键差异
这一章是全文的分水岭。把并行 NAND 当成「加大版本的 SPI NAND」是绝大多数误判的源头—— 两者在物理层、时序层、ECC 层三件事上根本不同,导致可用的排查手段、要查的参数、要对齐的配置完全不是一套。 认清差别后,第 3 章到第 8 章的排查才有意义。
2.1 接口层面的根本差异
先看两张图各自的信号集合。左侧并行接口用专用控制线告诉器件「我现在发的是命令还是地址」; 右侧串行接口则把这些类型编进协议字节,硬件上只需要一根时钟。
差别带来的直接后果:并行接口把时序责任从协议推给了硬件配置。 串行接口只要 SCLK 不发疯,数据就一定锁得对;并行接口即使命令全对,只要建立时间差几纳秒, 读出来的就是一个字节里错一位——而这一位足以让 ECC 从「可纠」变成「不可纠」。
2.2 关键差异对照表
下面这张表是本文档被翻查频率最高的一页。现场拿到一颗并行 NAND 时, 先把「我这颗属于左列还是右列」确认清楚,再去查具体参数。
| 对比维度 | PPI NAND(并行 NAND) | SPI NAND(串行 NAND) |
|---|---|---|
| 接口形态 | 8 / 16bit 并行总线,配 CLE / ALE / RE# / WE# / CE# / R/B# / WP# | 4~6 线串行:CS# / SCLK / IO0~IO3 |
| 时钟 | 异步模式没有时钟线;同步模式(NV-DDR / Toggle)才引入 CLK 与 DQS | 始终由 SCLK 提供,读写都跟着它走 |
| 引脚数 | 常见 15 根起(16bit 总线更多),封装多为 48 / 63 ball 以上 | 8 脚即可(WSON8 / SOP8 / BGA24 等) |
| 命令 / 地址 / 数据 | 三态复用同一组 IO 引脚,靠 CLE / ALE 区分当前周期类型 | 全部编进串行协议字节,无需专用控制线 |
| 时序由谁决定 | 主控寄存器里的等待周期数 × 器件 AC 特性,逐项对表 | SCLK 频率 + SPI 模式(CPOL / CPHA)+ 线宽 |
| 时序模式 | ONFI 异步 mode 0~5(mode 0 为上电默认);另有 NV-DDR / NV-DDR2 / NV-DDR3 与 Toggle DDR 1.0 / 2.0 | 没有「时序模式」概念,只有频率与 1 / 2 / 4 线宽度 |
| ECC 生成方 | 几乎总由 SoC 内置硬件 ECC 引擎承担,器件片上一般不生成 | 多数器件片上 ECC 上电默认开,器件自算校验字节写入 spare |
| spare / OOB | 每页带 spare 区,ECC 位置与长度由平台驱动硬编码 | 每页带 spare 区,ECC 位置与长度由器件与驱动共同约定 |
| 坏块标记 | 在 spare 区首字节(部分器件写前两页),判据与地址各厂不同 | 同样在 spare 区,但地址与判据另有一套约定 |
| 器件识别路径 | ONFI Read ID(90h / 地址 20h)→ 参数页(ECh);失败则回落标准 Read ID(90h / 地址 00h)+ 内建表 | 读 JEDEC ID + 参数页 / 特征字,路径与并行完全不同 |
| 烧录器支持 | 需要专门的并口 NAND 算法与时序配置,工具链独立 | 通用 SPI 烧录算法即可,多数烧录器内置 |
| 平台驱动耦合度 | 极高:寄存器、时序、ECC 布局全部绑死在平台上 | 中:主要绑 OOB 布局与坏块策略 |
| 典型应用平台 | 联咏、海思 Hi35xx、瑞芯微 RK33xx 等中低端 AP / SoC(eMMC 未普及时代) | 新兴与低成本平台、替代大容量 NOR 的场景 |
- 不要把 PPI NAND 当作「加大版本的 SPI NAND」。接口、ECC、时序机制全部不同,排查清单也完全不同。
- 不要沿用别的料号的时序参数。并行 NAND 的 AC 特性是逐料号标定的,换料号必须重取参数,具体数值以该料号 datasheet 的 AC 特性表为准。
- 不要只看烧录器能不能烧。烧录器能烧只说明它的算法认这颗芯片,不说明目标平台的控制器认这颗芯片——这两件事在并行 NAND 上经常是分离的。
2.3 排查决策树:按串口输出定位类目
接上串口、上电、把输出贴出来,然后顺着下面这棵树走。 树的价值在于把「不开机」这个模糊描述,压缩成六类里的一类, 从而决定先翻哪一章。
这棵树给的是首选方向,不是排他判定。并行 NAND 上多因并发很常见(例如时序配错导致参数页读错,看起来像协议握手失败),按首选方向查不通时,回到第 1 章的六种画像重新归档,并把控制器寄存器的实际值打出来与已知好板逐项比对。
3. 第 1 类:主控平台 ONFI / Toggle 协议握手失败
上电后主控与器件之间先要有一段「互相认识」的对话:复位、读签名、读参数页、回填几何参数、切换时序模式。 这段对话走不通,器件本身再好也没用。本章把这段对话拆成八步,给出每一步失败时的症状与处置。
3.1 握手流程:八步里任何一步没走通
BootROM 与第一级加载程序(SPL / TPL)通常自带一段精简的 NAND 识别代码, 它必须在不依赖任何外部配置的前提下把器件认出来,因此流程高度固定。下图是这条链路的完整形态。
3.2 症状 → 根因 → 动作
握手失败的表现差异很大,但判定动作是同一套:把原始 ID、参数页前若干字节、 控制器回填后的页 / 块 / spare 值全部打印出来,与 datasheet 逐字段核对。
| 症状 | 最可能的根因 | 立即动作 | 根治动作 |
|---|---|---|---|
| 串口一行都不出 | 控制器未上电 / 未解复位 / 引脚未复用 | 读时钟与复位寄存器,量 CE# 有无波形 | 补齐初始化顺序(见第 6 章) |
| 报 No NAND device / init failed | 读 ID 返回全 FF 或全 00,器件根本没响应 | 示波器看 CE# / RE# / WE# 有无跳变 | 修引脚复用、焊接或供电 |
| ID 读得出但提示 unsupported | 器件不在平台内建 ID 表里,或参数页 CRC 不过 | 打印原始 ID 与参数页前 32 字节 | 补内建表项或修正参数页解析 |
| 容量识别成 0 或成倍偏差 | 参数页字段偏移读错,或块 / 页 / spare 三者其一错位 | 把回填值打印出来与 datasheet 对 | 修正参数解析与回填代码 |
| 能识别,但读写内容错 | 时序模式未生效,或切到了器件不支持的模式 | 强制回退 mode 0 再验证 | 按 datasheet 重配时序(见第 5 章) |
| Toggle 器件完全识别不到 | 平台只实现了 ONFI 识别路径 | 确认平台手册是否声明支持 Toggle | 换用平台支持的料号,或联系平台方 |
| 换批次后突然识别不到 | 新工艺 / 新 die 的 ID 或参数页有变化 | 对比新旧批次的原始 ID 与参数页 | 把新批次纳入首件验证清单 |
3.3 ONFI 参数页关键字段
参数页是整个驱动的地基。下面这些偏移是 ONFI 参数页里的常见定义, 具体偏移与长度以所用规范的正式文档与器件 datasheet 为准; Toggle 器件与 JESD230 参数页结构不同,不能直接套用。
| 参数页偏移 | 字段 | 长度 | 说明 |
|---|---|---|---|
| 0~3 | 参数页签名 | 4 B | ONFI 应为 O / N / F / I(4Fh 4Eh 46h 49h) |
| 4~5 | 修订号 | 2 B | 用于判定器件遵循的规范版本 |
| 6~7 | 特性字(features) | 2 B | bit0 表示是否支持 16bit 数据总线 |
| 80~83 | 每页数据字节数 | 4 B | 即页大小,回填到控制器 |
| 84~85 | 每页 spare 字节数 | 2 B | 即 OOB 大小,决定 ECC 布局可用空间 |
| 92~95 | 每块页数 | 4 B | 与页大小相乘得到块大小 |
| 101 | 地址周期数 | 1 B | 行地址与列地址合计的周期数 |
| 254~255 | CRC | 2 B | 对前 254 字节做 CRC16,用于校验参数页有效性 |
参数页的有效性依赖 CRC,而 CRC 又依赖读参数页时的时序是对的。如果控制器此刻的时序已经配错,读出来的参数页本身就是错的,CRC 大概率不过——这类故障会被误报成「器件不支持 ONFI」。
判别方法:把时序强制降到 mode 0 后重读参数页,如果这时 CRC 过了,说明问题在时序而不在器件。
3.4 Toggle 器件与 ONFI 器件的差异
并行 NAND 长期存在两套协议体系,选型与替换时务必先确认目标平台支持哪一套:
- ONFI:由 Hynix、Intel、Micron、Phison、Sony、ST 等发起,2006 年发布 1.0, 是目前事实上的主流标准。异步接口定义 6 档时序模式(mode 0~5), 同步接口为 NV-DDR / NV-DDR2 / NV-DDR3。
- Toggle DDR:由 Samsung 与 Toshiba 推出,2010 年发布 Toggle DDR 1.0, 后续演进到 Toggle DDR 2.0。采用 DQS 选通的源同步方式,与 ONFI 的同步模式不通用。
- JESD230:JEDEC 与 ONFI 工作组联合制定的互操作标准, 用于收敛上述两套体系(公开资料给出的对应关系:JESD230 对应 ONFI 3.1 与 Toggle DDR 2.0, JESD230C 对应 ONFI 4.0)。具体版本对应关系以 JEDEC 与 ONFI 官方发布为准。
公开资料给出的时间线大致为:ONFI 1.0(2006-12,异步低速)→ ONFI 2.x 引入源同步接口 → ONFI 3.x 命名 NV-DDR / NV-DDR2 → ONFI 4.0(可支持更高速率);Toggle DDR 1.0(2010-06)→ Toggle DDR 2.0;JEDEC 的 JESD230 系列(2012-10 起)尝试把两套体系收敛为互操作标准。
具体版本号、发布时间与速率档位以官方规范文本为准,现场只需记住一条结论:先确认平台支持哪一套,再选料号。
识别阶段的主控必须是8bit 位宽 + 最保守时序(ONFI mode 0)。有些工程师为了让启动更快,在初始化时直接把控制器配成目标时序模式,结果读 ID 这一步就拿到错数据,后续全部崩塌。
正确顺序:先保守识别,识别成功后再用 SET FEATURES 切模式,并用 GET FEATURES 回读确认。切模式前后都要等 R/B# 就绪。
4. 第 2 类:ECC 引擎不匹配
这是并行 NAND 与 SPI NAND 差别最大、也是最高发的一类。 并行 NAND 平台上,ECC 几乎总是由 SoC 内置的硬件 ECC 引擎承担,器件片上一般不生成校验字节; 而烧录器是一个「第三方写入者」,它是否也生成 ECC,就成了决定成败的变量。
4.1 三方 ECC 生成方与 OOB 布局
写入侧(烧录器)与读取侧(SoC 驱动)各自在 OOB 里写什么、按什么布局解, 这两件事必须完全一致。下图把两侧的布局摊开对照。
4.2 组合矩阵:谁生成、谁校验
把「写入侧是否生成 ECC」与「读取侧如何校验」两两组合,只有一条路径是对的。 现场先按这张表对号入座。
| 写入侧(烧录器) | 读取侧(SoC 驱动) | 结果 | 处置 |
|---|---|---|---|
| 生成 ECC | 硬件 ECC 生成并校验 | 冲突,同一片 OOB 被写两遍,校验必然失败 | 关掉烧录器侧的 ECC |
| 生成 ECC | raw / 不校验 | 不纠错,能读但一次 bitflip 就挂 | 关掉烧录器 ECC,或改驱动走硬件 ECC |
| 不生成 ECC | 硬件 ECC 生成并校验 | 正确路径,前提是 OOB 布局一致 | 保持,并核对 OOB 布局逐项一致 |
| 不生成 ECC | raw / 不校验 | 能跑但没有纠错保护,长期不可靠 | 按平台要求开启硬件 ECC |
4.3 配置核对项:逐项抄下来对
下面这张表建议直接打印带进车间。每行都要把两侧的实际取值抄下来对比, 只要有一项不一致,校验就会通过而系统起不来。
| 核对项 | 烧录器侧取值来源 | 驱动侧取值来源 | 不一致的后果 |
|---|---|---|---|
| 是否生成 ECC | 烧录工程的 ECC 开关 | 驱动的 ECC 模式配置 | 双重 ECC,或完全没有保护 |
| 算法与纠错强度 | 烧录工程配置 | 平台手册 + 驱动配置 | 校验字节长度对不上,布局整体错位 |
| 每步保护字节数 | 通常不涉及 | 驱动的 ecc size / strength | 步进数与 OOB 用量不匹配 |
| ECC 字节在 OOB 的位置 | 烧录工程配置 | 驱动的 OOB 布局结构体 | 覆盖坏块标记或文件系统元数据 |
| 保护范围是否包含 spare | 烧录工程配置 | 驱动实现 | 元数据被改写后校验失败 |
| 空白页如何处置 | 烧录工程的空白页策略 | 驱动的空白页判定 | 空白页被判成坏块或数据 |
4.4 为什么并行 NAND 上这类问题特别多
三个结构性原因:
- 器件片上一般不生成 ECC:并行 NAND 把 ECC 责任完全交给主机, 于是「谁负责 ECC」从器件规范问题变成了平台配置问题——配置问题就会配错。
- 硬件 ECC 引擎的参数藏在寄存器里:强度、每步保护字节数、OOB 布局 都是驱动硬编码或设备树配置的,读回校验看不到它们。
- 烧录器是「外来者」:它不在平台驱动的控制链里, 不知道目标 SoC 会用哪套布局,只能靠工程师手工把配置对齐。
这是本文档列出的第一号高发坑。典型现场是:换了一台烧录器(或换了个烧录工程),新工程的 ECC 选项默认是「开」,而目标平台的驱动走的是 SoC 硬件 ECC。结果每一页的 OOB 都被写了两份校验字节,第二份把第一份的位置覆盖了一半。
现象特征:读回校验 100%% 通过(写的确实和源镜像一致),贴板后串口刷屏报 ECC 不可纠错误,或者干脆认不出文件系统。
立即动作:把烧录工程的 ECC 关掉,全片重烧,装板验证。根治动作:把「本平台烧录时必须关闭烧录器 ECC」写进作业指导书,并在首件清单里加一条「核对 ECC 开关」。
提高 ECC 强度会占用更多 OOB 字节。如果 OOB 空间不够放下「坏块标记 + ECC 校验字节 + 文件系统元数据」,就会互相覆盖。可用 OOB 大小由器件决定,ECC 强度与所需字节数由平台手册给出,两者必须由平台方确认能匹配,不能为了提高纠错能力就随便调高强度档位。具体数值以平台手册与器件 datasheet 为准。