SPI NOR Flash 这玩意儿,平时在项目里就是个不太起眼的小零件,原理图上一放、Layout 一画,好像就完事了。但就是这个小东西,在我做智能穿戴项目的这几年里,着实让我折腾了好几回。从早期的手环到后来的手表,几乎每一代产品都在它身上交过学费。每次出问题,现象都挺邪门——有的是休眠功耗莫名拉高,有的是固件升级到一半变砖,还有的是低温环境下偶发读错数据,甚至有一批货在生产线上贴片后就怎么都通信不上。
等到排查到最后,发现根子都出在当初选型时埋下的雷。这篇文章我就把这几年在 SPI FLASH 选型上踩过的 5 个大坑,连同我后来整理的一套实操验证清单,一并分享出来。如果你正在做智能穿戴、TWS 耳机、医疗贴片这类对体积和功耗都极度敏感的产品,这篇文章应该能帮你省下好几轮改版的折腾。
1. 先把场景说清楚:穿戴设备里 SPI FLASH 到底在扛什么活
在讲具体坑之前,有必要先对齐一下应用场景。穿戴设备和手机、路由器不一样,它对 Flash 的需求有自己非常鲜明的特点。
1.1 穿戴设备 Flash 的核心职责
智能手表或手环里,Flash 通常承担三大职责:
第一是代码存储。主控 MCU 的 XIP(原地执行)或启动代码放在这里,开机第一件事就是从那里面取指。这个用途占比不大,但对可靠性要求极高,代码一坏整机就成砖。
第二是参数存储。比如用户的运动数据、健康算法校准参数、蓝牙配对信息、GUI 配置等,这些数据的特点是单次写入量小、写入频率中等、要求掉电不丢失。
第三是OTA固件升级。这是当前穿戴产品对 Flash 容量需求暴增的最主要原因。一套完整的固件可能 1-2MB,加上要保留回滚的 A/B 双备份,Flash 容量直接奔着 8MB-16MB 去了。
1.2 穿戴场景下的特殊约束
穿戴设备的 Flash 选型,和做路由器、做机顶盒是完全两套逻辑。
体积是硬约束。一个手表主板的可用面积往往就指甲盖大小,Flash 封装稍微大一点,Layout 就要打架。功耗是重中之重,尤其是休眠电流,因为穿戴设备大部分时间都在休眠,Flash 的 standby 电流直接进系统底电流。另外,穿戴设备的生产量级通常不低,选型还得考虑供应链的稳定性和长期供货。谁也不想产品刚量产半年,Flash 厂商给你发个 EOL(停产)通知。
这套约束叠下来,SPI NOR Flash 基本是唯一解,但"唯一解"不意味着"随便选"。下面这五个坑,我就是这么一个个踩过来的。
2. 踩坑实录:五个让我改版的选型错误
2.1 坑一:只盯着容量选型,低估了双备份机制带来的隐性消耗
第一次做手表项目时,当时预估固件大小在 1.5MB 左右,本着够用再留点余量的思路,定了个 4MB 的 Flash,型号选的华邦 W25Q32。原理图、Layout 都做完了,结构都定好了,结果算法同事提了一个需求:OTA 升级需要支持断点续传和回滚。这就意味着 Flash 里至少要同时容纳两份固件镜像——当前运行版本加新下载版本。
1.5MB × 2 = 3MB,加上文件系统分区、日志区、参数区,4MB 一下子捉襟见肘。没办法,只能硬着头皮换 8MB。好在当时封装引脚兼容,PCBA 只改了 BOM,结构没动,算是不幸中的万幸。
这个坑的核心在于:穿戴设备的 OTA 策略会直接决定 Flash 的最低容量门槛。A/B 双备份已经是行业标配,有些产品还额外加了 Recovery 分区。如果选型时只看当前固件体积,不看升级策略,早晚要返工。
我后来养成的习惯是:容量 = 固件实际体积 × 2(双镜像系数) + 参数区/日志区 + 30% 冗余。这个冗余不是拍脑袋定的,而是给后续功能迭代留的口子。穿戴产品固件体积每半年涨 20% 是常态,你永远不知道算法同事下一版会加什么模型进去。
2.2 坑二:忽视了电压域匹配,导致主控和 Flash 通信不稳定
这个坑藏得比较深,因为它不是每次上电都出问题,而是偶发性的。
有一版产品主控用的是某款 1.8V IO 的 Cortex-M4 芯片,Flash 我照搬了上一个项目的型号——一颗 3.3V 供电的 SPI NOR Flash。原理图上看着没问题,Flash 的 VCC 接 3.3V,IO 引脚和主控直连,中间没加电平转换,也没串电阻。
结果就是,常温下跑得挺好的,一进高低温箱,-20℃ 环境下读 Flash 偶尔出错,概率大概在千分之一左右。起初怀疑 Flash 本身质量不行,换了好几颗料,问题依旧。最后用示波器抓了 SPI 时钟和数据的波形,才发现问题所在:主控的 1.8V 高电平输出,落在 3.3V Flash 的 VIH 阈值边缘上,电压裕量不够。低温下主控 IO 驱动能力下降,波形边沿变缓,采样点就直接翻了车。
这里涉及一个基础但关键的概念:SPI 是同步通信,主控的输出高电平必须高于从设备识别高电平的最低阈值(VIH),否则从设备可能读到不确定状态。
3.3V Flash 的 VIH 通常是 0.7 × VCC = 2.31V,主控 1.8V IO 的输出高电平按规格书看能到 1.8V 左右,看着差得不多,但实际 PCBA 上还有走线损耗、串阻压降,裕量几乎为零。
正确的解法有两种。最省事的是换一颗宽压 Flash,比如支持 1.65V-3.6V 供电的型号,VCC 可以直接用 1.8V,IO 电平自然就匹配了。另一种是加电平转换芯片或者串阻分压,但会占用 PCB 面积,在穿戴设备这种寸土寸金的地方不太划算。
我现在的选型原则是:主控 IO 电压是多少,Flash 就选同电压域的版本。比如主控是 1.8V IO,优先找 1.8V 的 Flash;3.3V IO 就选 3.3V。这个原则让我后来再没返工过。
2.3 坑三:封装选型只图好焊接,没算 Layout 的账
这是个特别典型的低级错误,但犯的人真不少。
第一代手环产品,Flash 封装我选了 SOP8——因为 SOP8 焊接工艺成熟、手工补焊方便、探针测试也容易。当时觉得这没啥问题,等 Layout 工程师开始摆件时才意识到麻烦大了。手表主板面积被电池、马达、传感器占得七七八八,留给 Flash 的区域是个长条状,宽度只有 3mm。SOP8 封装宽度有 5.3mm,压根塞不进去,最后硬是改了一版结构才放下。
后来换成了 USON8(2mm × 3mm)封装的 Flash,宽度问题直接解决。代价是 USON8 的焊盘在底部,手工补焊几乎不可能,产线不良品只能靠返修台或直接报废。但考虑到整体体积收益,这点代价是完全值得的。
封装这块,我踩过之后总结出的经验是:
- 先量 PCB 可用面积,再定封装,顺序不能反。
- 2mm × 3mm 或 3mm × 4mm 的 USON/WSON 封装适合手表、手环;4mm × 4mm 的 SOP8 适合颈戴耳机、充电仓这类空间相对宽裕的产品。
- 如果产品有屏蔽罩,还要留意 Flash 封装高度,USON8 的厚度一般在 0.55mm-0.75mm 之间,SOP8 是 1.75mm,会影响屏蔽罩内净空。
封装这事看着小,一旦定下来,后面换封装基本等于重画板子,代价非常高。
2.4 坑四:死磕读写速度,却忽略了擦除时间是真正的性能瓶颈
有阵子客户反馈 App 同步运动数据特别慢,一同步就转圈圈。排查了一圈,发现瓶颈出在 Flash 的擦除时间上。
SPI NOR Flash 的特性是:写入前必须先擦除,而擦除是按扇区(通常 4KB)或块(通常 64KB)为单位的。不同型号的 Flash,擦除时间差异巨大。举个例子,同样擦除一个 4KB 扇区,主流品牌的芯片标称典型值在 45ms-100ms 之间,但有些低端兼容料能做到 400ms 甚至更久。
数据同步场景下,App 每次需要把新增的运动记录写入 Flash。如果算法按扇区擦写,假设一次同步要擦 10 个扇区,用 50ms 擦除时间的片子,光擦除就要 500ms,再加上写入时间,用户体验就会明显卡顿。换成 400ms 擦除时间的片子,直接卡到用户骂娘。
这里补充一个理解 Flash 性能的核心公式:
单次写入总耗时 = 擦除时间 + 写入时间
写入时间 = 数据量 / 写入速度
很多工程师选型时只盯着"写入速度 104MHz 时钟、Quad 模式能跑 50MB/s"这种参数,实际到了小数据量随机写入场景,擦除时间才是那头真正的大象。
我的实操建议是:选型阶段就向原厂或代理商要 Flash 的 datasheet,重点不是看首页的"High Speed"宣传,而是翻到 AC Characteristics 章节,对比 4KB Sector Erase Time 和 Page Program Time 的典型值。同样容量、同样价位的片子,擦除时间可能差出去 3-4 倍,这个参数直接决定小数据量写入场景的体验。
2.5 坑五:忽略低功耗特性差异,休眠电流凭空多了 20 微安
穿戴产品的底电流是逐微安抠的。一个手环的休眠电流做得好能到 15μA 以下,做得不好 40μA 都打不住,Flash 往往是那个"隐形刺客"。
有一次做整机功耗测试,发现底电流比预期高了 20μA 左右。量了半天,最后用排除法定位到 Flash。进入 Deep Power Down 模式后,实测电流还是比规格书标称值高出一截。查了一圈,发现是 Flash 型号的问题——那颗料在 Deep Power Down 模式下规格书标称 5μA 典型值,但实测分散性很大,有些批次能到 15μA-20μA。
而同类产品中,另一家厂商的型号在相同模式下实测能做到个位数微安,差异非常明显。
穿戴设备里的 Flash 低功耗特性,主要看三个指标:
- Standby Current(待机电流):一般 10μA-20μA 级别
- Deep Power Down Current(深度掉电电流):低功耗型号能做到 1μA-5μA
- Power Down 模式的唤醒时间
很多初阶工程师只关注 Standby Current,忽略了 DPD 这个更低的功耗档位,甚至不知道有 DPD 模式的存在。实际上,穿戴主控在休眠前应该主动给 Flash 发 DPD 指令,让它进入深度掉电状态,这样才能把底电流压到最低。
选型时,我会直接在选型表里加上"是否支持 DPD"和"DPD 电流实测值"两列。实测比看规格书靠谱得多,因为 datasheet 标称的都是典型值,不同批次差异可能很大。
3. 我的选型实操清单:五步验证法
看完这五个坑,你可能觉得 SPI Flash 选型好复杂。其实把方法理顺了,也不难。我后来把自己的流程固化成一套五步验证清单,每个新项目都按这个走,基本没再翻过车。
3.1 第一步:容量与分区规划,先在 Excel 里把账算清
动手选型号之前,先拉一个容量需求表,这个表长这样:
| 分区用途 | 估算大小 | 说明 |
|---|---|---|
| 固件A(当前版本) | 1.5MB | 含 App 和协议栈 |
| 固件B(备份镜像) | 1.5MB | OTA 下载区 |
| Recovery | 256KB | 恢复模式 |
| 参数区 | 128KB | 算法校准、配对信息 |
| 日志区 | 256KB | 运行日志、崩溃记录 |
| 冗余 | 512KB | 功能迭代预留 |
这个例子里,总量算出来是 4.1MB,取整就选 8MB 的 Flash,留足余量。
分区规划这一步非常关键,建议直接在项目初期就定好分区表,包括每个分区的起始地址和大小,后续驱动开发和 OTA 流程都要基于这个表来设计。如果分区表在开发中期才定,很可能导致容量不够用的尴尬局面。
3.2 第二步:电气参数交叉验证,别让电压域毁掉整个设计
打开主控的 datasheet,找到 GPIO 的 VOH 和 VIH 参数,然后打开 Flash 的 datasheet,找到 VIH 和 VIL。核心是保证主控 VOH(最小值)> Flash VIH(最大值),这个不等式必须成立,而且要留足至少 10% 的裕量。
如果两边电压域不一致,有两条路:
- 换 Flash,选择宽压(1.65V-3.6V)或同电压域的型号
- 加电平转换,但穿戴设备上空间宝贵,不推荐
还有一个容易忽略的点:Flash 的工作电压范围还影响读取速度。部分型号在低电压下支持的最高时钟频率会下降,比如 3.3V 下能跑 104MHz,1.8V 下只能跑 85MHz。如果你的系统对 Flash 读取速度有硬性要求,这一步要专门确认。
3.3 第三步:对照实测功耗选型,Datasheet 只是参考
功耗不能只看规格书,必须实测。
我一般会准备一块最小系统板或者直接用 EVB,把候选 Flash 型号贴上去,用精密电源供电,分别测三个状态:
| 测试状态 | 触发方式 | 关注指标 |
|---|---|---|
| 读写状态 | 连续读/写 | 峰值电流、平均电流 |
| Standby | 片选拉高,空闲状态 | 电流值 |
| DPD | 发送 DPD 指令 | 电流值,越低越好 |
测试时要注意用同一种主控、同一块 PCB、同一测试方法,排除变量干扰。我遇到过同一颗料在不同主控板上的 DPD 电流差出 3 倍的情况,就是主控 GPIO 配置差异导致的漏电。
另外,实测时一定要看实际波形,不要只看万用表的平均值。Flash 写入瞬间的电流尖峰可能高达 20mA-30mA,如果系统电源设计余量不足,这个尖峰可能拉低电压,导致主控复位。这个问题在电池供电的穿戴设备里尤其常见,低电量时电池内阻增大,电流尖峰带来的压降更明显。
3.4 第四步:上板实测读写可靠性,尤其要做温度循环
选型阶段不能只在 EVB 上跑一跑就完事,要按产品真实使用场景做读写可靠性测试。
我的标准流程是:
温度循环测试。在 -40℃ 到 +85℃ 范围内循环,每个温度点做全地址空间的写入-读取-比对,连续跑 100 次以上。
长时间断电保持测试。写入数据后断电,放置 24 小时、72 小时、一周,重新上电读取比对,确认无数据丢失。
边界电压测试。用可调电源把 Flash VCC 调到规格书允许的最低值和最高值,分别做读写测试,确认电气边界的稳定性。
OTA 模拟测试。模拟多次 OTA 升级流程,包含异常断电、半包数据、校验失败等场景,确认 Flash 内容不会因异常流程损坏。
这套测试做完,Flash 本身的质量问题基本能暴露出来。我踩过的一个教训是:某型号新批次 Flash 在温度循环后出现个别扇区坏块,连续三批都有,后来查出来是原厂工艺调整导致的质量波动。碰巧在测试阶段发现了,但凡这批货流到量产,售后会非常难看。
3.5 第五步:供应链和长期供货审查,别让产品死在缺料上
硬件工程师选型时,很容易只盯着技术参数,忽略了供应链维度。实际上,Flash 这类通用元器件的供应链风险非常高,尤其是消费电子市场波动大的年份。
我在第五步会专门确认三件事:
- 供货来源是原厂还是代理商,有没有多源替代方案
- 原厂的 EOL 风险和政策,一般看 PCN(产品变更通知)频率
- 如果选了二线或国产 Flash 品牌,有没有备用料可以 pin-to-pin 兼容
关于 pin-to-pin 兼容,这里多说一句。NOR Flash 行业有一个事实标准——华邦 W25Q 系列几乎是全行业兼容的参考设计。大部分国产 Flash 品牌,比如兆易创新的 GD25 系列、武汉新芯的 XM25 系列,引脚定义和指令集都尽量做到兼容 W25Q 系列。这意味着选型时可以把 W25Q 作为基准,同时验证一颗国产替代料。一旦主料缺货或涨价,BOM 里直接切换备料,硬件不用改动。
但"兼容"不等于"完全一致",不同品牌的 status register 定义、独有指令、默认读模式可能存在细微差异。驱动层面最好做一层抽象,不直接操作裸指令,而是通过统一的驱动接口去适配不同品牌。这个我在前面几个项目里都踩过坑——软件写死了某品牌的指令序列,切备料后某些功能就不正常了。
4. 大厂选型思路参考与主流型号梳理
做完这套清单,你可能想比较一下主流厂商的型号。我把自己用过或者调研过的几个系列整理一下,给你作个参考,但注意,这不是推荐你照抄,而是提供一套横向比较的量尺。
4.1 华邦 W25Q 系列:兼容性标杆
华邦是 SPI NOR Flash 的绝对龙头,W25Q 系列覆盖了从 512KB 到 128MB 的全系列容量,市场占有率极高。它的优势在于:
- 指令集是行业事实标准,几乎所有主流的 MCU SPI Flash 驱动库原生支持
- 封装配列齐全,SOP8、USON8、WSON8、TFBGA 都有
- 供货稳定,渠道成熟,代理商多
缺点也很明显:价格相对较贵,而且因为用量大,市场缺货时往往是第一波被涨价或被砍单的料。
穿戴设备常用的型号有 W25Q32JV(4MB)、W25Q64JV(8MB)、W25Q128JV(16MB)。其中 W25Q64JV 是 8MB 的畅销主流款,JV 后缀代表 1.8V 版本,对应低电压平台。
4.2 兆易创新 GD25 系列:国产替代主力
兆易创新是国产 NOR Flash 的头部厂商,GD25 系列和 W25Q 系列基本 pin-to-pin 兼容,指令集也高度一致。价格通常比华邦低 10%-20%,在消费类产品里性价比优势明显。
我在多个项目里用 GD25 系列做华邦的备选料,直接无缝切换。但要注意,GD25 的某些细分型号在最高时钟频率和 DPD 电流上和 W25Q 略有差异,选型时要以具体型号规格书为准,不能按系列一概而论。
4.3 其他需要考虑的选手
武汉新芯 XM25 系列,定位和华邦兼容,价格和兆易差不多,也是备选梯队成员。Adesto(现已被 Dialog/Renesas 收购)的 AT25 系列,低功耗表现不错,部分型号在 DPD 电流上做得极低,适合对功耗极其敏感的医疗贴片类产品。Micron 的 N25Q 系列,属于高端市场,性能和可靠性指标都很强,适用于工业级或车规级应用,价格也明显更高。
| 品牌 | 系列 | 容量范围 | 电压域 | 特点 |
|---|---|---|---|---|
| 华邦 | W25Q | 512KB-128MB | 1.8V/3.3V | 行业兼容标杆 |
| 兆易创新 | GD25 | 1MB-128MB | 1.8V/3.3V | 国产替代首选 |
| 武汉新芯 | XM25 | 1MB-64MB | 1.8V/3.3V | 性价比突出 |
| Adesto | AT25 | 256KB-64MB | 1.8V/3.3V | 低功耗优等生 |
| Micron | N25Q | 8MB-512MB | 1.8V/3.3V | 高端工业/车规 |
选型或替代时别看品牌,看具体型号的 AC 参数,特别是擦除时间、写保护行为、Status Register 默认值这些细节。不同品牌默认的 QE(Quad Enable)位状态可能不同,这在切换 Quad 模式时会踩坑,驱动里最好有显式的 QE 位配置流程。
5. 软硬件联调中的隐藏细节:从 PCB 到驱动的三层防线
选型做对了,只算成功了一半。真正量产顺利,还需要 PCB 设计和驱动层配合。这算是我在多次量产后总结的"三层防线"概念。
5.1 第一层防线:PCB Layout 的旁路电容与走线
Flash 的 VCC 引脚旁必须有一颗 0.1μF 的陶瓷电容,而且要尽可能靠近 VCC 引脚放置。Flash 在写入时的瞬态电流变化很快,旁路电容太远,寄生电感会削弱滤波效果。
我实测过:电容放在 3mm 以外和紧贴引脚,写入时的电源噪声幅度差异大约 30%-50%。对于低电压版的 Flash(1.8V 供电),这个差异可能直接触发欠压复位。
SPI 走线也要注意,时钟线(CLK)和数据线(MOSI/MISO)不要并行走太长,避免串扰。穿戴设备 PCB 空间紧张,走线一般不会太长,但如果 Flash 放得离主控比较远,中间加一个 GND 隔离走线是值得的。
5.2 第二层防线:驱动层要跨品牌兼容
驱动层不能把某个品牌的特性写死。SPI Flash 驱动里最容易踩的坑包括:
- 读 ID 指令(0x9F)返回的厂商 ID 和器件 ID,不同品牌的值不同,驱动里要用查表法适配
- Status Register 的位定义不同品牌可能有差异,尤其是 WIP(写进行中)位和 QE 位
- 部分品牌的 Flash 上电后默认是标准 SPI 模式,需要额外发指令才能启用 Quad 模式,驱动里要先检测当前模式再切换
在驱动的初始化阶段,统一执行一轮"读 JEDEC ID → 按 ID 配置指令集 → 使能 Quad → 测试读写"的流程,基本能覆盖 90% 的兼容性问题。
5.3 第三层防线:产品级测试要设计 Flash 专项用例
产品级的量产测试和可靠性测试,Flash 相关用例建议包含这几项:
- 全地址空间读写比对,确认容量和坏块情况
- 擦写寿命验证,对关键参数区做 10 万次擦写测试(一般 NOR Flash 标称寿命就是 10 万次)
- OTA 断点续传测试,模拟异常断电
- DPD 指令进出的电流测试,确认量产设备的底电流一致
这套测试用例我一般会放进产测固件里,生产时每台设备出厂前自动跑一遍,不需要额外人力,但能把有问题的 Flash 在出厂前拦截下来。
6. 常见选型与测试问题排查速查表
最后整理一份速查表,把前面提到的关键检查点和判断标准集中放一起,方便你实际工作时对照:
| 问题现象 | 可能原因 | 排查方向 | 解决建议 |
|---|---|---|---|
| 上电后主控读不到 Flash ID | 电压域不匹配、IO 电平不兼容 | 用示波器量 CLK/MOSI/MISO 波形 | 检查 Flash VCC 电压,确认和主控 IO 电平匹配 |
| 偶发读写数据错误 | 电源噪声、信号质量差、Flash 质量 | 抓 SPI 波形,检查 VCC 纹波 | 优化旁路电容位置,降 SPI 时钟频率,更换 Flash 品牌 |
| 底电流偏高 | Flash 未进入 DPD、DPD 电流偏大 | 实测 DPD 电流,查 GPIO 配置 | 调整休眠流程,主动发 DPD 指令,更换低功耗型号 |
| OTA 升级失败率高 | 容量规划不足、擦写寿命不够 | 查看日志分区报错,跑擦写测试 | 调整分区策略,换成大容量或高寿命型号 |
| 低温下读写不稳定 | 电压裕量不足、Flash 低温特性差 | 做温度循环测试,量低温下电源波形 | 更换宽压型号,优化电源设计 |
| 量产缺料 | 单一货源 | 提前做多源验证 | 选 pin-to-pin 兼容的多品牌备料 |
这张表其实就是前面所有内容的高度浓缩,你选型时可以把每一行都当成一个 check item,逐条过一遍,基本不会漏项。
关于 SPI Flash 选型这件事,我个人的体会是:它不像主控、传感器那样是项目的明星器件,但它是那种"选对了你觉得理所当然,选错了能让你连续加班好几周"的暗坑零件。穿戴产品的工程难点往往不在于某个高大上的算法,而在于把这些看似简单的细节都抠到位。
最后分享一条实战技巧:每次选型时,BOM 里务必规划一个 pin-to-pin 兼容备选料,而且一定要在项目早期就用主备两套料各打一批板子做验证。等量产后才验证备料,时间窗口往往已经不允许你从容切换了。这个小习惯,价值远远超过它表面看起来的成本。