写保护误触发 · SR BP 位 量产排查
编制日期 2026-09-21 | 版本号 Rev 1.0
XTX 芯天下 · FAE 现场技术文档 | SPI NOR 状态寄存器(SR)Block Protect 位误触发 | 量产烧录 / 在板写失败 / 读回 FF | 2026-09 版
SR 位定义、BP[2:0] 编码与保护范围、写 SR 命令码全部以具体料号 datasheet 为准;本文仅展示排查机制与典型布局。
- 本文讨论的是状态寄存器 Block Protect 位误触发导致的写保护,与「烧录器找不到型号」是两件事。判别要点:烧录器能正常建工程、能烧、能校验通过,但装板写不进 / 读回 FF,就是本文范围;烧录器根本选不到型号,请查《SPI_NOR_烧录找不到型号_解决方案.html》。
- 涉及解除 SR 写保护 / 整片擦除的操作在多数器件上会触发全片擦除,属不可逆动作,见第 8 章与 FAE 结案栏的危险操作提示。
- 本文给出的位序、命令码(05h/35h/15h 读 SR、06h 写使能、01h 写 SR 等)是各厂商常见写法,并非所有器件与所有平台都一致,动手前逐条核对 datasheet。
一句话结论:「烧录能过、装板写不了 / 读回 FF / verify 失败」优先读状态寄存器—— 看 BP / SEC / TB / CMP / WPS 与 WP# 引脚电平。解保护后再烧,并把出厂默认 SR 写进参数卡。 九成以上的「写保护误触发」不是器件坏,是SR 被写错 / 没清 / 被继承,属于可完全恢复的工艺与工装问题。
这份文档解决什么
解决的是SPI NOR 量产中因状态寄存器(SR)Block Protect 位误触发,导致擦写失败、数据写不进去、读回全 FF 这一类问题的定位与根治方法。全文按「机制 → 总览 → 六类误触发 → 速查 → 防复发 → 结案」组织: 第 1 章讲清 SR 架构与 BP 保护范围,第 2 章给排查主线和八类场景汇总, 第 3~8 章逐类拆解根因与立即 / 根治动作,第 9 章是可直接翻查的速查矩阵,第 10 章与附录给出防复发与结案模板。
怎么用这份文档
- 先读 SR,再动板子:拿到一颗「写不了」的器件,第一动作是用烧录器或逻辑分析仪读 SR1/SR2/SR3, 看 BP / SEC / TB / CMP / WPS 与 WEL 位,不要一上来就换芯片或判不良。
- 抓一份「已知好板 / 好料」基线:把能正常烧录那批料的 SR 默认值、参数卡、烧录算法版本各存一份, 后面所有比对都拿它当基准。
- 用第 2 章的排查主线收敛:读 SR → 判 BP/方向/粒度 → 判 WP#/WPS → 判是否锁死 → 解保护 → 重烧 → verify → 装板实跑, 不要跳步。
- 一次只改一个变量:WREN 前置、SR 字节值、写顺序、并发锁、清座步骤每次只动一处,改完重烧验证。
- 用装板实跑闭环:任何解保护动作的最终判定,以「装板跑通 + 关键区回读 + 一次断电重启」为准,而不是烧录器显示通过。
1. 问题本质:SR 寄存器与 BP 保护机制
「写保护误触发」这句话在现场被用得太泛。它可能是 BP 位被写成了全 1(最大保护), 可能是 TB 方向反了(你以为保护顶部、实际保护了底部),可能是 SEC 粒度错了(按 4 KB 算却按 64 KB 去解), 也可能是 CMP 把整张保护表反转了。本章先把寄存器还原成机制:讲清 SR 的三组关键位、 BP 位到底保护哪段地址,然后把本文的排查对象与「烧录器找不到型号」严格切开。
1.1 状态寄存器架构
SPI NOR 通过一组状态寄存器管理写保护、Quad 模式、保护语义等运行时行为。 不同厂商把位塞进 SR1 / SR2 / SR3 三组的命名不同,但职责高度一致: SR1 管 BP 块保护与写使能,SR2 管 QE 等扩展模式,SR3 管 CMP / WPS 等保护语义反转与 WP# 引脚语义。 下图为常见布局示意,实际位号以料号 datasheet 为准。
SPI NOR 读状态寄存器通常是 05h(SR1)、35h(SR2)、15h(SR3),
返回 1 字节(部分大容量器件 SR2/SR3 也可能是不同命令或扩展读)。
命令码与返回字节数以具体 datasheet 为准,不要照抄其它厂商或型号。
| 寄存器 | 关键位(以 datasheet 为准) | 职责 | 误触发关注点 |
|---|---|---|---|
| SR1 | BP0 / BP1 / BP2、SEC、TB、SRP、WEL、BUSY | 块保护范围、保护方向、粒度、写使能 | BP 被写错 / 没清 → 整片或半片不可写 |
| SR2 | QE(Quad Enable)等扩展位 | Quad 模式使能、部分器件的保护扩展 | 改 QE 时误改 SR1,连带 BP 变化 |
| SR3 | CMP(Complement Protect)、WPS(Write Protect Select)等 | 保护语义反转、WP# 引脚语义选择 | CMP=1 把保护范围整体反转 |
1.2 BP 位的保护范围
BP[2:0] 三位决定有多少存储区域被保护,但它不是孤立的——保护区间的起点方向由 TB 位定, 粒度由 SEC 位定,语义还能被 CMP 位整体反转。四者必须一起看:
- BP[2:0]:保护块数编码,从 000(无保护)到 111(全片保护)。中间值对应「顶部 / 底部若干块」。
- TB(Top/Bottom):0 = 从顶部(高地址)开始保护;1 = 从底部(低地址)开始保护。
- SEC(Sector):0 = 按 64 KB 块计算保护粒度;1 = 按 4 KB 扇区计算(粒度更细,小区域也能精准保护)。
- CMP(Complement):1 时保护语义整体反转——原本被保护的区域变开放、原本开放的变保护。
| BP2 | BP1 | BP0 | 典型保护比例(64 块器件,TB=0、SEC=0、CMP=0) | 说明 |
|---|---|---|---|---|
| 0 | 0 | 0 | 无保护 | 全片可写(出厂默认常见目标) |
| 0 | 0 | 1 | 顶部 1/64 | 仅顶部最小块受保护 |
| 0 | 1 | 0 | 顶部 1/32 | 保护块数随编码递增 |
| 0 | 1 | 1 | 顶部 1/16 | — |
| 1 | 0 | 0 | 顶部 1/8 | — |
| 1 | 0 | 1 | 顶部 1/4 | — |
| 1 | 1 | 0 | 顶部 1/2 | — |
| 1 | 1 | 1 | 全片保护 | 等效写死,全部不可写 |
坑一:只清 BP 没看 CMP。CMP=1 时你清掉 BP 反而把整片锁死,因为语义反转后「无 BP」等价于「全保护」。 解保护前务必先读 CMP,必要时先把它清零再处理 BP。
坑二:TB 方向搞反。你以为保护的是固件区(顶部),实际 TB=1 把启动代码(底部)锁了, 于是装板直接起不来。解保护前先确认 TB 与 BP 共同决定的真实保护区。
1.3 误触发的机理
「误触发」的本质是:BP 位携带的保护状态,和当前工序期望的状态不一致。 它不来自器件缺陷,而来自写 SR 这个动作本身出错——要么没写(漏 WREN)、要么写错值(FF 全开)、 要么写了但没清(测试残留)、要么并发写乱(race)、要么从上一颗继承(清座遗漏)。 第 2 章开始把八类场景按这个机理归类。
| 机理环节 | 出了什么错 | 现场表现 | 对应类目 |
|---|---|---|---|
| 写 SR 的使能 | 没发 WREN 就 WRSR,写被忽略 | BP 停留在旧值,改不动 | 第 3 章 |
| 写 SR 的值 | 写了 FF / 错误字节 | 整片进入最大保护 | 第 4 章 |
| 写 SR 的校验 | 只校验 ID 不校验 SR | 带保护的板子被放良品 | 第 5 章 |
| 写 SR 的顺序 | SR2 先于未解锁的 SR1 | SR1 写失败,BP 非预期 | 第 6 章 |
| 写 SR 的并发 | 多线程 / 多颗竞争写 | BP 落到随机值,时好时坏 | 第 3 章 |
| 写 SR 的清理 | 清座步骤遗漏,继承上颗 | 同夹具有的过有的不过 | 第 3 章 |
把「写保护误触发」拆成三个可证伪的命题,逐个排除: ① SR 有没有被正确读出来(命令码对不对、读没读到非 FF)、 ② BP/TB/SEC/CMP 组合是不是预期值(保护区是否错配)、 ③ WP#/WPS 有没有在硬件层面把写挡住。 任何一例现场问题,都必须先回答这三个问题再动手。
2. 方案总览:排查主线与场景汇总
写保护误触发在统计上不算「器件失效」,而是工艺 / 工装 / 参数卡的协同失误: 某一步把 SR 写错了、没清、被并发写乱、或从上一颗继承。它的难点不在修复(清 BP 即可), 而在定位是哪一步、以及怎么防止整批复发。本章先把排查主线画成一张可照做的流程图, 再把八类误触发场景汇总成一张可归档的表,后面六章逐类展开。
2.1 排查主线
无论现场表现多乱,都按下面这条主线走:读 SR → 判 BP/TB/SEC/CMP → 判 WP#/WPS → 判是否锁死 → 解保护 → 重烧 → verify → 装板实跑。 每一步只回答一个是非题,不要跳步——尤其是「先读全 SR 再动手」这一步,能避免把一顆本来没锁的料号误整片擦。
「判 WP# / WPS」常被跳过。软件层面把 BP 清得干干净净,但板子上 WP# 引脚被拉低 且 WPS=0(由引脚决定), 状态寄存器照样写不进去。在板烧录失败时,WP# 电平与 WPS 位是和 BP 同等优先级的排查项,见第 7 章。
2.2 八类误触发场景汇总
下面八类覆盖产线上 SR BP 误触发的绝大多数来源。归档时先按场景定到某一类,再翻对应章节——不要一上来就逐章读。
| 场景 | 触发动作 | 现场表现 | 所属类目 |
|---|---|---|---|
| 1 | 烧录器未发 WREN(06h)直接 WRSR | SR 写不进去,BP 停留旧值 | 第 3 章 |
| 2 | 烧录器给错 SR 字节值(如默认 FF) | 整片进入最大保护,等效写死 | 第 4 章 |
| 3 | 工厂测试写 SR 后忘了恢复出厂 | 带保护状态的料物流向下工位 | 第 4 章 |
| 4 | 烧录 verify 只校验 ID 不校验 SR | 带保护的板子被当良品放走 | 第 5 章 |
| 5 | 改 QE 时把 BP 一并改了 | 切 Quad 模式后写不进 | 第 4 章 |
| 6 | SR 顺序错误:先写 SR2 后 SR1 未解锁 | SR1 写失败,BP 非预期 | 第 6 章 |
| 7 | 多线程同时改 SR 造成 race | BP 落随机值,间歇性失败 | 第 3 章 |
| 8 | 清座步骤遗漏,上一颗 BP 被继承 | 同夹具有的过有的不过 | 第 3 章 |
2.3 BP 保护范围示意
理解 BP 位到底保护哪段地址,是解保护的前提。三个控制位必须一起看:TB 定方向、SEC 定粒度、CMP 定语义。 下图给出典型 8 块器件的保护区示意与 BP 编码速览,具体比例与方向务必回到 datasheet 核对。
把 BP 想成「从顶或底数起的连续保护区」:TB 决定从哪头数,BP[2:0] 决定数几块,SEC 决定每块是 4 KB 还是 64 KB, CMP 是一面镜子——镜子里保护区和镜子外互换。解保护时,先拿掉镜子(清 CMP),再看从哪头数、数了几块。
3. 第 1 类:烧录器初始化与状态继承
这一类是工艺步骤的缺失,不是器件问题:烧录器在写 SR 这件事上「没按规矩来」, 导致 BP 保护状态不正确地保留或随机化。它覆盖场景 1(缺 WREN)、场景 7(多线程 race)、场景 8(清座遗漏继承), 三者的共同点是解保护的「正确时序」被破坏或跳过。
3.1 未发 WREN 直接 WRSR(场景 1)
SPI NOR 写状态寄存器有固定的先使能后写入时序:必须先发 06h(WREN)把 WEL 位置起来,
再发 01h(WRSR)才能真正改 SR。很多烧录算法的初始化流程里漏掉了 06h 这一步,
于是 WRSR 被器件忽略,BP 停留在上一颗 / 默认值,后续擦写全部失败——
器件本身完好,是「门没开就推」。
读 SR 发现 BP / CMP 与预期不符,但你在烧录工程里明明勾了「解保护」。抓一帧 SPI 看 WRSR 之前有没有 06h: 没有 06h,就是场景 1;有 06h 但 SR 仍没变,转向第 6 章(顺序 / 锁死)。
3.2 多线程同时改 SR 造成 race(场景 7)
烧录工装并发处理多颗、或同一颗被两条线程交替写 SR 时,如果没有对 SR 写加互斥锁, 就会出现「线程 A 发 06h,线程 B 也发 06h,线程 A 发 WRSR,线程 B 又发 WRSR」这种交错。 WEL 位是全局的,一方刚置起就被另一方清掉,最终 BP 落在随机值。这类故障间歇性、难复现, 是它最典型的特征。
| 现象 | 根因 | 怎么确认 | 处置 |
|---|---|---|---|
| 同一料号时好时坏 | 并发写 SR 无互斥锁,WEL 被交错清除 | 在多线程烧录时抓 SR 写帧,看 06h/WRSR 是否成对且不被打断 | 对 SR 写加互斥锁,单颗串行或加锁 |
| 换一批料突然全过 | 上一阶段恰好没写保护,本批继承了开放状态 | 对比上一批最后一次 SR 状态 | 每次烧前强制重读并清 SR |
| 低压 / 高温下更易出错 | race 窗口随时序抖动变大 | 在不同负载下重复烧录统计失败率 | 缩短 06h→WRSR 间隔并加锁 |
3.3 清座步骤遗漏:上一颗 BP 被继承(场景 8)
离线座(socket)烧录有一步「清空 / 初始化」:把座上上一颗留下的 SR 状态清掉、读基线。 这一步被省掉时,新料直接继承上一颗的 BP 保护,于是同一夹具出现「有的过、有的不过」—— 过的是上一颗恰好没保护的,不过的是继承了保护的。呈现方式和器件批次无关,纯看上一颗状态。
| 检查项 | 正确做法 | 怎么确认 | 常见错法 |
|---|---|---|---|
| 清座初始化 | 每次上料先读 SR 并建立基线,再决定解保护 | 在烧录日志里确认每颗都有「读 SR」记录 | 直接跳过清座,沿用上一颗状态 |
| WREN 前置 | WRSR 前必有 06h,且两者不被打断 | 抓帧确认 06h 紧邻 WRSR | 把 06h 放在别处或漏发 |
| 读回确认 | WRSR 后读回 SR 与预期值比对 | 日志里有无「SR 回读 = 预期」判定 | 写完不回读,默认成功 |
| 状态隔离 | 多颗并行时每颗独立 SR 上下文 | 查工装是否共用一个 SR 缓存 | 多颗共用一个 SR 影子值 |
3.4 立即动作与根治动作
| 动作类型 | 具体动作 | 验收标准 |
|---|---|---|
| 立即动作 | 抓一帧 SPI,确认 WRSR 之前有 06h 且紧邻 | 06h → WRSR 成对出现,中间无打断 |
| 立即动作 | 读 SR 看 BP/CMP 是否与预期一致 | 读回值与基线 / 出厂默认值逐位相符 |
| 立即动作 | 多线程工装先改为单颗串行验证,隔离 race | 串行时失败率归零 |
| 根治动作 | 在烧录算法里强制「烧前读 SR + WREN + WRSR + 读回」四步 | 任一步缺失则工程报错退出 |
| 根治动作 | 对 SR 写加互斥锁,禁止跨线程交错 | 并发压测下 SR 值稳定 |
| 根治动作 | 把清座步骤设为不可跳过,日志留痕 | 每颗都有独立的读 SR 基线记录 |
不要为了「绕过」保护而直接对带客户固件的器件做整片擦。解保护的首选是先读全 SR、确认 CMP/WPS、 再 WREN→WRSR 清 BP;只有确认 BP 是误触发且数据可重建时才擦除。涉及整片擦的不可逆操作,见第 8 章。
4. 第 2 类:SR 字节值写错
这一类是写进去的值本身就错了:不是没写,而是写了一个会把保护拉满、或残留测试状态、或牵连其它位的值。 它覆盖场景 2(默认 FF 全开 BP)、场景 3(工厂测试残留未恢复)、场景 5(改 QE 带改 BP)。 判别要点:读 SR 发现值「明显不对」——整片最大保护、或非出厂默认、或 QE 改了 BP 也变了。
4.1 默认 FF 全开 BP(场景 2)
参数卡 / 烧录工程的 SR 默认字节一旦填成 0xFF,等于把 SR1 的 BP2/BP1/BP0 全置 1、
SEC=1、TB=1 一起生效。整片进入最大保护,表现和「芯片写死」一模一样,
但器件完全健康——清掉 BP 立刻恢复。这是参数卡填写环节最高频的错法。
| 检查项 | 要求 | 怎么确认 | 常见错法 |
|---|---|---|---|
| SR 默认字节 | 填出厂已知值(通常 0x00 或 0x60),不是 0xFF | 查参数卡与烧录工程里的 SR 默认字段 | 照抄模板填成 0xFF 全 1 |
| 写后回读 | WRSR 后读回 SR 与预期逐位比 | 日志有「SR 回读 = 预期」判定 | 写完不回读,默认成功 |
| 位域隔离 | 改 QE 时只动 SR2,不波及 SR1 | 抓帧确认 SR1 未被改写 | SR1/SR2 共用脏影子值 |
| 测试收尾 | 测试结束显式写回出厂 SR | 测试用例有强制 teardown 写回 | 测试脚本缺收尾步骤 |
4.2 工厂测试写 SR 后忘了恢复(场景 3)
工厂测试阶段为了验证某功能(例如临时开保护、临时切 Quad、临时锁某区),改了 SR 却在下电前没写回出厂默认。 这颗料就带着测试残留的保护状态流到下一工位,烧录与装板都异常。它和场景 2 的区别是: 值不一定是 FF,而是某个「看起来合理但非出厂默认」的数,所以更隐蔽。
测试脚本的「teardown / 收尾」阶段必须显式写回出厂默认 SR(先 WREN 再 WRSR),并读回确认。 把这一步作为测试用例的强制收尾,缺失则用例判失败。
4.3 改 QE 时把 BP 一并改了(场景 5)
编程器在切 Quad 模式、写 SR2 的 QE 位时,如果SR1 与 SR2 分次写却共用了脏的影子值, 就可能把 SR1 也顺手改了,BP 被带上新值。现象是「换个读模式就写不进」—— 根因不是 Quad 通信,而是 BP 被这次写动作意外改动。
| 现象 | 可能原因 | 怎么确认 | 处置 |
|---|---|---|---|
| 切 Quad 后写不进 | 写 SR2 的 QE 时连带改了 SR1 的 BP | 对比切模式前后的 SR1 读值 | QE 与 BP 分寄存器独立写,回读确认 |
| 仅大容量料异常 | SEC/CMP 位在切模式时被误带 | 读 SR3 看 CMP/WPS 是否被改 | 只写目标寄存器,避免整字节覆盖 |
| 偶发保护状态漂移 | 影子寄存器未刷新,写的是旧值 | 查工装是否缓存了上一次 SR | 每次写前重新读 SR 再构造字节 |
4.4 立即动作与根治动作
| 动作类型 | 具体动作 | 验收标准 |
|---|---|---|
| 立即动作 | 读 SR 看是否整片最大保护(BP=111、SEC=1)或残留非默认值 | 读回值与出厂已知值逐位比对 |
| 立即动作 | WREN → WRSR 把 SR 写回出厂已知值,再读回确认 | 回读 = 预期,且擦写恢复正常 |
| 立即动作 | 若由 QE 改动连带引起,分寄存器独立写并回读 SR1/SR2 | 两寄存器各自符合预期 |
| 根治动作 | 参数卡 SR 默认字段强制校验,禁止 0xFF,填出厂已知值 | 参数卡导入时非已知值即报错 |
| 根治动作 | 测试脚本 teardown 强制写回出厂 SR 并回读 | 用例收尾有 SR 回读记录 |
| 根治动作 | 烧录工程对 SR 写采用「读-改-写-回读」原子操作 | 写后必回读,偏差即拦截 |