在一次 OTA 升级后调用 sync() 出现系统卡死,排查时一度怀疑是 /WP 引脚拉高导致,最终确认不是。不过借这个机会,把 SPI NOR Flash 写保护机制单独梳理了一遍。
我们做嵌入式开发,数据完整性这一关绕不开:固件怕被意外篡改,关键配置怕被误写,这时候就要靠写保护(Write Protection)兜底。本文以 Winbond W25Q256JV 数据手册 为例,把 SPI NOR Flash 的写保护原理从头捋一遍,顺带结合《嵌入式系统设计与应用》里 MSP430 外设管理的思路做对照,方便理解记忆。
/WP 引脚:锁的不是数据,是状态寄存器
W25Q256JV 数据手册中的 /WP(Write Protect)引脚是硬件写保护的物理入口。数据手册 4.3 节原文是:
"The Write Protect (/WP) pin can be used to prevent the Status Register from being written."
注意:/WP 防止的是状态寄存器被写入,而不是直接保护存储阵列。它本质上是一个“状态寄存器写保护开关”,先锁住状态寄存器,再间接把数据护住。
引脚低电平有效:
/WP = 低电平 → 硬件写保护生效
/WP = 高电平 → 硬件写保护解除
这跟 MSP430 外部中断引脚的触发思路是同一套:靠引脚电平控制内部功能模块的使能与禁用。
状态寄存器:写保护的“控制中枢”
W25Q256JV 有三个状态寄存器(SR1/SR2/SR3),写保护的核心控制位都集中在里面,可以粗略对应到 MSP430 的中断使能/标志寄存器那一类——靠不同控制位精细管理各功能模块。
SRP/SRL:/WP 引脚的“总开关”
SRP(Status Register Protect) 和 SRL(Status Register Lock) 决定 /WP 引脚是否真正生效:
| SRL |
SRP |
/WP 状态 |
描述 |
| 0 |
0 |
X(忽略) |
软件保护模式:/WP 无控制权,写使能后即可写状态寄存器 |
| 0 |
1 |
低电平 |
硬件保护模式:/WP 为低时状态寄存器锁定 |
| 0 |
1 |
高电平 |
硬件非保护模式:/WP 为高时解锁 |
| 1 |
X |
X |
电源锁定模式:状态寄存器被保护,直到下次下电上电 |
可以这么理解:SRP 有点像 MSP430 的全局中断使能位 GIE——GIE=1 时各中断源才能真正触发;同理,SRP=1 时 /WP 的电平才会真正影响状态寄存器的写入权限。
当 SRP=1 且 /WP 为低电平时,状态寄存器进入硬件保护,任何修改操作都会被拒绝。这就是“硬件写保护”的核心机制。
BP/CMP/TB:划定保护区域
BP[3:0]:保护区块的大小和位置
TB:从顶部还是底部开始保护
CMP:反转保护区域的选择
这几个位组合起来,保护范围可以从最小的 4KB 扇区一直延伸到整个 32MB 存储阵列。
WPS:两套保护方案
W25Q256JV 有两套并行的写保护方案,用 WPS(Write Protect Selection) 位切换:
- WPS=0(出厂默认):
传统的 BP/CMP/TB 区域保护
- WPS=1:
Individual Block Locks(独立区块锁)
Individual Block Locks 粒度更细:每个 64KB 块、每个 4KB 扇区都有独立的锁定位。这里有个容易忽略的点——芯片上电后所有 Individual Block Lock 位默认都是 1,也就是说整片默认处于保护状态。如果依赖这套方案,初始化时必须主动解锁要操作的区块,否则一写就失败。
软硬件协同:软件定边界,硬件执行
典型流程:
/WP 拉高,解除保护
- 软件通过 Write Status Register 配置
BP/CMP/TB 等位
/WP 拉低,启用保护
- 保护区域无法再改,直到
/WP 再次解除
写保护由此变成“软件定义边界,硬件强制执行”:软件能灵活配置保护策略,硬件 /WP 引脚提供物理层面的最后防线。这跟 MSP430 外设管理的思想一致——软件通过寄存器配置功能,硬件负责实际执行。
几个容易踩的坑
SRP 有“记忆效应”。 SRP 位是非易失的(Non-Volatile Writable),一旦设为 1,下电再上电依然保持 1。如果这时 /WP 又被拉低,芯片直接进硬件保护,软件想改状态寄存器都改不动。我之前调试时就卡在这里。
/WP 引脚会“兼职”。 Quad SPI 模式下,/WP 引脚复用作 IO2。系统同时用 Quad SPI 和写保护时,需要先处理好引脚复用冲突。
WPS=1 上电默认全锁。 前面提过,Individual Block Lock 位上电默认全为 1。依赖这套方案,初始化就必须主动解锁,别指望上电能自动放开。
文末小结
写保护机制可以概括成“三级控制、软硬协同”:
- 引脚级:
/WP 提供硬件层面的写保护使能
- 寄存器级:
SRP/SRL 决定 /WP 是否生效,BP/CMP/TB 划定保护区域
- 方案级:
WPS 在两套保护方案间切换
抓住核心就够:状态寄存器是写保护的控制中枢,所有保护策略最终都通过它的控制位定义和执行。
💗 温馨提示:真到调系统的时候,控制位配对、/WP 引脚接对,数据完整性才有基础。另外那句“记忆效应”——配置过的保护策略下电后依然生效,调试时很容易变成“隐藏陷阱”,多留个心眼。
如果你在实际项目中遇到过类似的 SPI NOR Flash 写保护坑,也欢迎来云栈社区一起交流。