存储烧录器「找不到型号」的通用解法
同封装 + 同电压 + 同容量 + 忽略 ID 检查 —— 这条产线通则的适用范围与边界 · 编制日 2026-08-30 | 编制日期 2026-09-21 | 版本号 Rev 1.0
烧录存储芯片找不到型号时,选一颗封装相同、电压相同、容量相同的已知型号,关掉软件的 ID 检查,直接烧。只要最终校验 PASS,绝大多数情况下就是可用的。这条规则在产线上成立,而且是最省时间的做法。
一是为什么它成立——ID 检查只是门禁,不是参数来源;命令集在同规格器件间高度同质化。理解了这点,用起来心里才有底。
二是它的边界在哪——「校验 PASS」证明的是数据被正确写进去了并读得出来,不等于目标系统能正确使用它。在 SPI NOR 上这两者几乎等价,但在 SPI NAND 与并行 NAND 上存在若干例外。第 5 章专门讲这些。
1. 为什么「忽略 ID 检查」是可行的
ID 检查是软件替你做的一道「防呆」,不是烧录过程的必要环节。关掉它,等于由你自己担保「所选型号的参数适用于眼前这颗芯片」。
1.1 ID 在流程中只承担一个角色:防呆
编程器软件选中一个型号后,会从型号库里取出这颗芯片的操作参数:页大小、擦除粒度、各命令的命令码、时序参数、保护位定义。真正驱动擦写的,是这套参数,而不是型号名,也不是 ID。
ID 检查的作用仅仅是:在动手之前读一次芯片 ID,与库里记录的 ID 对一下,不一致就报错拦住你——防止你选错型号把芯片写坏。它是门禁,不是参数来源。
所以「忽略 ID 检查」的实质是:跳过自动防呆,改由人工确认参数适用性。只要你的确认是对的,结果完全一样。
1.2 为什么同规格器件的参数几乎总能对上
这招能成为产线通则,不是巧合,是命令集高度同质化的结果:
| 层面 | 标准化程度 | 意味着什么 |
|---|---|---|
| 基础命令集 | 事实上完全统一 | 读 0x03、快读 0x0B、页编程 0x02、扇区擦 0x20、块擦 0xD8、读状态 0x05、写使能 0x06、读 ID 0x9F —— 各厂基本一致 |
| 页与块结构 | 高度统一 | 页 256B(NOR)/ 2KB(NAND),扇区 4KB,块 64KB,是行业默认 |
| 擦除粒度命令 | 基本统一 | 0x20 / 0x52 / 0xD8 三种粒度,少数老料缺一两种 |
| 厂商自定义部分 | 存在差异 | 状态寄存器高位、QE 位位置、OTP 操作、ECC 控制位 —— 这些才是雷区 |
同封装 + 同电压 + 同容量这三个条件,实际上已经锁定了前三层(命令集、页块结构、擦除粒度)。剩下的差异集中在厂商自定义的配置位上,而那些差异在离线裸片烧录时大多用不到。这就是这条规则成立的根据。
1.3 校验 PASS 到底证明了什么
校验(Verify)的动作是:把刚写进去的内容整片读回来,与源文件逐字节比对。它通过,说明三件事同时成立:
- 芯片能正确响应所选型号的那套命令(命令码对了)
- 地址译码正确,数据落在了该在的位置(容量与地址宽度对了)
- 擦除与编程都真实生效,没有静默失败(保护已解除,页块粒度对了)
这三点覆盖了「能不能把数据写进去」的全部关键路径。所以校验 PASS 是「物理层正确」的强证明——这也是为什么产线上看这个指标是可靠的。
校验比对的只是主存储区的数据内容。它不检查:配置位(QE、4 字节地址)、OTP / 安全寄存器、spare 区的 ECC 与坏块标记、以及器件被目标系统读取时的模式设置。这些在 SPI NOR 上大多无关紧要,但在 NAND 类器件上可能致命。详见第 5 章。
2. 三要素:封装、电压、容量
把「找型号」简化成核对三项。这三项对了,型号名对不对反而不重要。
2.1 电压:唯一不可逆的一项
容量选错 → 烧不进去,重来即可。封装选错 → 夹不上,换个座即可。电压选错 → 芯片当场击穿,报废。1.8V 的器件加上 3.3V,通常在几秒内就永久损坏。
| 怎么确认 | 可靠度 | 说明 |
|---|---|---|
| 查 datasheet 的 Ordering Information | ★★★★★ | 最可靠。电压等级写在完整料号的尾缀里 |
| 看芯片丝印尾缀 | ★★★ | 同料号常有 3.3V 与 1.8V 两个版本,差异往往仅一个字母 |
| 看目标板上的电源网络 | ★★★ | 板上给 flash 供的是几伏,通常就是它的工作电压 |
| 用可调电源从低往高试 | ★★ | 不得已时的办法:先给 1.8V,能读通就是 1.8V 器件 |
| 凭经验猜 | ✗ | 不要这样做。有实测案例:某国产 128Mb 料在 3.3V 下完全不工作,需 1.8V |
2.2 容量:决定装不装得下
| 器件类型 | 怎么读出真实容量 | 备注 |
|---|---|---|
| SPI NOR | 印字容量码 / 读 ID 第 3 字节 / 读 SFDP | 支持 SFDP 的料,容量由芯片自报,最准 |
| SPI NAND | 印字 / 部分支持 SFDP / 读 JEDEC ID 表 | 注意:标称容量 ≠ 用户可用容量,坏块会吃掉一部分 |
| 并行 NAND | 读 ONFI 参数页(命令 ECh + 地址 00h,读 256B) | 参数页直接给出页大小、块大小、块数、LUN 数,最权威 |
| eMMC | 读 EXT_CSD 的 SEC_COUNT | 与本文主题不同,另文讨论 |
NAND 出厂就允许存在坏块,且随着使用还会增加。标称容量不等于可用容量:例如某 4Gb 并行 NAND,每 Die 4096 个 block 中最多允许 80 个坏块。所以 NAND 选型时固件镜像一般只占总容量的 70–80%,剩余留给坏块替换与磨损。
2.3 封装:决定能不能上夹具
| 封装 | 规格要点 | 夹具 / 座 |
|---|---|---|
| SOP8 / SOIC8 | 150mil(窄体)与 208 / 207 / 200mil(宽体)不通用 | 免拆夹或 ZIF 转接座,先量体宽 |
| WSON8 / USON8 / DFN8 | 常见 6×5mm、8×6mm;底部有散热焊盘 | 专用免拆夹或转接座,夹合较困难 |
| SOP16 / SOIC16 | 多为 300mil 宽体 | 16 脚宽体夹或 ZIF 座 |
| BGA24 / TFBGA24 | 6×8mm、8×6mm,球距规格不统一 | 通常需专用烧录座或定制治具 |
| TSOP48 | 并行 NAND 常见 | TSOP48 座,注意引脚 1 方位 |
| BGA63 / BGA100 等 | 大容量并行 NAND / eMMC | 定制治具,一般不建议手工处理 |
2.4 三要素之外,还有一条隐藏前提
三要素都相同,但工艺代次差太远时也可能出问题。例如用老一代 GD25Qxx 的算法去烧新一代 GD25QxxE,或拿早期 SPI NOR 的参数去烧带 4 字节地址的大容量料。
实操判断:优先选同一厂商、同一系列、上市时间接近的型号做替代;跨厂商替代时优先挂 W25Q / MX25L 这类指令集最「标准」的条目。
3. 各编程器怎么忽略 ID 检查
各家叫法不同,但都是同一个开关。下面按软件分别说明,附可直接复制的命令行。
| 软件 / 工具 | 开关在哪 | 具体做法 | 注意 |
|---|---|---|---|
| Xgpro(XGecu T48 / T56 / T76 / TL866) | 操作对话框里的复选框 | 取消勾选 Check ID;若报引脚接触错误,一并取消 Pin Detect | 每次更换型号后该选项会默认重新勾选,换片时要再确认一次 |
| minipro(TL866 开源命令行) | 命令行参数 -y | minipro -p W25Q128JV@SOIC8 -w fw.bin -y -s | 会打印 WARNING: Chip ID mismatch 但继续执行;-s 用于文件小于容量时 |
| RT809H / RT809F | GENERIC 模式 / 自建条目 | 用 GENERIC 读出真身 ID,再在 DEVICE.INI 里建一条:ID 填真值、算法挂兼容型号 | 相当于把「忽略 ID」变成「ID 已收录」,长期更省事 |
| flashrom | 用 -c 强制指定条目 | flashrom -p ch341a_spi -c "W25Q128.V" -w fw.bin | 若芯片支持 SFDP,可直接 -c "SFDP-capable chip",连型号都不用选 |
| AsProgrammer / NeoProgrammer | 设置里的 ID 校验选项 | 关闭 Check ID 一类选项,或往芯片库里加一条自定义条目 | CH341A 用户注意先把 5V 电平问题处理掉 |
3.1 Xgpro:图形界面里最直接
- 按三要素在器件库里搜一个同规格的型号并选中。
- 点 Read / Prog 打开操作对话框,取消勾选 Check ID。
- 若提示引脚接触检测错误(Pin Detect),把该选项一并取消。
- 先点一次 Read 做只读验证,确认能读出内容或至少能通。
- 再执行 Erase → Program,等 Verify 出现 PASS。
Xgpro 的 Check ID 默认开启,且每次更换芯片型号后会自动重新勾选。连续烧同一种片子时容易忽略这点——换了一批料或换了个型号,忘记取消就会又卡住。建议把它写进工位 SOP 的确认项。
3.2 minipro:命令行加 -y
# 只读 ID,看看实际读出来是什么(不写入任何东西)
minipro -p W25Q128JV@SOIC8 -D
# 输出示例:Chip ID mismatch: expected 0xEF4018, got 0xEF7018 (unknown)
# ↑ 型号名不同或 ID 与库里记录不符,这是正常的,关键看下一步
# 加 -y 忽略 ID 不匹配警告;-s 允许文件小于芯片容量
minipro -p W25Q128JV@SOIC8 -w firmware.bin -y -s
# 输出:WARNING: Chip ID mismatch: expected 0xEF4018, got 0xEF7018 (unknown)
# Erasing... OK
# Writing Code... OK
# Reading Code... OK
# Verification OK ← 看到这行就成了
# 读回存档(永远第一步)
minipro -p W25Q128JV@SOIC8 -r backup.bin -y
某颗 W25Q128JVSIM 读回 ID 是 0xEF7018,而库里记录的是 0xEF4018,型号对不上。加 -y 之后擦除、写入、读回全部正常,最后一行是 Verification OK——这正是本文主张的做法在真实场景中的样子。
3.3 通用操作顺序
4. SPI NOR / SPI NAND / PPI NAND 分别要注意什么
同一条规则,在三类器件上的可靠程度差别很大。SPI NOR 上基本可以放心用,NAND 类器件要多看两眼。
4.1 SPI NOR:最省心
SPI NOR 是这条规则最适用的场景。原因是离线裸片烧录用不到那些厂商自定义的东西:QE 位只在 Quad / QPI 模式下才需要,而离线烧录用单线 SPI 即可完成;保护位由编程器自动处理;读命令可以统一用最保守的 0x03。
| 项目 | 是否需要额外确认 |
|---|---|
| QE(Quad 使能)位 | 不需要 —— 离线单线烧录用不到;但烧完装机后目标系统若走 Quad 模式,需在系统侧或配置里处理 |
| 4 字节地址(>16MB) | 需要 —— 容量超过 16MB 的料必须确认编程器进入了 4 字节地址模式,否则高地址回绕 |
| OTP / 安全寄存器 | 看需求 —— 普通固件烧录用不到;若要烧写序列号、MAC 等则需按型号处理 |
| 状态寄存器配置位 | 一般不需要 —— 离线烧录时保护位由软件自动解除 |
4.2 SPI NAND:多出 ECC 与坏块两个变量
SPI NAND 内部带 ECC 引擎,上电后默认处于使能状态。这带来一个容易被忽略的问题(华邦应用笔记专门讲过):
如果编程器把一页全 FF 的空白数据也照常烧进去,ECC 引擎会给这页算出校验码并写进 spare 区——于是这一页物理上就不再是空白页了。后续文件系统认为它是已擦除状态、直接往里编程,就会造成数据与 ECC 校验码不匹配。
官方给的两个解法:① 编程前先检查整页数据,若全 FF 就跳过该页不烧;② 或在编程前通过状态寄存器把 ECC-E 位置 0,关闭内部 ECC 再烧。
| 项目 | 说明 | 怎么应对 |
|---|---|---|
| 内部 ECC 默认使能 | 上电即生效,影响空白页与部分页编程 | 确认编程器有「跳过空页」选项并开启;或按需关闭 ECC-E |
| ECC 控制位位置各厂不同 | 华邦在状态寄存器 2 的 ECC-E 位;东芯在 SET FEATURES(1Fh) 的 OTP 特征地址 B0h 的 bit4 | 不能照抄,必须按实际料号查 datasheet |
| 部分页编程限制 | 同一 ECC 分组内多次编程会破坏内部 ECC 数据 | 按 ECC 分组对齐写入,避免跨组部分编程 |
| 坏块出厂即存在 | 第一页 spare 区特定位置非 FF 即坏块标记 | 确认编程器的坏块策略;不要擦除坏块块(标记会被抹掉且不可恢复) |
| 可用容量小于标称 | 坏块会吃掉一部分空间 | 镜像体积控制在总容量的 70–80% |
NAND 出厂时会在坏块的特定位置写入坏块标记。厂商明确说明:坏块可能因擦除而丢失标记,且无法恢复。做整片擦除前先确认编程器会跳过坏块,否则会把出厂坏块标记抹掉,之后系统无法识别这些坏块,数据可靠性直接崩掉。
4.3 PPI NAND(并行 Raw NAND):这里其实不该靠猜
并行 NAND 上,三要素 + 忽略 ID 也能烧,但风险明显更高——因为并行 NAND 的坏块管理策略直接决定了镜像数据落在哪些物理块上。好消息是:并行 NAND 有一个比猜型号干净得多的办法。
更好的办法:读 ONFI 参数页
符合 ONFI 规范的并行 NAND 都带一个 256 字节的参数页,用命令 ECh + 地址 00h 读出。开头 4 字节是 ASCII 的 ONFI(4F 4E 46 49),读到即确认支持。参数页里把容量结构、ECC 能力、坏块上限全部写明了,甚至还存了厂商名(12 个 ASCII)与器件型号(20 个 ASCII)。
| 参数页偏移 | 内容 | 用途 |
|---|---|---|
| 0–3 | 签名 “ONFI” | 确认是否支持 ONFI |
| 32–43 | 器件厂商(12 ASCII) | 直接读出原厂名 |
| 44–63 | 器件型号(20 ASCII) | 直接读出型号,不用猜 |
| 80–83 | 每页数据字节数 | 确定页大小 |
| 84–85 | 每页 spare 字节数 | 确定 OOB 大小 |
| 92–95 | 每块页数 | 确定块大小 |
| 96–99 | 每 LUN 块数 | 配合 LUN 数算总容量 |
| 100 | LUN 数量 | 多 Die 器件必看 |
| 101 | 地址周期数(行列各占 4 bit) | 决定寻址方式 |
| 102 | 每单元位数(SLC / MLC / TLC) | 决定 ECC 强度需求 |
| 103–104 | 每 LUN 最大坏块数 | 评估可用容量 |
| 112 | ECC 可纠正位数 | 决定要用多强的 ECC |
先用工具读 ONFI 参数页读出真实型号与全部结构参数,再据此选择匹配的烧录配置。这比「挑个同规格型号 + 忽略 ID」可靠得多,而且不费额外时间。只有当参数页读不出来(非 ONFI 的老料)时,才退回三要素法。
如果还是要用三要素法:坏块策略必须选对
| 坏块策略 | 行为 | 风险 |
|---|---|---|
| 硬拷贝 | 不管好块坏块直接写,校验不一致也不报错 | 风险最高:坏块上的数据必丢,且校验不报错,问题会延后暴露 |
| 跳过坏块 | 遇到坏块就跳到下一个好块继续 | 常用。镜像的物理块地址会偏移,必须与目标系统的加载逻辑一致 |
| 替换表(RBA) | 预留保留块区,遇到坏块用保留块替换 | 更安全,但需要预留区且要和目标系统约定好 |
| BBT 坏块表 | 跳过坏块并在指定位置写一张坏块表 | 最完整,目标系统需支持解析该 BBT |
这是并行 NAND 上最隐蔽的坑:校验比的是「写进去的数据 vs 读回来的数据」,比的是内容,不是位置。如果坏块策略选错,镜像被写到了偏移后的块地址上,内容比对依然是全对的——校验照样 PASS,但系统启动时按自己的映射去找 bootloader,找不到。
所以并行 NAND 烧录后,装机实跑是唯一可靠的验证,不能只依赖校验结果。
ECC 算法
并行 NAND 的 ECC 算法通常由主处理器供应商提供。如果编程器软件里没有对应的算法,需要用户自己提供算法源码。
一个省事的做法:如果采用读母片复制的方式烧录、且没有动态数据(比如每片不同的序列号),那么可以完全不用管 ECC 算法——因为母片的 spare 区里已经算好了 ECC,直接把母片的 spare 区原样拷贝到其他芯片即可。
5. 校验 PASS ≠ 能用:四道残余风险
这是本章最想说清楚的一件事。你的判断「校验 PASS 就没问题」在绝大多数情况下成立,但有四类例外,而且它们全部不会被校验发现。
5.1 配置位没设对
最典型的是 QE(Quad 使能)位与 4 字节地址模式:
| 配置位 | 什么时候出问题 | 后果 |
|---|---|---|
| QE 位 | 目标系统用 Quad / QPI 模式读取 flash,但芯片的 QE 位没置位 | 系统读不到数据,表现为「烧录全通过、上电不启动」 |
| 4 字节地址 | 容量 >16MB,编程器或系统没进入 4 字节地址模式 | 高地址区访问回绕到低地址,固件跑飞 |
| 块保护位 | 烧录后保护位被意外置位 | 系统启动时无法更新固件(不能写),但不影响读取 |
QE 位在离线单线烧录时用不到,所以烧录这一步不受影响。真正的问题是「目标系统能不能用 Quad 模式读」。解决办法通常是:让系统在首次启动时自己配置 QE 位,或在产线加一步配置位写入。这属于系统侧设计问题,不是烧录工具的问题。
5.2 位置对不上(并行 NAND 特有)
并行 NAND 的坏块策略决定了镜像数据被写到哪些物理块。如果替代型号的坏块处理策略与目标系统预期的不同(比如一个用「跳过坏块」,一个用「替换表」),数据的物理块地址就会整体偏移。
而校验的动作是「把写进去的内容读回来比对」——它比对的是内容,不是地址。所以这种情况下校验照样 PASS,但系统按自己的地址映射去找 bootloader 时找不到。
5.3 ECC 语义错了(SPI NAND 特有)
前面 4.2 讲过的空页问题就是典型:
| 环节 | 发生了什么 |
|---|---|
| 烧录时 | 编程器把镜像里全 FF 的页也照常烧进去,内部 ECC 引擎为这页算出校验码写入 spare 区 |
| 校验时 | 读回来与源文件比对 —— 全是 FF,完全一致,PASS |
| 实际上 | 该页的 spare 区已被写入 ECC 校验码,物理上不再是空白页 |
| 使用时 | 文件系统认为它是已擦除状态,直接往里编程 → 数据与 ECC 校验码不匹配 |
这个例子很好地说明了「校验 PASS」的边界:它验证的是主存储区的内容一致性,验证不了 spare 区 / OOB 区的语义正确性。
5.4 特殊区没烧到
OTP(一次性可编程区)、安全寄存器、Unique ID 这些区域,校验根本不会去比对。如果你的产品需要烧写序列号、MAC 地址、加密密钥、或依赖 OTP 里的配置,那么「校验 PASS」完全没有覆盖这部分。
5.5 那还要不要看校验
上面四类都是小概率的边界情况,绝大多数场景下校验 PASS 就是可用的。正确的态度是:把校验 PASS 当作必要条件,而不是充分条件——没通过一定有问题,通过了基本没问题,但首片要装机实跑来兜住那几个例外。
编制日 2026-08-30 · 面向产线与研发的存储芯片烧录实操参考