只读分享解决方案文档调试&解决方案📅 2026-10-14🔖 Rev 1.0⏳ 还有3日到期
🔧解决方案&应用市场分析 -> 调试&解决方案 -> 系统设计指南 -> SPI_NAND_BP块保护功能_设计方案

SPI_NAND_BP块保护功能_设计方案

同系列 · 调试&解决方案
市场&调试推荐
扫码打开本页
微信扫码

SPI NAND 块保护(BP)功能设计方案

编制日期 2026-10-14 | 版本号 Rev 1.0

从 4 位 BP / TB / WP-E 机制、上电默认整片保护、分区规划,到驱动命令、WP# 引脚与量产加锁时机的完整落地方案

先读这一条:本文所有位定义以主流通用器件为例
  • 文中寄存器位名、保护档位、命令码取自主流 SPI NAND 通用架构(如 W25N 一类),用于讲清机制;你在做的料号必须以 XTX 正式 datasheet 为准,尤其是 BP 位数、TB 极性、WP-E 与 SRP 组合表、是否存在 SR3。
  • SPI NAND 与 SPI NOR 的 BP 机制不同源(默认值、TB 极性、WP# 语义、命令码都不一样),不要互相套用。NOR 侧请看同系列《SPI NOR 块保护(BP)功能设计方案》。
  • 涉及 OTP-L / SR1-L 非易失写 1 / WP# 固定下拉 的操作不可逆,必须在小批量验证通过、量产 SOP 冻结之后再执行。
4 位
决定保护区的寄存器位
BP[3:0] + TB 方向 + WP-E 模式
整片
上电 / 出厂默认态
与 NOR 相反:默认整片保护
反向
TB 极性相对 NOR
NAND 里 TB=0 保护高地址
0 报错
保护生效时的错误反馈
擦写命令被静默丢弃,必须回读验证

结论:SPI NAND 的 BP 最反直觉的有两点:一是上电默认整片保护,新料号拿来烧录第一反应往往是「芯片不良」,其实只是没发解锁;二是TB 极性与 NOR 相反、还多了一个决定「是否禁用 Quad」的 WP-E 位。只要记住「第一件事读 SR-1、先解锁再烧、WP-E 保持 0 以保留 Quad」,NAND 的 BP 比 NOR 反而更省心。

报告总结

块保护(Block Protect,BP)是 SPI NAND 内部的一道低成本防护:它给地址空间画一条线,让跨越这条线的擦除和编程命令被静默忽略。正因为它「静默」,做错的时候往往不报错——你以为烧进去了,其实芯片早把命令丢了。

本分册只讲 SPI NAND:先讲清楚它「上电默认整片保护」这个与 NOR 完全相反的事实,再拆解 SR-1(保护寄存器)里的 4 位 BP、TB 方向、WP-E 模式选择,然后给出分区怎么规划、WP# 怎么接、驱动命令(1Fh + 寄存器地址)怎么发、产线在哪一步加锁、加锁之后 OTA 怎么办,最后是速查表与设计核查清单。

定位「为什么烧不进去」的故障排查请看同系列《写保护误触发_SR_BP位_量产排查》;SPI NOR 与并行 NOR(PPI NOR)的保护机制完全不同源,各有独立分册。

需求 1
启动固件防误擦
OTA 或产线误操作把 Bootloader 擦掉,设备变砖。用 BP 把启动区锁成只读,擦写命令对这段地址直接无效。
高发:从 NAND 直接启动的方案
需求 2
SN / MAC / 校准值防改写
SN、MAC、射频校准值一旦被覆写,整机功能异常且难以追溯。小数据走 OTP 区并在 OTP-L 锁定,无需占用 BP 档位。
高发:共用一片 NAND 的紧凑方案
需求 3
量产防误操作与一致性
NAND 上电默认整片保护,烧录站必须先发解锁流程;目标 SR 值固化进参数卡并强制回读校验。
高发:多料号共线生产
需求 4
密钥固化与安全启动配合
BP 挡不住读出,但配合 OTP 区与 UID 可做出「密钥不可改 + 固件不可改」的组合,构成轻量安全启动基础。
注意:BP 本身不提供保密性

1. BP 保护的本质:它锁住的是命令,不是数据

在动手配寄存器之前,先接受一个事实:BP 生效时芯片不报错。理解这一点,后面所有的验证方法都要围绕「回读校验」而不是「看有没有报错」来设计。

SPI NAND 的三层防护链:任何一层没做,保护就能被绕过主机擦写请求Page Program /Block Erase第 1 层 · 区域锁BP[3:0] / TB决定哪些区间拒写第 2 层 · 寄存器锁SRP1/SRP0 / SR1-L决定 SR 能不能被改第 3 层 · 硬件锁WP# 引脚电平(由 WP-E 选择语义)三层串联:只写 BP 位而 WP# 固定可写,软件随时能解锁;只拉 WP# 而 BP=全 0,等于什么都没锁。
图 1 · SPI NAND 的三层防护链:任何一层没做,保护就能被绕过

1.1 BP 锁的是命令,不是数据

BP 生效时,芯片不会拒绝你的命令、也不会报错——它照常接收地址和数据,然后在内部判断「这段地址在保护区内」,于是把这次擦除或编程直接丢弃。所以 BP 配置错误最典型的现场表现不是报错,而是「烧录工具显示成功,回读却是旧数据」。

BP 是拒绝服务,不是加密

BP 只在芯片内部拦住擦写命令,它不加密数据、不做鉴权、也不阻止读出。任何人把芯片拆下来接到编程器上,只要能改状态寄存器,保护就能被解除。需要保密性请配合 OTP 区与 UID 加密方案,需要防拆请考虑物理防护。

1.2 三层防护,缺一层就等于没锁

层次由谁决定挡住什么挡不住什么
第 1 层 · 区域锁SR-1 的 BP[3:0] / TB对保护区内地址的 Page Program、Block Erase、Chip Erase 命令对状态寄存器本身的写入
第 2 层 · 寄存器锁SR-1 的 SRP1 / SRP0,SR-2 的 SR1-L在软件层面改写保护配置(即「先解锁再擦」这条路)硬件引脚被拉到允许电平的情况
第 3 层 · 硬件锁WP# 引脚电平 + SR-1 的 WP-E 位在板状态下的一切软件解锁尝试把芯片拆下来单独烧录
最常见的设计缺陷:WP# 引脚悬空或直接上拉到可写电平

很多原理图把 WP# 留成 NC 或直接拉到 VCC,认为「反正不接就是没保护」。实际上 WP# 悬空会让引脚电平在噪声下抖动,保护状态随机翻转;而固定拉到可写电平,则意味着任何软件都能解锁 BP,第 1 层锁形同虚设。详见第 5 章的三种接法。

1.3 上电默认态:NAND 是整片保护

SPI NAND 上电 / 出厂后 BP[3:0] 处于「整片保护」编码、TB 与 SRP 取默认值,也就是整片只读、SR-1 不可随意改写。这是一个「默认保守」的设计:好处是防误擦,坏处是产线拿来第一件事必须发解锁流程,否则根本烧不进去。

与 SPI NOR 的对比(换料号时必看)

SPI NAND 上电默认 整片保护,SPI NOR 上电默认 无保护。两者方向完全相反。团队用 NOR 调通后换 NAND,第一反应通常是「料号不良 / 虚焊」,实际只是没发解锁命令。反过来从 NAND 换到 NOR,则要警惕「以为有保护、其实一片没锁」。

2. 寄存器地图:SR-1 与 SR-2 里与保护相关的位

NAND 只有两个寄存器参与保护(SR-1 管区域、SR-2 管锁与 OTP),比 NOR 的 3 个寄存器更精简,但命令码必须带寄存器地址。

SPI NAND 两个寄存器中与保护相关的位SR-1 / 保护寄存器 (Axh,0x0F 读)bit7SRP1bit6WP-Ebit5TBbit4BP3bit3BP2bit2BP1bit1BP0bit0SRP0BP 四位 + TB 方向 + WP-E 软硬件模式 + SRP 两级锁;上电默认整片保护SR-2 / 配置寄存器 (Bxh,0x0F 读)bit7OTP-Lbit6OTP-Ebit5SR1-Lbit4ECC-Ebit3BUFbit2保留bit1保留bit0保留SR1-L 永久锁定 SR-1;OTP-E 进入 OTP 访问模式;OTP-L 永久锁定 OTP 区位序遵循「fields[0]=bit0(最右)」约定;部分文档对 SRP1 / SRP0 的位序标注相反,以料号 datasheet 寄存器图为准。
图 2 · SPI NAND 两个寄存器中与保护相关的位

2.1 两个寄存器怎么读、怎么写

寄存器读命令写方式与保护相关的内容
SR-1(保护寄存器)0Fh + Axh 后读1Fh + Axh + 1 字节BP[3:0] / TB / WP-E / SRP1 / SRP0
SR-2(配置寄存器)0Fh + Bxh 后读1Fh + Bxh + 1 字节BUF / ECC-E / SR1-L / OTP-E / OTP-L
SPI NAND 的读写 SR 必须带寄存器地址

SPI NAND 不像 NOR 那样用 05h / 01h 直接读写状态寄存器,而是先发 0Fh(读)或 1Fh(写),再发寄存器地址(Axh / Bxh / Cxh),最后才是数据。漏掉寄存器地址这一步,命令会被静默丢弃,现象和「芯片锁死」一模一样。NOR 与 NAND 的命令码不要混用。

2.2 每个位的一句话解释

位所在寄存器类型一句话
BP[3:0]SR-1 bit4:1非易失保护范围档位;0000 = 无保护,101X / 11XX = 全片保护
TBSR-1 bit5非易失方向:0 = 保护高地址端,1 = 保护低地址端(与 NOR 相反)
WP-ESR-1 bit6非易失模式:0 = 软件模式(Quad 可用),1 = 硬件模式(Quad 禁用)
SRP1 / SRP0SR-1 bit7 / bit0非易失寄存器锁级别:软件 / 上电锁定 / OTP 保护三种强度
SR1-LSR-2 bit5一次性(OTP)把 SR-1 当前保护配置永久固化,不可逆
OTP-ESR-2 bit6易失进入 OTP 访问模式,才能读写 OTP 区与 Unique ID
OTP-LSR-2 bit7一次性(OTP)锁定 OTP 区(典型 10 页 × 2 KB),之后只读,不可逆
ECC-ESR-2 bit4非易失ECC 使能;影响读路径,配置保护时顺带确认
BUFSR-2 bit3非易失数据缓冲模式选择,与保护无关但写 SR 时同字节处理
WELSR-1(内部)易失写使能锁存,每次写 SR / 擦 / 写前都要重新发 06h
WEL 是易失位,别把它写进目标值

构造要写入的 SR-1 字节时,WEL 位不参与——写 SR 指令本身会自动置位。把目标值写成常量(如 0x1C)是对的;若先读回 SR 再改位,记得把无关位屏蔽后回填,避免把读到的「脏位」凑进目标字节。

2.3 容量与块结构:1 Gb 典型架构

主流 1 Gb SPI NAND(如 W25N01GV)通常组织为 1024 个 block,每块 128 KB = 64 页 × 2 KB。保护档位以「block 数量」为刻度,所以后面所有档位表都按 1024 块来算。换更大或更小的容量时,档位比例不变,但每块对应的绝对地址会变,分区边界要重新换算。

3. BP 机制与 WP-E 总开关

NAND 的 BP 有 4 位、默认整片保护、TB 极性与 NOR 相反,还多了一个决定「软硬件模式 + 是否禁用 Quad」的 WP-E 位。

3.1 把 BP 想成一把从某一端量起的尺子

TB 决定从哪一头量,BP[3:0] 决定量多长。两者必须一起算,只看 BP 四个位一定会算错——尤其 TB 极性与 NOR 相反。

位作用取值含义
BP[3:0]保护范围0000 = 无保护;101X / 11XX = 全片保护(见 3.2 表)
TB方向0 = 从高地址端起算;1 = 从低地址端起算
WP-E模式0 = 软件模式(Quad 可用);1 = 硬件模式(Quad 禁用、WP# 控锁)
SPI NAND 保护区由 TB / BP[3:0] 共同决定(档位比例非实际容量)TB=0 · BP=0001保护高地址端最小档可擦写TB=1 · BP=0001保护低地址端最小档可擦写TB=0 · BP=1001保护高半片可擦写保护区(高 1/2)TB=X · BP=101X / 11XX上电默认态:全片只读整片保护区低地址地址空间示意(比例非实际档位)高地址
图 3 · SPI NAND 保护区由 TB / BP[3:0] 共同决定(档位比例非实际容量)

3.2 保护档位速查(1 Gb / 1024 块 × 128 KB 架构)

TBBP[3:0]保护块范围保护容量占整片比例
X0000—0无保护
000011022 ~ 1023256 KB高 1/512
000101020 ~ 1023512 KB高 1/256
000111016 ~ 10231 MB高 1/128
001001008 ~ 10232 MB高 1/64
00101992 ~ 10234 MB高 1/32
00110960 ~ 10238 MB高 1/16
00111896 ~ 102316 MB高 1/8
01000768 ~ 102332 MB高 1/4
01001512 ~ 102364 MB高 1/2
10001 ~ 1001对称的低地址端同上低 1/512 ~ 低 1/2
X101X0 ~ 1023128 MB全片保护
X11XX0 ~ 1023128 MB全片保护

注意档位的跳跃性:最小档是 1/512(256 KB),然后直接跳到 1/256、1/128……想保护 384 KB,只能往上取整到 512 KB,多出来的 128 KB 会连累相邻分区。这是分区规划必须提前对齐的原因。

3.3 WP-E:软硬件模式的总开关,也是性能开关

SPI NAND 六种保护模式:WP-E 是软硬件模式的总开关① 纯软件保护SRP1,SRP0,WP-E = 0,0,0WP# 复用为 IO2,Quad 全程可用;SR-1 随时可改② 引脚参与保护SRP1,SRP0,WP-E = 0,1,0WP#=0 时 SR-1 不可改,WP#=1 时可改;Quad 仍可用③ 上电锁定SRP1,SRP0 = 1,0SR-1 锁定,掉电上电后自动回到 0,0 状态④ 硬件整片只读WP-E=1 且 WP#=GND全部写 / 编程 / 擦除被阻断,阵列与 OTP 全只读;Quad 被禁用⑤ OTP 保护模式SRP1,SRP0 = 1,1(配 OTP-E=1)允许把 SR1-L 写 1,永久锁定 SR-1 的保护配置⑥ OTP 区锁定SR-2 的 OTP-L=1OTP 区(典型 10 页 × 2 KB)永久只读,用于密钥 / SN / 校准值模式 ④ 与 Quad SPI 互斥;模式 ⑤⑥ 不可逆。
图 4 · SPI NAND 六种保护模式:WP-E 是软硬件模式的总开关

WP-E=0(软件保护模式,推荐):WP# 与 HOLD# 复用为 IO2 / IO3,Quad 编程与读取全程可用,SR-1 的写入由 SRP 位控制。绝大多数应用跑在这个模式。

WP-E=1(硬件保护模式):WP# 与 HOLD# 变成专用控制引脚,所有 Quad 功能被禁用。此时 WP# 拉到 GND,芯片的整片(含状态寄存器、存储阵列、OTP 区)进入只读;WP# 接 VCC 时才允许改 SR-1。

开硬件锁 = 放弃 Quad,启动时间会明显变长

SPI NAND 多用作启动介质,Quad 读取速度通常是 Standard SPI 的 3~4 倍。把 WP-E 置 1 意味着读固件也要降回单线,对于从 NAND 直接 XIP 或整包加载的方案,启动耗时可能翻倍。决策顺序建议:先确认能不能接受单线启动,再决定要不要开硬件锁。折中做法是 WP-E=0 + SRP 软件锁 + WP# 由 GPIO 控制(第 5 章)。

3.4 OTP 区与 SR1-L:NAND 上的不可逆手段

手段位置作用可逆性
OTP-ESR-2 bit6进入 OTP 访问模式,才能读写 OTP 区与 Unique ID / 参数页易失,可反复切换
OTP-LSR-2 bit7锁定 OTP 区(典型 10 页 × 2 KB),之后只读不可逆
SR1-LSR-2 bit5把 SR-1 当前的保护配置永久固化,上电默认值即为锁定值不可逆
设置 SR1-L 的正确顺序(顺序错了会失败)

SR1-L 不是想写就能写。必须:① 先把 SR-1 的 BP/TB/SRP 配置成最终目标值 → ② 把 SRP1,SRP0 设为 (1,1) → ③ 置 OTP-E=1 进入 OTP 访问模式 → ④ 执行写状态寄存器把 SR1-L 写 1 → ⑤ 回读确认。任何一步顺序错了,写入会被忽略,而你可能会误以为已经锁定成功。

4. 保护分区规划:先有布局,才有编码

BP 是按整片比例划线的,不是按任意地址划线。分区布局必须提前去适配 BP 档位,否则只能在「多保护一点」和「改布局」之间二选一。

4.1 从分区表反推 BP 编码的六步法

  1. 列出完整分区表:偏移、大小、是否可写、更新频率(OTP 一次 / OTA 偶尔 / 日志频繁)。
  2. 标出「必须只读」的分区:Bootloader、校准参数、SN/MAC、密钥。日志与文件系统不在此列。
  3. 检查它们在地址空间上是否连续、且紧邻某一端。这是 BP 能否成立的前提。
  4. 计算需保护的总容量占比,向上取整到最近的 BP 档位(3.2 表)。
  5. 选 TB(方向):要保护低地址端取 TB=1,高地址端取 TB=0。
  6. 核算溢出:取整后多出来的容量是否吃掉了相邻的可写分区?吃掉就必须回到第 1 步改布局。
三种典型保护分区布局:BP 只能表达「从某一端量起的连续区间」方案 A · 只锁 Bootloader关键区集中在低地址端,最容易实现Boot(保护)APP + 数据区(可擦写)方案 B · Boot + 参数区合并把需保护的数据全部挤到同一端Boot + 参数(保护)文件系统 / 日志区方案 C · 双备份 OTA(有冲突)两端都要保护 —— 单套 BP 表达不了APP 槽 AAPP 槽 B低地址地址空间示意(比例非实际档位)高地址
图 5 · 三种典型保护分区布局:BP 只能表达「从某一端量起的连续区间」

4.2 小范围保护换算(Bootloader 在低地址端,TB=1)

NAND 没有 CMP 位,不能像 NOR 那样用 CMP=1 反转语义去锁「对侧一小段」。但它档位更细(最小 1/512),锁一段低地址的小 Bootloader 反而比 NOR 容易:

BP[3:0]TB=1 时保护容量TB=1 时保护位置典型用途
0001256 KB低地址端 256 KB参数区 / 校准值
0010512 KB低地址端 512 KB小型 Bootloader + 参数
00111 MB低地址端 1 MBBootloader + 双份参数表
01002 MB低地址端 2 MB含 Recovery 的启动区
01014 MB低地址端 4 MB大固件启动区
100164 MB低地址端 64 MB半片固化(少见)

4.3 两端都要保护怎么办(方案 C 的两难)

双备份 OTA 的典型布局是:Boot 在低地址、参数区在高地址,中间两个 APP 槽轮流写。而 BP 只能表达从一端量起的连续区间,「低地址一小段 + 高地址一小段」这种两端需求,单套 BP 表达不了。四条出路:

方案做法优点代价 / 风险
① 调整布局(推荐)把参数区搬到 Boot 旁边,合并成一段连续保护区;两个 APP 槽放后面一套 BP 搞定,无需运行时切换要改动分区表与链接脚本,OTA 兼容需处理
② 运行时动态切换保护平时锁 Boot;需要写参数时由特权代码临时解开、写完立刻恢复布局不用改解锁窗口期有风险;掉电可能停在解锁态,需上电自检兜底
③ 参数区改用 OTP一次性写入 SN / MAC / 校准值,OTP-L 锁定不占 BP 档位,且不可逆更安全参数只能写一次,后续无法升级;OTP 容量小
④ 放弃保护,改软件校验参数区双备份 + CRC/序列号,读出时校验,坏了用备份恢复零硬件依赖挡不住恶意改写,只防意外损坏
优先顺序建议

能改布局就改布局(①)。布局冻结的项目,参数类小数据走 OTP(③),大数据走软件校验(④)。运行时动态切换(②)是下下策——它引入了一个「保护暂时失效」的时间窗,而这个窗口恰好是最容易被掉电打断的时刻,真要用就必须配套上电自检与恢复逻辑。

4.4 保护粒度与 OTA 的冲突

OTA 升级时要擦写 APP 槽,而 BP 的保护区是非易失的——上电就在,不会因为你在跑 OTA 就自动消失。设计时必须确认:OTA 目标地址完全落在保护区之外。一种隐蔽的失败是:分区表改过一次(APP 槽变大了),但 BP 档位没跟着调,于是新固件的尾部地址落进保护区,OTA 显示成功、重启后却是半成品。

分区表变更必须触发一次 BP 复核

把「分区表变更后重新核算 BP 编码」写进变更流程。任何一次分区大小调整、新增分区、固件体积增长超过档位边界,都要回到 4.1 的六步法重算一遍。这个动作不做,问题会在几个月后的某次 OTA 才暴露,且难以复现。

相关报告 · 交叉引用 1 器件全部展开收起 ▾
点开类目即可展开:具体文档 / 章节(点章直接跳转到该章)
SPI NAND
电路设计指南
软件设计规范
Linux 驱动开发
样机问题排查
量产问题排查4
全志平台 SPI NAND NOR
章节(点章跳转,共 11 章)
海思平台 SPI NAND 量产常见失败
章节(点章跳转,共 11 章)
烧录成功但不开机 SPI NAND
章节(点章跳转,共 12 章)
瑞芯微平台 SPI NAND eMMC
章节(点章跳转,共 11 章)
系统设计指南2