烧录成功但不开机 · SPI NOR 量产排查手册
编制日期 2026-09-21 | 版本号 Rev 1.0
XTX 芯天下 · FAE 现场技术文档 | 覆盖 SPI NOR / Quad SPI NOR / QPI NOR 作为启动介质的量产场景 | 2026-09 版
命令码、寄存器位、dummy cycle 数值以器件 datasheet 与平台手册为准;本图仅展示机制,不代替 datasheet。
- SPI NOR 没有统一的强制标准:状态寄存器数量与位定义、QE 位位置、4 字节地址的进入方式、dummy cycle 默认值、QPI 的进出命令都由各厂自定,同名位在不同厂、甚至同厂不同系列上含义都可能不同。
- 本文出现的所有命令码(如读、写状态寄存器、进入/退出 4 字节地址、QE 相关命令)均为常见写法示例,不是通用常量,必须逐颗核对该料号的正式 datasheet。
- 主机侧规则(SPI 控制器模式、dummy cycle 数、读命令选择)以目标平台的驱动源码与设备树为准,不以烧录器默认值或经验为准。
- 凡本文标注「以 datasheet 为准」的条目,现场必须打开对应料号的正式 datasheet 复核后再动手。
一句话结论:烧录器的 Verify PASS 只证明
「写进去的字节和源镜像一致」,不证明「目标 SoC 用同样的地址长度、
同样的读命令、同样的 dummy cycle 读得出来」。
SPI NOR 的校验是「数据搬运正确」,不是「读取语义正确」——
地址模式、QE 位、状态寄存器、复位时序、接口协议、镜像布局这六件事只要有一件与板上规则不一致,
校验就会 100% 通过而系统 0% 起来。
这份文档解决什么
解决的是裸片烧录校验 100% 通过、贴板却不开机这一类问题的定位与根治方法。 全文按「现象 → 机制 → 类目 → 立即动作 → 根治动作」组织:第 1 章把现象还原成机制, 第 2 章给出决策树定类目,第 3~8 章是六个类目的逐一排查,第 9 章是可直接翻查的速查表, 第 10 章是把结论固化到产线的 SOP。
怎么用这份文档
- 先按串口输出归类:把「不开机」按第 1 章的六个画像定位到启动阶段,不要一上来就换芯片。
- 用第 2 章的决策树定主干:先判断错位落在哪条主干(地址与配置 / 模式与读保护 / 电源与时序 / 接口协议 / 启动链路),再进对应章节。
- 拿「已知好板」做基线:找一块能正常启动的板,把它贴板上电后读到的状态寄存器值、SPI 波形、镜像读回数据各存一份。
- 每次只改一个变量:地址模式、QE、状态寄存器、dummy cycle 每次只改一处,改完重新烧录并装板实跑。
- 以装板实跑闭环:任何配置变更的最终判定,都是「冷启动 + 热重启 + 关键功能 + 一次掉电」四件事全过。
1. 问题本质:烧录通过 ≠ 系统启动
烧录器报 Verify PASS、CRC 完全一致,芯片贴板后却黑屏、卡 BootROM 或 kernel panic—— 这通常不是芯片坏了,而是「写进去的字节」与「读它时使用的读取规则」之间错位了。 SPI NOR 没有坏块、没有 spare 区、字节可寻址,所以问题几乎不发生在数据本身, 而发生在地址长度、读命令、读模式这三层「读取语义」上。本章先把现象还原成机制。
1.1 六个数据画像
现场接到「烧好了但不开机」时,先按串口输出把现象归到下面六类之一。 六类现象对应的是同一批机制在不同启动阶段的暴露,不是六种独立故障。 每张卡片右下角给出了该现象最可能对应的类目编号(详见第 3~8 章)。
来源:命令码、寄存器位、dummy cycle 数值以器件 datasheet 与平台手册为准;本图仅展示机制,不代替 datasheet。
1.2 校验通过,到底证明了什么
这是全文最关键的一张表。烧录器的校验(Verify)本质是把写进去的内容读回来与源镜像逐字节比对, 它检验的是「数据搬运」这一件事;而系统能否跑起来,取决于目标 SoC 侧的「读取语义」。 关键在于:烧录器读回数据时用的是它自己的命令与模式,这套规则未必等于 SoC 用的那套。
| 校验通过能证明 | 校验通过不能证明 | 由谁决定 |
|---|---|---|
| 烧录器缓冲区里的数据与源镜像逐字节一致 | 目标 SoC 能读懂这些字节 | 目标驱动 / BootROM |
| 在烧录器设定的读模式下读回正确 | 在SoC 用的读模式下也读得正确 | 器件 QE / QPI / 连续读状态 |
| 用烧录器选择的地址长度能访问到对应单元 | SoC 的地址长度能访问到同一个单元 | 3 字节 / 4 字节地址模式 |
| 在当前 dummy cycle 配置下读对 | 在平台配的 dummy 数下也读对 | 器件配置寄存器 + 驱动 |
| 写入时器件处于可编程状态 | 状态寄存器的非易失位没被误写 | 烧录工程的配置项 |
| 这一颗芯片在烧录座上能跑 | 这颗芯片贴板后能跑、且能反复启动 | 装板实跑 + 冷热重启 |
1.3 一句话机制:三方规则必须对齐
一颗 SPI NOR 从被烧录到被 SoC 读出来,中间要经过三方规则的叠加:
- 烧录器侧规则:用几字节地址、发哪条读命令、是否进 QPI、dummy cycle 取多少、状态寄存器配成什么、结束后是否复位。
- 器件侧状态:上电默认是什么地址模式、QE 位当前是 0 还是 1、状态寄存器的非易失位被写成了什么、处于哪种读模式。
- 目标平台侧规则:BootROM 发的是标准 SPI 还是 Quad 命令、SPI 控制器配的 dummy 数、设备树里声明的读命令与模式、驱动是否会重新配置 QE。
这三层里任意一层与另外两层不一致,校验都会通过,系统都不会起来。 更麻烦的是:烧录器在校验阶段用的是它自己刚设好的那套规则, 所以它能读对;而 SoC 上电时用的是器件掉电复位后的默认状态 + 平台自己的规则,这两者往往不是同一套。
「烧录通过 ≠ 贴板能跑」,而在 NOR 上更精确的说法是:「烧录器读得对 ≠ SoC 读得对」。
只要现象是「校验 100% 通过但系统不起来」,就不要把时间花在怀疑芯片质量上——先查三层规则是否对齐。所有配置类根因的共同特征是:改规则就能好,换芯片好不了。
1.4 与 SPI NAND 相比,NOR 的排查重点有什么不同
很多 FAE 的排查路径是先从坏块、ECC、OOB 布局想起——那是 NAND 的问题域。 换成 SPI NOR 之后,这一串概念直接失效,排查重点整体迁移到「读取语义」上:
| 对比项 | SPI NOR(本文) | SPI NAND(另见专题文档) |
|---|---|---|
| 坏块 | 出厂无坏块,无需坏块管理 | 出厂允许存在坏块,需要坏块表管理 |
| ECC | 不需要 | 必须有;片上 ECC / SoC 硬件 ECC / 软件 ECC 三选一 |
| spare 区 | 无 | 每页带 spare 区,存放坏块标记与 ECC 校验字节 |
| 地址语义 | 字节地址;地址长度本身是个开关(3B / 4B) | 页地址 + 列地址;物理块号会因跳过坏块而漂移 |
| 读取差异点 | 读命令 + 地址长度 + dummy cycle + 线宽(1/2/4) | 页读 + 读缓存两段式;读模式影响是否输出 spare |
| 配置位影响面 | QE / 4B / dummy / 保护位都直接影响能否读对 | ECC 使能、读模式位影响字节流结构 |
| 排查第一问 | SoC 发的读命令与器件当前状态是否匹配 | 坏块策略与 OOB 布局三方是否一致 |
不要假设「烧录器能读回来 = 器件配置是正确的」。烧录器在读回校验时,用的是它自己刚刚设好的地址模式、读命令与 dummy 数;这套配置在烧录结束、器件离开烧录座并重新上电之后,可能已经全部回到默认值。
因此全文反复强调一句话:配置生效与否,必须在系统侧(贴板上电后)确认,不能在烧录器侧推定。
2. 五类错位总览与排查决策树
六个类目不是并列的六张清单,而是挂在五条主干上的: 地址与配置、模式与读保护、电源与时序、接口协议、启动链路。 其中「地址与配置」这一条主干下挂着两个高频类目(第 1 类地址模式、第 3 类状态寄存器), 所以是五条主干、六个类目。本章的作用是:在动手之前先把问题定到主干上。
2.1 决策树
入口只有一个现象:烧录校验 100% 通过、贴板不开机。往下先定主干,再进对应类目。 走线的疏密不代表概率高低,只表示「第 1、3 类同属一条主干」。
来源:命令码、寄存器位、dummy cycle 数值以器件 datasheet 与平台手册为准;本图仅展示机制,不代替 datasheet。
2.2 五个类目与六章的对应关系
| 主干 | 类目 | 章节 | 一句话判据 |
|---|---|---|---|
| 地址与配置 | 第 1 类 · 4 字节地址模式漏开/漏关 | 第 3 章 | 低地址能读、高地址错,或换大容量料号后突然不行 |
| 地址与配置 | 第 3 类 · 状态寄存器非易失位误写 | 第 5 章 | 能读能校验,但改不动配置 / 写不进日志 / 升级失败 |
| 模式与读保护 | 第 2 类 · QE 位未生效 | 第 4 章 | 烧录器侧读对、板上读错,且和线宽(1/2/4 线)有关 |
| 电源与时序 | 第 4 类 · 复位与启动时序 | 第 6 章 | 冷启动与热重启表现不一致,或只在某些板上出现 |
| 接口协议 | 第 5 类 · 接口协议错位 | 第 7 章 | 读出来的数据整体错位若干字节,或器件完全不响应指令 |
| 启动链路 | 第 6 类 · 镜像与启动链路错位 | 第 8 章 | 器件读对了,但停在某个明确的启动阶段并有对应日志 |
2.3 三个判别问题:五分钟内定主干
现场不需要先把六个章节都过一遍。先如实回答下面三个问题,答案的组合基本就能把主干定下来。
| 问题 | 答「是」指向 | 答「否」指向 |
|---|---|---|
| 串口有没有任何输出? | 器件响应了指令 → 数据层问题(主干:地址与配置 / 启动链路) | 器件没响应或响应无效 → 协议层问题(主干:接口协议 / 电源与时序) |
| 是必现还是偶发? | 必现 → 配置或镜像问题(第 1、2、3、6 类) | 偶发 → 时序、电源、状态残留问题(第 4、5 类) |
| 现象和容量 / 地址高低有关吗? | 低地址 OK、高地址错 → 第 1 类(4 字节地址)优先 | 与地址无关 → 从第 2、5 类(QE / dummy / QPI)查起 |
2.4 最先要排除的三件事
- 确认串口是真的一行都没有,而不是波特率不对。换波特率、换 TX/RX、量一下 TX 脚有无波形,再下「完全黑屏」的结论。
- 确认板上供电与器件电压档一致。3.3 V 档与 1.8 V 档的器件在外观上毫无区别,装错料或工装档位没切,现象与配置错位完全一样。
- 确认「不开机」是不是必现。拿同一块板连做 20 次冷启动 + 20 次热重启,统计失败率;偶发问题的根因基本都在第 6 章。
- 不要先做整片擦除——NOR 没有坏块概念,整片擦除解决不了任何配置错位,反而会抹掉参数区,把「能启动但功能异常」变成「不可恢复」。
- 不要先换芯片——配置类根因的共同特征是「改规则就能好,换芯片好不了」,换片只会让现场的结论更混乱。
- 不要同时改多个配置——地址模式、QE、dummy cycle 一起改,就算好了也不知道是哪个起作用,下次还会复发。
3. 第 1 类:4 字节地址模式漏开 / 漏关
标准 SPI NOR 的读命令后面跟 3 个字节地址(A23:A0),一次性只能寻址 16 MB。 容量更大的器件(256 Mbit / 512 Mbit / 1 Gbit 及以上)必须换一种方式访问高地址—— 切到 4 字节地址模式、使用 4 字节变体读命令、或用 EAR 扩展地址寄存器分段。 这三种方式各厂支持情况不同,同一颗器件可能只支持其中一种。 只要「烧录器用一种、SoC 用另一种」,低地址就会正常、高地址就会错。
3.1 为什么 16 MB 是个坎
3 字节地址能表达的空间是 2 的 24 次方字节,也就是 16 MB(128 Mbit)。 当器件容量超过这个数时,主机必须多送一个地址字节,否则器件只能「看得见」低 16 MB。 问题在于:器件并不会因为地址不够而报错,它会把超出的高位地址直接忽略或回卷, 于是你读到的是低地址的内容,而且读操作本身完全成功。
来源:命令码、寄存器位、dummy cycle 数值以器件 datasheet 与平台手册为准;本图仅展示机制,不代替 datasheet。
3.2 三种进入方式,以及「上电默认到底是什么」
这是本类目最容易出错的地方:不要假设 4 字节地址是默认状态。 多数器件上电默认为 3 字节地址模式,需要主机显式切换; 少数器件把地址模式做成非易失配置位,写一次掉电保持; 还有一部分器件的 4 字节模式是易失的,复位或掉电之后立刻回到 3 字节。 具体是哪一种,只能查该料号的 datasheet。
来源:命令码、寄存器位、dummy cycle 数值以器件 datasheet 与平台手册为准;本图仅展示机制,不代替 datasheet。
3.3 典型症状与判据
| 症状 | 指向 4 字节地址的判据 | 验证动作 |
|---|---|---|
| 低 16 MB 正常、高地址数据错 | 镜像整体超过 16 MB,且低地址段能正常启动 | 把镜像裁剪到 16 MB 内试烧,若能起来即确认 |
| 换大容量料号后突然不开机 | 之前 ≤ 16 MB 的烧录工程被直接沿用 | 核对工程里的地址模式与容量配置 |
| 烧录器能读全片,板上读不全 | 烧录器用 4 字节变体命令,SoC 用 3 字节命令 | 抓 SPI 波形,数地址字节数 |
| 高地址擦除 / 编程失败 | 4 字节模式下擦写命令同样需要变体或 4 字节地址格式 | 核对 4 字节模式下的页编程与擦除命令 |
| 烧录座上全过、贴板冷启动必挂 | 4 字节使能位为易失,掉电后回到 3 字节默认 | 贴板上电后读出该配置位确认 |
| EAR 分段器件跨段读错 | 访问跨 128 Mbit 段的数据前没有改写 EAR | 检查驱动里 EAR 的改写时机 |
3.4 立即动作
- 确认容量是否越过 16 MB:把料号对应的 bit 数换算成字节,判断是否超过 16 MB(128 Mbit)。
- 查 datasheet 确认支持方式:是进入/退出命令、4 字节变体读命令、EAR 分段,还是非易失配置位;并明确上电默认是 3 字节还是 4 字节。
- 抓上电瞬间波形数地址字节:用逻辑分析仪看 BootROM 发出的第一条读命令后面跟了几个地址字节。这是最直接、最不会争辩的证据。
- 在贴板上电后读器件状态(不是在烧录座上):确认当前地址模式、确认 4 字节使能位是否为预期值。
- 核对平台各阶段的读命令:BootROM、SPL、U-Boot、kernel 四段可能用不同的驱动代码,要逐段确认。
- 做裁剪验证:把镜像裁剪到 16 MB 以内试烧一次。若能起来,就可以确认根因在高地址访问上。
3.5 根治动作
- 把地址模式写进烧录工程并做首件验证:工程里显式配置地址模式,不用默认值;首件必须装板实跑确认。
- 易失位必须在系统侧重新配置:若该器件的 4 字节模式是易失的,烧录时设的带不到板上,必须在 SPL 或 SPI 驱动初始化时显式发送进入命令。
- 换料号、换容量档必须重跑首件:从 128 Mbit 换到 256 Mbit 是最典型的触发动作,不允许直接沿用旧工程。
- 把容量与地址模式写进料号核对表:产线换型时,先看这张表再选烧录工程。
上电默认各厂不同,多数器件上电为 3 字节地址模式,少数料号相反——以 datasheet 为准。
更危险的是「看起来是默认」的情形:烧录器会把器件切到 4 字节模式再烧,烧完校验通过,你以为默认就是 4 字节;实际上器件一断电就回到 3 字节,SoC 上电后按 3 字节读,高地址全部回卷。
判定方法只有一条:在贴板上电后、BootROM 已经跑过之后再读一次器件的地址模式状态,而不是在烧录座上读。
为「让器件进入某种模式」而抬高或拉低 VCC、给地址脚或控制脚飞线加电平,属于会直接损伤器件的危险操作。
- 超出 datasheet 规定范围的电压会让器件参数永久漂移,甚至当场损坏;现场表现为「烧录器还能识别,但贴板就是不稳定」。
- 把 WP# / HOLD# / RESET# 直接短接到电源或地来「强制解除保护」,会掩盖真实根因,并且可能在后续批次上变成批次性故障。
- 正确做法是按 datasheet 给出的命令序列改写配置,并在系统侧(SPL / 驱动)固化,而不是在硬件上做临时手脚。
4. 第 2 类:QE 位未生效
QE(Quad Enable)位决定器件是否接受 Quad(4 线)读命令。 它有两个致命特性:第一,物理位置各厂不同,SR1、SR2、专用配置寄存器都有可能; 第二,它可能是易失的,烧录时写进去的值未必能带到目标板上。 于是就出现了最典型的一幕:烧录器用 Quad 模式烧完、校验 100% 通过, 贴板上电后 SoC 也用 Quad 命令读,但器件的 QE 已经是 0,读到的是无效字节。
这是本类目最常见、也最贵的错误假设。QE 位的位置各厂不同:有的在 Status Register-2 的 bit1,有的在 Status Register-1 的 bit6,还有的放在专用的配置寄存器里,需要用专用命令访问。即使是同一家厂商,不同系列、不同容量档之间也可能不一致。
- 不要因为上一颗料号的 QE 在 SR2[1],就默认这一颗也是。
- 不要用通用工具的默认「写状态寄存器」动作去设 QE——它可能写的是另一个器件的位置,把别的位改掉了。
- 写状态寄存器是整字节/整寄存器写入,改 QE 的同时会把同寄存器的其他位一起写回,务必先读-改-写,并确认其他位的期望值。
4.1 位置因厂商而异:不要照抄别家的工程
下面这张图列出的是「可能存在的位置」, 不是「某个厂商的确定位置」。同一厂商的不同系列、同一系列的不同容量档都可能不同。 唯一可靠的判定方法是在目标板上实际读出状态寄存器,再按该料号 datasheet 的位定义反查。
来源:命令码、寄存器位、dummy cycle 数值以器件 datasheet 与平台手册为准;本图仅展示机制,不代替 datasheet。
4.2 烧录通过 ≠ 模式生效:一条时间线
理解这一类目的关键,是把「烧录那一刻」和「贴板上电那一刻」当成两个独立时刻来看。 中间隔了断电、离座、复位这三件事,每一件都可能把 QE 拉回默认值。
来源:命令码、寄存器位、dummy cycle 数值以器件 datasheet 与平台手册为准;本图仅展示机制,不代替 datasheet。
4.3 Quad 模式下的 dummy cycle
即便 QE 已经生效,还有第二道坎:dummy cycle(等待周期)数必须两边一致。 器件在收到地址之后,需要若干个时钟周期才能把数据送到 IO 上,这段空档就是 dummy cycle。 主机少发一个,就会把器件输出的前一个字节当成 dummy 丢掉;多发一个,就会多收一个无效字节。 结果都是整帧数据错位,而命令与地址本身完全正确。
| 读命令(常见写法) | 线宽 | dummy cycle | 备注 |
|---|---|---|---|
| 03h Read | 1 线 | 无 dummy | 受时钟频率上限约束,以 datasheet 为准 |
| 0Bh Fast Read | 1 线 | 常见 8 | 以 datasheet 为准 |
| 3Bh Dual Output Fast Read | 2 线 | 常见 8 | 以 datasheet 为准 |
| 6Bh Quad Output Fast Read | 4 线 | 常见 8 | 需 QE = 1 |
| BBh Dual I/O Fast Read | 2 线 | 含 mode byte | 地址也走 2 线 |
| EBh Quad I/O Fast Read | 4 线 | 含 mode byte | 支持连续读,需 QE = 1 |
dummy cycle 数由命令码与配置寄存器共同决定:同一颗器件在不同读命令下 dummy 数不同, 部分器件还有专门的 DC 位用来切换档位(常见可选数各厂不同,以 datasheet 为准)。 主机侧则写在 SPI 控制器驱动或设备树里。 改器件不改驱动、或改驱动不改器件,都会错位。
4.4 典型症状与判据
| 症状 | 指向 QE / dummy 的判据 | 验证动作 |
|---|---|---|
| 烧录器读对、板上读错,且只在 Quad 通路出错 | 烧录器自己发过 QE 命令,板上没发 | 贴板上电后读 SR,确认 QE 实际值 |
| 读出来的数据整体错位一两个字节 | 主机 dummy 数与器件期望值不一致 | 抓波形数 dummy 周期,与 datasheet 核对 |
| 降级成 1 线读就能起来 | Quad 通路整体不通(QE 或 dummy 任一错位) | 把主机改成 03h / 0Bh 试启动 |
| 换一批料号后同一份工程突然失败 | 新料号 QE 位置或默认值与旧料号不同 | 重新核对新料号的寄存器位定义 |
| 高频时钟下失败、降频就好 | dummy 数处于临界,或器件输出延迟不够 | 核对频率与 dummy 的对应关系 |
| 烧录器提示「写状态寄存器失败」 | 状态寄存器被保护(SRP / WP#)或 QE 位置写错 | 先读回 SR 原始值,再查保护条件(见第 5 章) |
4.5 立即动作
- 查该料号 datasheet 确认 QE 位的确切位置(在哪个寄存器的第几位),以及它是非易失还是易失。
- 在贴板上电后读状态寄存器:用板上 SoC 或一个外挂的小工具读出 SR 原始值,按位定义算出 QE,确认是不是 1。
- 确认 SoC 用的是哪条读命令:看 BootROM 行为、看驱动与设备树里声明的读命令,确认它期望几线。
- 核对 dummy cycle 数:把器件侧的配置(含 DC 位)与主机侧驱动里配的 dummy 数摆在一起对。
- 抓波形对比:同时抓烧录器侧与板上侧的读时序,比命令码、地址字节数、线宽、dummy 周期数四项。
- 降级验证:把主机侧强行改成 1 线标准读(03h / 0Bh),若能起来,就确认根因在 Quad 通路上。
4.6 根治动作
- 易失的 QE 必须在系统侧重新使能:在 SPL 或 SPI 控制器驱动初始化里显式写入 QE,不要指望烧录时设的值能带过来。
- 把 QE 与 dummy 配置写进平台代码并加注释:注明适用料号与 datasheet 版本,换料号时必须同步 review。
- 烧录工程里显式声明状态寄存器配置:不用默认值,并把「烧录结束后是否发送复位命令」这一项明确勾选/取消并留痕。
- 首件必测 Quad 通路:首件除了能启动,还要实测 Quad 读带宽或至少确认 QE 生效,不能只测「能起来」。
现场常听到一句「烧录完 QE 位被擦复位了」。严格说,擦除(Erase)操作擦的是存储阵列,状态寄存器不在阵列里,擦除本身不会清 QE。
真正在清 QE 的通常是这三件事:掉电(易失位自然回默认)、复位命令(部分器件会把易失配置拉回默认)、烧录器结束流程里主动发送的状态寄存器回写。
所以排查时不要把结论停在「被擦了」,而要具体确认是哪一步把它改回去了,这样才能对症下药:要么改用非易失写法,要么在系统侧重新使能。
写状态寄存器是整寄存器操作,不是按位操作。在没有读回原始值、没有逐位确认的情况下直接回写一个「从别处抄来的值」,会同时改动同寄存器里的其他位。
- 可能顺手把 BP / TB / CMP 写成非期望值,把启动区变成只读(见第 5 章)。
- 可能把 SRP / LB 这类一次性位写死,直接报废整片。
- 正确顺序永远是:读回原始值 → 按位改 → 写回 → 再读回验证,并且写之前确认 WEL 已置位、器件不处于写保护状态。