SPI NOR Flash 电路设计指南
Standard / Dual / Quad / QPI / DTR 五种模式 · XIP 片内执行 · Deep Power-Down 低功耗 · 高速 Layout | 编制日期 2026-09-21 | 版本号 Rev 1.0
0 · 文档说明
适用范围
- 本文针对串行 NOR Flash(SPI NOR)的硬件电路设计,覆盖 512 Kb ~ 2 Gb 常见容量段,接口为 1 / 2 / 4 线 SPI。
- 适用对象:MCU / SoC / FPGA 的启动存储(Boot ROM)、XIP 代码执行、字库与图片资源、参数与日志区。
- 内容包含:选型对比、封装引脚、电气参数、模式与速率、电源与低功耗、典型电路(内联原理图)、Layout、可靠性、生产、排查与检查清单。
- 不包含:文件系统实现、FTL 算法、具体厂商寄存器全表。寄存器与时序一律以目标型号 datasheet 为准。
本系列其他文档
| 文档 | 器件类型 | 关注重点 |
|---|---|---|
| SPI NOR 电路设计指南 本文 | 串行 NOR Flash | Quad/QPI 提速、dummy cycles、XIP、DPD 低功耗 |
| SPI NAND 电路设计指南 | 串行 NAND Flash | 页/块管理、片内 ECC、坏块表、主机 FTL |
| 并行NAND (PPI NAND) 电路设计指南 | 8/16 位并行 NAND | 宽总线时序、ECC 引擎、40+ 引脚 Layout |
| eMMC 电路设计指南 | eMMC 5.0/5.1 | HS200/HS400、1.8 V VCCQ、DS 选通与等长 |
| SD NAND 电路设计指南 | 贴片式 SD NAND | SPI/SDIO 双模式、无休眠指令、VCC 负载开关断电 |
| NAND MCP 电路设计指南 | 多芯片合封存储 | 多 die 与多 CE、双电源轨、HDI 扇出 |
| 并行NOR (PPI NOR) 电路设计指南 | 并行 NOR Flash | 异步读时序、XIP、等待周期、总线扩展 |
| PSRAM 电路设计指南 | 伪静态 RAM | OPI/HyperBus、刷新与延迟周期、XIP 与帧缓存 |
| DDR2 电路设计指南 | DDR2 SDRAM | SSTL_18、T 分支拓扑、VTT 端接、ODT |
| DDR3 电路设计指南 | DDR3 / DDR3L | Fly-by 拓扑、write leveling、动态 ODT |
| DDR4 电路设计指南 | DDR4 SDRAM | POD12、bank group、DBI、2D 训练 |
| DDR5 电路设计指南 | DDR5 SDRAM | 双子通道、On-DIMM PMIC、DFE、同帧 ECC |
| EEPROM 电路设计指南 | EEPROM | I²C/SPI 接口、上拉电阻与总线电容、页写与写保护 |
需要随机读 / 片内执行(XIP)/ 免坏块管理→ SPI NOR。需要 128 MB 以上且成本敏感→ SPI NAND 或 SD NAND。需要跑操作系统 + 大容量→ eMMC。SPI NOR 的短板是写速度慢、每 MB 成本最高;长板是接口最简单、随机读最快、无坏块。
1 · 器件基础
1.1 定位与选型对比
| 对比项 | SPI NOR | SPI NAND | 并行 NAND | eMMC | SD NAND |
|---|---|---|---|---|---|
| 常见容量 | 512 Kb ~ 2 Gb (64 KB ~ 256 MB) | 1 Gb ~ 8 Gb (128 MB ~ 1 GB) | 1 Gb ~ 64 Gb | 4 GB ~ 512 GB | 128 MB ~ 8 GB |
| 接口 | SPI 1/2/4 线 | SPI 1/4 线 | 8/16 位并口 | MMC 1/4/8 位 | SPI / SDIO 1/4 位 |
| 引脚数 | 8 | 8 | 40 ~ 63 | 153 / 169 BGA | 8 (LGA) |
| 随机读 | 优字节级寻址 无页载入延迟 | 差 页载入 25 ~ 100 µs | 差 页载入 25 ~ 60 µs | 中 控制器缓存 | 中 控制器缓存 |
| 顺序读速度 | 6 ~ 104 MB/s | 10 ~ 40 MB/s | 20 ~ 200 MB/s | 100 ~ 400 MB/s | 5 ~ 25 MB/s |
| 写速度 | 0.1 ~ 0.5 MB/s | 1 ~ 5 MB/s | 5 ~ 40 MB/s | 20 ~ 200 MB/s | 2 ~ 10 MB/s |
| 最小擦除单位 | 4 KB 扇区 | 128 KB 块 | 128 ~ 512 KB 块 | 控制器管理 | 控制器管理 |
| XIP 片内执行 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 |
| 坏块管理 | 无需出厂全好块 | 主机负责 含出厂坏块表 | 主机 FTL | 器件内部 | 器件内部 |
| ECC | 不需要 (部分型号内建) | 片内 ECC + 主机校验 | 主机 ECC 引擎 | 内部 | 内部 |
| 单位成本 | 最高 /MB | 中低 | 最低 /GB | 低 /GB | 中 |
| 典型用途 | 启动代码、XIP、字库、参数 | 中大容量代码 + 数据 | 大容量数据 | OS + 大容量 | 贴片替代 TF 卡 |
① 随机读 / XIP:NOR 阵列可按字节随机寻址,配合主控 QSPI 控制器的 memory-mapped 模式,代码可直接从 Flash 取指执行,无需先搬到 RAM,能显著省 RAM 与启动时间。
② 无坏块、无需 FTL:出厂全好块,软件模型简单(擦除 → 编程 → 读),是 Bootloader 的首选载体。
常见型号与厂商
| 厂商 | 典型系列 | 电压 | 备注 |
|---|---|---|---|
| Winbond 华邦 | W25Q / W25X 系列(W25Q64、W25Q128、W25Q256) | 3.3 V / 1.8 V(W25Q..JW) | 市占最高,生态最好,QE 多在 SR2[1] |
| GigaDevice 兆易创新 | GD25Q / GD25LQ / GD25WQ | 3.3 / 1.8 / 宽压 | 与 W25Q 高度 pin-to-pin 兼容 |
| Macronix 旺宏 (MXIC) | MX25L (3 V) / MX25U (1.8 V) / MX25R (超低功耗) | 3.3 / 1.8 / 宽压 | QE 常在 SR1[6],与华邦不同 |
| ISSI | IS25LP (3 V) / IS25WP (1.8 V) | 3.3 / 1.8 | QE 常在 SR1[6] |
| Micron 美光 | MT25Q / N25Q | 3.3 / 1.8 | 无独立 QE 位,用增强型易失配置寄存器 |
| Infineon / Cypress | S25FL / S25FS | 3.3 / 1.8 | QE 常在 CR1[1],扇区结构可配置 |
| Boya 博雅 | BY25Q | 3.3 / 宽压 | 国产替代,多兼容 W25Q |
| XTX 芯天下 | XT25F | 3.3 / 1.8 / 宽压 | 国产替代,多兼容 W25Q |
| Puya 普冉 | PY25Q | 3.3 / 宽压 | 国产替代,小容量性价比高 |
| Fudan Micro 复旦微 | FM25Q / FM25W | 3.3 / 宽压 | 国产替代 |
多数厂商在 SOP-8 / WSON-8 上引脚一致,但QE 位位置、dummy cycle 默认值、SFDP 内容、4 字节地址进入方式、软复位支持、块保护位定义经常不同。做二供替代时必须逐条比对,并在软件里用 0x9F 读到的 JEDEC ID 分支处理。
1.2 封装与引脚定义
上图是绝大多数八脚 SPI NOR 的排布,但不能当成通用定义直接建库。实际差异至少包括:
· 第 7 脚可能是 HOLD#、RESET#、HOLD#/RESET# 复用,也可能是纯 IO3;
· 部分 1.8 V 或大容量型号第 7 脚定义为 RESET# 且低电平会直接复位,若沿用 HOLD# 的处理方式会导致莫名复位;
· 少数型号存在 NC 或 VPP 等特殊脚;BGA-24 的球脚定义与八脚封装完全不同。
规则:每一个新型号都必须逐脚核对目标 datasheet 的 Pin Configuration 章节,并在原理图库里标注型号与文档版本号。
引脚功能表(八脚封装)
| 脚位 | Standard 名称 | Quad 复用 | 方向 | 说明与设计要求 |
|---|---|---|---|---|
| 1 | CS#(/CS、CE#) | — | 输入 | 片选,低有效。必须 10 kΩ 上拉到 VCC,保证上电与主控 IO 未初始化期间不被误选中 |
| 2 | DO(SO、MISO) | IO1 | 输出 → 双向 | 数据输出;Dual/Quad 下变为双向 IO1 |
| 3 | WP#(/WP) | IO2 | 输入 → 双向 | 硬件写保护,低有效(配合 SRP/SRL 位)。建议 4.7 ~ 10 kΩ 上拉或由 GPIO 控制 |
| 4 | GND(VSS) | — | 电源 | 地,短粗走线直连地平面 |
| 5 | DI(SI、MOSI) | IO0 | 输入 → 双向 | 数据输入;Dual/Quad 下变为双向 IO0 |
| 6 | CLK(SCK、SCLK) | — | 输入 | 串行时钟。不上拉,串 33 Ω(与其余信号线取值一致) |
| 7 | HOLD# 或 RESET# | IO3 | 输入 → 双向 | 暂停传输 / 硬件复位(按型号确认)。建议 4.7 ~ 10 kΩ 上拉或由 GPIO 控制 |
| 8 | VCC(VDD) | — | 电源 | 电源,0.1 µF 紧靠此脚 + 4.7 ~ 10 µF bulk |
一旦启用 Quad / QPI,第 3 脚与第 7 脚被复用为 IO2 / IO3 数据线,WP# 硬件写保护与 HOLD# 暂停功能同时失效。因此:
· 若产品必须保留硬件写保护,只能用 Standard / Dual 模式,或改用软件保护(BP 块保护位 + SRL 状态寄存器锁定 + 个别扇区永久锁定);
· 若第 7 脚是 RESET#,启用 Quad 后硬件复位能力也随之消失,只能依赖软复位 0x66 + 0x99 或整机断电;
· 上述两点在 Bootloader 设计时必须提前决策,不要等到量产阶段再改。
常见封装
| 封装 | 本体尺寸 | 脚距 | 特点与适用 |
|---|---|---|---|
| SOP-8 150 mil | 约 3.9 × 4.9 mm | 1.27 mm | 最常用,手焊/返修友好,样机首选 |
| SOP-8 208 mil | 约 5.3 × 5.2 mm | 1.27 mm | 老型号大容量常用,面积大 |
| WSON-8 6 × 5 | 6.0 × 5.0 mm | 1.27 mm | 薄型无引线,底部有散热/接地焊盘,面积省 |
| WSON-8 8 × 6 | 8.0 × 6.0 mm | 1.27 mm | 大容量常见,同样带底部焊盘 |
| USON-8 / XSON-8 | 约 4.0 × 3.0 mm(部分 2 × 3 mm) | 0.8 mm | 超小型,1.8 V 与穿戴产品常用,需精细 SMT |
| BGA-24 (TFBGA) | 约 8.0 × 6.0 mm | 球距 1.0 mm | 256 Mb 以上大容量常见,球脚定义与八脚封装完全不同 |
| DFN-8 / SOT-23-8 | 因厂商而异 | — | 小容量特殊型号,需单独核对 |
底部大焊盘的处理各厂商标注不同:多数标为可接地或悬空,少数明确要求必须接 GND,也有标为 NC 且不允许接地的。做封装库前必查手册;不确定时优先接地并打 2 ~ 4 个过孔,同时确认手册未禁止。
1.3 关键电气参数
| 参数 | 典型范围 | 说明 |
|---|---|---|
| VCC — 3.3 V 系 | 2.7 ~ 3.6 V | 最主流,与 3.3 V 主控直连 |
| VCC — 1.8 V 系 | 1.65 ~ 2.0 V | 低功耗/高速型号,需 1.8 V IO 主控 |
| VCC — 宽压系 | 1.65 ~ 3.6 V | 兼容性最好,选型优先(如 W25Q..JW、MX25R、XT25F..B) |
| VIH / VIL | ≥ 0.7 × VCC / ≤ 0.3 × VCC | 部分型号为 0.65 / 0.35 × VCC,以手册为准 |
| 最高时钟 | 50 / 80 / 104 / 133 / 166 MHz | 速率档位;低压档常有降额(如 1.8 V 下限频) |
| 读电流 ICC(read) | 15 ~ 25 mA @ 104 MHz Quad | 低频/单线时明显更低 |
| 编程 / 擦除电流 | 20 ~ 35 mA | 峰值可更高,bulk 电容必须留足 |
| 待机电流 ISB | 10 ~ 50 µA | CS# 高、时钟停止 |
| Deep Power-Down | 1 ~ 15 µA | 执行 0xB9 后;超低功耗型号可 < 1 µA |
| 页大小 | 256 B | 编程的最大连续单位,不可跨页 |
| 扇区 / 块 | 4 KB / 32 KB、64 KB | 最小擦除单位为 4 KB 扇区 |
| 页编程时间 | 0.4 ~ 3 ms(typ 0.7 ms) | 256 B 满页 |
| 扇区擦除 (4 KB) | 30 ~ 100 ms(typ 45 ms) | 最坏值差异大,超时判定要按 max |
| 块擦除 (32/64 KB) | 150 ~ 500 ms(typ 200 ms) | — |
| 整片擦除 | 20 ~ 200 s(按容量) | 量产烧录尽量避免 |
| 擦写耐久 | 100 000 次 / 扇区 | 参数区必须做磨损均衡 |
| 数据保持 | 20 年 @ 常温 | 高温显著缩短 |
| tVSL(上电到首指令) | 数十 µs 量级 | VCC 达 VCC(min) 后必须等待 |
| tRES1 / tRES2(DPD 唤醒) | 3 ~ 100 µs 量级 | 唤醒到可接受指令 / 可读的恢复时间 |
| 工作温度 | -40 ~ 85 / 105 / 125 °C | 车规与工业级注意速率降额 |
2 · 接口与工作模式
2.1 六种模式对比
| 模式 | 占用引脚 | 线宽记法 命令-地址-数据 | 典型读命令 | 需 QE | 关键说明 |
|---|---|---|---|---|---|
| Standard SPI | CS#、CLK、DI、DO(4 线) | 1-1-1 | 0x03 Read0x0B Fast Read | 否 | 兼容性最好;0x03 通常限 33 ~ 50 MHz,提速须用 0x0B |
| Dual SPI | + IO0/IO1 双向 | 1-1-2(0x3B)1-2-2( 0xBB) | 0x3B / 0xBB | 否 | 数据段 2 线;不占用 WP#/HOLD#,保留写保护,是折中方案 |
| Quad SPI | CS#、CLK、IO0 ~ IO3(6 线) | 1-1-4(0x6B)1-4-4( 0xEB) | 0x6B / 0xEB | 是 | 命令仍 1 线;WP#/HOLD# 变数据线,硬件保护失效 |
| QPI | 同 Quad(6 线) | 4-4-4 | 0x38 进入0xFF 退出 | 是 | 命令/地址/数据全 4 线,命令开销从 8 clk 降到 2 clk;进入后指令编码变化,须记得退出 |
| DTR / DDR | 同 Quad(6 线) | 1-4-4D / 4-4-4D | 0xED / 0xEE(按型号) | 是 | 时钟双沿传输,同频率吞吐翻倍;对等长、阻抗、dummy 配置最敏感,非必要不用 |
| Octal SPI / OPI | CS#、CLK、IO0 ~ IO7(10 线) + DQS、RESET# | 1-8-8 8-8-8(OPI) | 按型号,见 SFDP | 是 | 数据段 8 线,166 MHz 约 166 MB/s、DTR @ 200 MHz 可达 400 MB/s;需 SOP-16 / BGA-24 封装且主控带 OSPI 控制器,命令集与 Quad 不兼容,详见 4.3 |
横向长度 = 完成一次“读 4 字节”所需的总时钟周期数,越短越快。可以看出:
· 0x03 → 0x0B 增加了 8 个 dummy 周期,但换来了成倍的最高频率上限,净收益为正;
· 从 0x6B(1-1-4)到 0xEB(1-4-4),地址段也走 4 线,48 clk 降到 28 clk,小块随机读提升最明显;
· QPI(4-4-4)把命令段从 8 clk 压到 2 clk,对大量小包随机读 / XIP 取指收益最大,对长顺序读几乎没有区别;
· 数据量越大,命令+地址+dummy 的固定开销占比越小,所以顺序长读时各模式差距趋近于纯线宽比。
2.2 速率与吞吐计算
| 时钟频率 | ×1 Standard | ×2 Dual | ×4 Quad / QPI | ×4 DTR(双沿) |
|---|---|---|---|---|
| 50 MHz | 50 Mbps / 6.3 MB/s | 100 Mbps / 12.5 MB/s | 200 Mbps / 25 MB/s | 400 Mbps / 50 MB/s |
| 80 MHz | 80 Mbps / 10 MB/s | 160 Mbps / 20 MB/s | 320 Mbps / 40 MB/s | 640 Mbps / 80 MB/s |
| 104 MHz | 104 Mbps / 13 MB/s | 208 Mbps / 26 MB/s | 416 Mbps / 52 MB/s | 832 Mbps / 104 MB/s |
| 133 MHz | 133 Mbps / 16.6 MB/s | 266 Mbps / 33 MB/s | 532 Mbps / 66.5 MB/s | 1064 Mbps / 133 MB/s |
| 166 MHz | 166 Mbps / 20.8 MB/s | 332 Mbps / 41.5 MB/s | 664 Mbps / 83 MB/s | 1328 Mbps / 166 MB/s |
吞吐计算示例
// 理论峰值(只看数据段)
Quad @ 104 MHz : 104 MHz × 4 bit = 416 Mbps ; 416 / 8 = 52 MB/s
Quad @ 133 MHz : 133 MHz × 4 bit = 532 Mbps ; 532 / 8 = 66.5 MB/s
DTR Quad @ 104 MHz : 104 × 4 × 2 = 832 Mbps ; 832 / 8 = 104 MB/s
// 实际有效吞吐(含命令/地址/dummy 开销),0xEB Quad I/O @ 104 MHz
帧开销 = 命令 8 clk + 地址 6 clk + M/dummy 6 clk = 20 clk
一个时钟 = 1 / 104 MHz = 9.6 ns
读 4 字节 : 数据 8 clk → 共 28 clk = 269 ns → 4 B / 269 ns ≈ 14.9 MB/s
读 256 字节 : 数据 512 clk → 共 532 clk = 5.12 µs → 256 B / 5.12 µs ≈ 50 MB/s
读 4 KB : 数据 8192 clk → 共 8212 clk = 79 µs → 4096 B / 79 µs ≈ 51.8 MB/s
如上所示,同样是 104 MHz Quad,4 字节随机读只有约 15 MB/s,256 字节起才接近 50 MB/s。XIP 取指多为小突发,实际取指带宽远低于峰值——这也是主控 QSPI 控制器普遍带 Cache、以及 QPI(把命令开销从 8 clk 压到 2 clk)在 XIP 场景更有价值的原因。此外还要扣除主控 QSPI 控制器自身的 CS# 建立/保持与总线仲裁开销。
2.3 模式切换流程
/* ---------- 阶段 1:上电与识别(必须在低速下完成,建议 ≤ 20 MHz) ---------- */
1. VCC 上升到 VCC(min),等待 tVSL(数十 µs) // CS# 由 10k 上拉保持高
2. (可选) 发 0xAB 唤醒 // 防止器件停留在 Deep Power-Down
3. 0x9F 读 JEDEC ID → 得到 制造商ID + 器件ID(2B) // 校验型号,分支处理
4. 0x05 读 SR1,确认 WIP(bit0) = 0 // 器件空闲
5. (推荐) 0x5A 读 SFDP,取容量/擦除粒度/dummy 配置 // 做通用驱动的正确姿势
/* ---------- 阶段 2:使能 Quad(QE 位) ---------- */
6. 读 QE 所在寄存器 // Winbond/GD 多为 0x35 读 SR2,MXIC/ISSI 多为 0x05 读 SR1
7. 若 QE = 0 :
0x06 // 写使能 WREN,置 WEL=1
0x31 <SR2 | 0x02> // 写 SR2,置位 SR2[1]=QE(Winbond/GD 典型)
// 或 0x01 <SR1 | 0x40> 置 SR1[6](MXIC/ISSI 典型)
// 或 0x01 <SR1><SR2> 两字节一起写(部分型号只支持这种)
0x05 轮询直到 WIP = 0 // 写状态寄存器也需要时间(约 10~50 ms)
8. 回读确认 QE = 1 // 不回读=埋雷
/* ---------- 阶段 3:配置 dummy cycles 并提速 ---------- */
9. 按目标频率设置 dummy cycles // 部分型号写配置寄存器,部分型号固定值
10. 提高 SCK 到目标频率
11. 用 0x6B(1-1-4)或 0xEB(1-4-4)读;先读一段已知内容校验
/* ---------- 阶段 4(可选):进入 / 退出 QPI ---------- */
12. 0x38 进入 QPI // 之后所有命令都是 4 线,指令时序变化
13. 0xFF 退出 QPI // 复位/重启前务必退出,否则再上来读不到 ID
/* ---------- 阶段 5(>128 Mb 器件):4 字节地址 ---------- */
14. 0xB7 进入 4 字节地址模式 // 容量 > 16 MB 必须,否则只能访问低 16 MB
15. 0xE9 退出 4 字节地址模式
// 也可用带 4 字节地址的专用命令(0x13/0x0C/0x6C/0xEC)避免模式切换
使用 Quad / QPI 前必须置位状态寄存器中的 QE(Quad Enable)位,否则 IO2 / IO3 仍是 WP# / HOLD#,芯片不会驱动这两根线,读回来就是乱码或全 0xFF。常见位置:
| 厂商 / 系列 | QE 位位置 | 写入命令 |
|---|---|---|
| Winbond W25Q(多数) | SR2[1](S9) | 0x31 写 SR2,或 0x01 写两字节 |
| GigaDevice GD25Q(多数) | SR2[1] | 0x31 / 0x01 |
| Macronix MX25L / MX25U(多数) | SR1[6] | 0x01 写 SR1 |
| ISSI IS25LP / IS25WP | SR1[6] | 0x01 |
| Infineon / Cypress S25FL | CR1[1](配置寄存器) | 0x01 写 SR1+CR1 |
| Micron MT25Q | 无独立 QE 位 | 增强型易失配置寄存器 0x61 / 0x65 |
| XTX / BY / PY / FM(多数) | 多为 SR2[1] | 0x31 / 0x01,仍需逐型号核对 |
另注意 QE 位可能是非易失(掉电保持)的,写一次即长期有效;也有型号提供易失版本。软件应先读后判断再写,避免每次上电都做一次擦写、无谓消耗状态寄存器寿命。
关键命令速览
| 命令 | 名称 | 说明 |
|---|---|---|
0x9F | Read JEDEC ID | 返回制造商 ID + 器件 ID(2 B);上电自检必做 |
0x5A | Read SFDP | 读串行 Flash 可发现参数表,通用驱动的基础 |
0x06 / 0x04 | Write Enable / Disable | 每次编程、擦除、写状态寄存器前都要先发 0x06(置 WEL) |
0x05 / 0x35 | Read Status Reg1 / Reg2 | SR1 bit0 = WIP(忙),bit1 = WEL;SR2 常含 QE |
0x01 / 0x31 | Write Status Reg | 写 SR1 / SR2(含 QE、BP、SRP/SRL) |
0x03 | Read Data | 低速读,无 dummy,通常限 33 ~ 50 MHz |
0x0B | Fast Read | 带 8 dummy 周期,可跑到器件最高频率 |
0x3B / 0xBB | Dual Output / Dual I/O | 数据 2 线 / 地址+数据 2 线 |
0x6B / 0xEB | Quad Output / Quad I/O | 数据 4 线 / 地址+数据 4 线;需 QE=1 |
0x02 | Page Program | 页编程,≤ 256 B 且不可跨页边界 |
0x32 | Quad Page Program | 4 线页编程;需 QE=1,提速有限(受编程时间限制) |
0x20 | Sector Erase | 擦除 4 KB 扇区,30 ~ 100 ms |
0x52 / 0xD8 | Block Erase | 擦除 32 KB / 64 KB 块,150 ~ 500 ms |
0xC7 / 0x60 | Chip Erase | 整片擦除,20 ~ 200 s |
0x38 / 0xFF | Enter / Exit QPI | 进入 / 退出 4-4-4 模式 |
0xB7 / 0xE9 | Enter / Exit 4-Byte Address | > 128 Mb 器件访问全空间必需 |
0xB9 | Deep Power-Down | 进入超低功耗,电流降到 µA 级 |
0xAB | Release Power-Down / Read ID | 唤醒;也可返回 8 bit 器件 ID |
0x66 + 0x99 | Enable Reset + Reset | 软复位(两条连发);部分型号需先使能 |
0x75 / 0x7A | Erase/Program Suspend / Resume | 擦除期间插入读操作,改善 XIP 实时性 |
① 整条指令期间 CS# 必须保持低电平。命令字节、地址、dummy、数据必须在同一次 CS# 拉低内连续完成;CS# 一旦拉高,指令立即被丢弃或提前结束(读操作会截断,写操作可能根本不生效)。
② 轮询状态寄存器时不要反复拉高 CS#。正确做法是CS# 拉低 → 发 0x05 → 持续给时钟连续读同一个状态字节 → 直到 WIP=0 → 才拉高 CS#。反复“拉低-发 0x05-拉高”不但效率低,而且在某些型号/某些时序余量不足的板子上会出现读到过期状态、误判擦除完成、进而写入错误数据的问题。
③ 另外注意 CS# 拉高后到下次拉低之间的最小间隔 tSHSL(典型 20 ~ 50 ns),高速下由主控 QSPI 控制器参数保证。
3 · 电源设计
3.1 供电要求与去耦
| 项目 | 要求 | 理由 |
|---|---|---|
| 电压档位 | 3.3 V(2.7 ~ 3.6)/1.8 V(1.65 ~ 2.0)/宽压(1.65 ~ 3.6) | 必须与主控 IO 电平一致 |
| 纹波 | < 50 mVpp | 编程/擦除对 VCC 敏感 |
| 高频去耦 | 0.1 µF X7R 0402/0603,紧靠 VCC 脚,走线 ≤ 2 mm | 抑制开关噪声、供给瞬态电流 |
| Bulk 电容 | 4.7 ~ 10 µF X5R/X7R 0603/0805,距器件 ≤ 10 mm | 编程/擦除电流阶跃时稳压 |
| 磁珠 / 滤波电感 | 禁止串联 | 编程瞬态电流在磁珠上产生压降,导致 VCC 跌落、编程失败或数据损坏 |
| RC 滤波 | 禁止在 VCC 串电阻 | 同上,且会拖慢上电斜坡 |
| GND | 短粗直连地平面,就近打过孔 | 降低回流路径电感 |
| 供电来源 | 与主控 IO 电源同一路 | 避免上电顺序倒挂导致 IO 倒灌 |
症状是“平时都好,偶尔某个扇区写坏”。八成原因是缺 bulk 电容或串了磁珠:擦除瞬间电流从待机几十 µA 跳到 30 mA,若 VCC 跌破 VCC(min),器件内部高压泵中断,该扇区状态不确定。定位方法:示波器 AC 耦合、20 MHz 带宽限制,探头贴 VCC 与 GND 脚(不要用长地线),触发擦除并抓 VCC 跌落幅度。
3.2 上电 / 掉电时序
上电要求
- VCC 单调上升,中途不得有台阶或回落。上升过程中若跌回 VCC(min) 以下再爬升,器件内部上电复位电路可能未正确触发,表现为读 ID 失败或状态寄存器异常。
- 上升时间 tVR 需在手册范围内(常见 1 µs ~ 10 ms/V)。上升过慢(例如经大电阻或慢启动 LDO)同样可能导致内部复位不完整。
- VCC 到 VCC(min) 后必须等待 tVSL(数十 µs 量级)才允许拉低 CS#。软件里体现为“上电后先 delay,再发第一条命令”。
- CS# 在整个上电过程中必须保持高——这正是 CS# 必须 10 kΩ 上拉到 VCC 的原因:主控 IO 在复位期间通常是高阻,没有上拉时 CS# 电平不确定,可能被误判为选中,从而把上电噪声当成指令执行。
- 主控 IO 电源与 Flash VCC 必须同时上电或 Flash 先上电。若主控 IO 先上电而 Flash VCC 未上,电流会通过 Flash 的 IO 端 ESD 二极管倒灌进 VCC,造成器件半上电、锁死或漏电。
掉电与重新上电
- 擦除 / 编程期间禁止掉电。掉电会使该页或扇区数据处于不确定状态(既不是旧值也不是新值),且不会有任何错误标志。
- 重新上电前,VCC 必须降到手册规定的门槛以下并保持 tPUW(典型 1 ~ 10 ms)。“快速掉电再上电”是欠压复位不干净的典型场景,会导致器件停在异常模式(例如仍处于 QPI 或连续读模式)而读不到 ID。
- 若系统存在频繁热插拔或掉电重启,建议:外部欠压检测(或主控 BOR)+ 断电前主动完成收尾 + 上电后先发软复位(
0x66+0x99)或0xFF再读 ID。
3.3 低功耗与 Deep Power-Down
SPI NOR 自带 Deep Power-Down 指令 0xB9,一条命令就能把电流从待机的 10 ~ 50 µA 压到 1 ~ 15 µA(超低功耗型号如 MX25R 可到 < 1 µA),且无需任何额外硬件。而 SD NAND / eMMC 这类带内部控制器的器件通常没有等效休眠指令,空闲电流下不去,必须靠外部 VCC 负载开关物理断电才能省电——多一颗器件、多一路 GPIO、还要处理 IO 倒灌与上电重新初始化。做电池产品时这是选 SPI NOR 的一个实质理由。
DPD 使用要点
- 进入:CS# 拉低 → 发
0xB9→ CS# 拉高 → 等待tDP(典型 3 µs)后电流才降下来。进入前必须确认 WIP = 0,编程/擦除进行中发0xB9会被忽略。 - 唤醒:CS# 拉低 → 发
0xAB→ 再发 3 个 dummy byte → CS# 拉高 → 等待tRES1/tRES2(µs 级,常见 3 ~ 30 µs,部分型号可达 100 µs 量级)后才可接受下一条指令。只发0xAB不给 dummy byte,或不等 tRES 就发下一条命令,是“唤醒不了 / 唤醒后第一条命令失败”的典型原因。 - DPD 期间除
0xAB外所有指令都被忽略。软件里必须自己记住“当前处于 DPD”这个状态;上电流程建议无条件先发一次0xAB再读 ID,避免上一次异常复位遗留在 DPD 里。 - 若系统要求整机静态电流 < 1 µA,而所选型号 DPD 电流为 10 µA 量级,才需要上 VCC 负载开关。
低功耗方案对比
| 方案 | 静态电流 | 硬件成本 | 唤醒/恢复代价 | 适用场景 |
|---|---|---|---|---|
| 常供电 + 待机(CS# 高、停时钟) | 10 ~ 50 µA | 零 | 无 | 市电供电、常规产品 |
常供电 + DPD(0xB9)推荐 | 1 ~ 15 µA | 零(纯软件) | 0xAB + tRES,µs 级 | 电池产品首选 |
| 选超低功耗型号 + DPD | < 1 µA | 零(选型溢价) | 同上 | 纽扣电池、长待机 |
| 高边负载开关切断 VCC | < 1 µA(含开关漏电) | +1 颗负载开关 + 1 路 GPIO | 重新上电 + tVSL + 重新初始化(含 QE、4 字节地址等全部易失设置) | 要求极致静态电流 |
| PMOS + GPIO 自搭开关 | < 1 µA | +PMOS+2 电阻 | 同上,另需注意栅极上拉与开关摆率 | 成本敏感且必须断电 |
| LDO EN 控制 | 取决于 LDO 关断电流 | 复用已有 LDO | 同上 | 已有独立 LDO 供 Flash |
断开 VCC 之前,必须把 CS#、CLK、DI 全部置为低电平或高阻,并断开上拉电阻的供电(上拉必须接在被开关后的 VCC 上,而不是主 3.3 V)。否则主控输出的高电平会通过 Flash IO 脚的 ESD 二极管倒灌到已断电的 VCC 网络,实测漏电可达 50 ~ 500 µA,等于白做断电。另外,断电会丢失所有易失设置(QE 若为易失版本、4 字节地址模式、连续读模式、dummy 配置),恢复后必须重新走一遍初始化流程。
4 · 典型应用电路
4.1 标准 SPI 四信号接法
- CS# 上拉 10 kΩ 到 VCC 是硬性要求,且必须接在与 Flash 同一路的 VCC 上。上拉点应放在串阻之后、靠近 Flash 一侧。
- DI / DO(IO0 / IO1)建议 10 kΩ 上拉:这两根是双向数据线,命令/地址周期或 CS# 拉高导致 DO 变高阻时可能浮空,弱上拉可避免误锁存;若主控与器件在空闲期会主动驱动,可留焊盘不贴。
- WP# / IO2、HOLD# / IO3 各用 10 kΩ 上拉到 VCC(不用其功能时)。若需要软件控制写保护,改为主控 GPIO 直连并保留上拉,保证主控复位期间仍为高(不写保护、不 HOLD)。切勿悬空——悬空脚易被噪声拉低,表现为莫名的传输停顿(HOLD#)、写失败(WP#)或直接复位(若该脚是 RESET#)。标准 SPI 接法下这两根只上拉、不接主控,所以图中没有串阻位;一旦改由主控驱动(即图 4-2 的 Quad 接法,此时它们是 IO2 / IO3),就与其余信号线同样各串 33 Ω。
- 四根信号线(CS#、CLK、DI、DO)一律串 33 Ω,每条一只,不允许只串其中一部分。串阻放在源端、紧靠驱动侧输出脚:CS#、CLK、DI 由主控驱动,电阻靠近 主控;DO 由 Flash 驱动,电阻靠近 Flash。作用是抑制过冲与 EMI,为可选端接——低速或走线很短时可省掉,但 Layout 仍要四根全部预留焊盘,避免改板时补不进去。
- SCK 不加上拉也不加下拉。加上拉会在时钟边沿引入额外容性负载与不对称过冲;SPI 空闲电平由主控模式(Mode 0 / Mode 3)决定,不需要外部器件维持。
- 去耦:
0.1 µF紧靠第 8 脚(走线 ≤ 2 mm),4.7 ~ 10 µFbulk 就近放置。两只电容的另一端都必须显式接地并就近打过孔。 - 此接法保留了 WP# 硬件写保护与 HOLD# 功能,是 Bootloader / 参数区 / 对可靠性要求高的场合的推荐接法。
4.2 Quad SPI 六信号接法
- IO0 ~ IO3 全部建议 4.7 kΩ 上拉(图中已画出,CS# 用 10 kΩ)。Quad 下这四根是高速双向数据线,上拉取值的逻辑是在保证边沿速度的前提下尽量强,以压住浮空与干扰:4.7 kΩ 对 133 MHz QSPI(单线负载 15 pF 量级)的边沿影响仍在余量内,是本指南的统一推荐值;不要用 47 kΩ 一类过弱的上拉,长走线或多负载场景下抗干扰能力明显不足。在 QE 尚未置位的上电初期,IO2 / IO3 仍是 WP# / HOLD#,此时若高阻会有风险。若主控 QSPI 在空闲期会主动驱动这几脚,也可留焊盘不贴,但仅在充分验证后使用;电池供电、对漏电敏感的场景可放宽到 10 kΩ,默认建议贴 4.7 kΩ。
- 上拉点必须放在串阻之后(靠近 Flash 一侧)。若接在串阻的主控侧,上拉电流要穿过串阻,会与器件侧形成分压,空闲电平被拉不到 VCC。
- 六根信号线(CS#、CLK、IO0 ~ IO3)一律各串一只 33 Ω(图中已画出,共 6 只,标为 33R),取值一致、不留例外。IO0 ~ IO3 在 Quad 下与 CS# / CLK 一样都是高频信号,只给其中一部分配串阻会造成组内的边沿速率不一致,反而把 skew 拉大——这是本图最常见的画错方式。
- 串阻为可选端接,但六根要留就全留、要省就全省。低速或走线很短时可贴 0 Ω,Layout 仍建议六根全部预留焊盘,避免改板时补不进去。放置位置遵循「靠近驱动端」:CS#、CLK 由主控驱动,靠主控放;IO0 ~ IO3 是双向线,读周期由 Flash 驱动,若走线较长(> 50 mm)或速率 ≥ 104 MHz,建议靠近 Flash 一侧放置,对回读方向的反射抑制更直接。
- 贴装值按实测调整,不要靠猜:33 Ω 是默认起点;若眼图过冲仍超标,优先降低主控 IO 驱动强度(slew rate / drive strength 寄存器),其次才调整串阻(可下调到 22 Ω)。若边沿过缓、眼宽不足,则反过来把串阻降到 10 ~ 22 Ω 或改贴 0 Ω。
- CLK 与 IO0 ~ IO3 五根线必须等长:104 MHz 以下 ±1.27 mm 即可;133 MHz 建议 ±1.0 mm;166 MHz 或 DTR 模式建议 ±0.6 mm。等长的基准是 CLK。
- CS# 不参与等长约束(它不是逐周期采样的信号),但仍应与 CLK 长度接近,避免建立/保持余量被吃掉。
- 本接法失去 WP# 硬件写保护与 HOLD#(或 RESET#)功能,需要写保护时改用状态寄存器的 BP / SRL 位,需要复位时用
0x66 + 0x99软复位。 - 软件上必须先完成 QE 置位 才能使用
0x6B/0xEB;初始化阶段(读 ID、读 SFDP、写 QE)仍走 Standard SPI 低速路径。
4.3 Octal SPI(8 线 / OPI)接法
Quad(4 线)在 133 MHz 下约 66 MB/s,已接近其架构上限。当 XIP 片上取指、大字库 / UI 资源加载、快速开机 等场景要求更高吞吐时,需要把数据总线从 4 位拓宽到 8 位,即 Octal SPI(常写作 OPI 或 8-8-8):
| 模式 | 时钟 | 有效速率 | 折算吞吐 | 相对 Quad |
|---|---|---|---|---|
| Quad SDR | 133 MHz | 4 bit × 133 MHz | ≈ 66 MB/s | 基准 |
| Octal SDR | 133 MHz | 8 bit × 133 MHz | ≈ 133 MB/s | 2.0 × |
| Octal SDR | 166 MHz | 8 bit × 166 MHz | ≈ 166 MB/s | 2.5 × |
| Octal DTR(双沿) | 200 MHz | 8 bit × 2 × 200 MHz | ≈ 400 MB/s | 6.0 × |
① 主控必须带 OSPI / XSPI / Octal 控制器。普通 QSPI 外设想不出 8 位数据总线,靠 GPIO 软件模拟完全跑不到这个速率。② Flash 必须是多引脚封装。8 个引脚的 SOP-8 / WSON-8 封装最多只能做 Quad(VCC、GND、CS#、CLK 之后只剩 4 根 IO),8 线数据总线至少需要 SOP-16(300 mil)或 BGA-24(6×8 mm)。③ 命令集与 Quad 不兼容。8 线模式有独立的操作码与使能位,不是把 QE 置起来就能用,必须读 SFDP 确认支持哪一组命令(常见有两组:一组兼容 SPI 生态、一组兼容 HyperBus 生态),且上电默认一定是 1 线模式。
- IO0 ~ IO7 与 DQS 共 9 根全部 4.7 kΩ 上拉(CS# 用 10 kΩ)。上电初期器件仍在 1 线模式,未用到的高位 IO(IO4~IO7)可能处于高阻或默认功能,上拉可避免浮空。上拉点必须在串阻之后的器件侧,否则上拉电流穿过串阻会形成分压,空闲电平拉不到 VCC。漏电核算:9 只 4.7 kΩ 全部为低时理论最大 3.3 V ÷ 4.7 kΩ × 9 ≈ 6.3 mA,实际数据线绝大多数时间为高,常态远小于此值;电池供电场景可放宽到 10 kΩ,不建议用 47 kΩ——8 线并行走线下过弱的上拉会让空闲电平易受串扰。
- 十一根信号线(CS#、CLK、IO0 ~ IO7、DQS)一律各串一只 33 Ω(图中已画出,共 11 只,标为 33R),取值一致、不留例外。八线设计里最容易出的问题是「只给 CS# / CLK 配串阻、数据线裸奔」:数据线在 8 线并行下相互串扰更强,组内边沿速率不一致会直接吃掉 DTR 本来就紧的建立/保持窗口。全串之后 RC 延迟是成组增加的,等长组一起补偿即可;只串一部分反而是组内 skew 的来源。
- 串阻为可选端接,但十一根要留就全留、要省就全省。166 MHz SDR 以下、走线 < 30 mm 时可贴 0 Ω;Layout 建议十一根全部预留焊盘——BGA-24 扇出空间紧张,后期想补焊盘几乎没有余地。放置位置:CS#、CLK 靠主控;IO0 ~ IO7 与 DQS 是双向线,读周期由 Flash 驱动,建议靠近 Flash 一侧放置,对回读方向的反射抑制更直接。
- 贴装值按实测调整:33 Ω 是默认起点。若眼图过冲超标,优先降低主控 IO 驱动强度(slew rate / drive strength 寄存器),其次下调串阻到 22 Ω;若边沿过缓、眼宽不足(8 线 DTR @ 200 MHz 尤其容易),反过来把串阻降到 10 ~ 22 Ω 或改贴 0 Ω,并复核走线阻抗是否控制在 50 Ω ±10%。DQS 尤其敏感:它决定采样窗口位置,调 DQS 串阻后必须重新确认主控侧的读训练结果。
- 等长组扩大到 10 根(CLK + IO0~IO7 + DQS),这是 8 线设计最容易低估的地方:Quad 只需绕 5 根,Octal 要绕 10 根,BGA-24 封装下扇出空间紧张,通常至少需要 4 层板。公差建议:133 MHz SDR ±0.5 mm;166 MHz SDR ±0.4 mm;DTR @ 200 MHz ±0.25 mm,且必须做阻抗控制(单端 50 Ω ±10%)。
- DQS 的处理要单独确认:DQS 是数据选通,主控用它来采样数据,其长度与数据线的关系取决于主控 OSPI 控制器的要求——有的要求 DQS 与数据线严格等长,有的要求 DQS 略长(约 0.1 ~ 0.5 mm)以保证采样窗口居中。这一条必须查主控手册,不能照抄 Quad 的经验。SDR 低速模式下 DQS 可不用,此时该脚建议 4.7 kΩ 上拉或按 datasheet 处理,不要浮空。
- RESET# 建议由主控 GPIO 驱动并加 10 kΩ 上拉。8 线 + XIP 场景下,一旦通信异常,主控可能失去对整个总线的控制,硬件 RESET# 是最后的恢复手段(软件复位
0x66 + 0x99在总线已乱时未必能发出去)。不用 RESET# 时不要浮空,直接上拉到 VCC。 - 8 条数据线必须同组同层走线,禁止跨电源分割、禁止在其中某几条上绕远路补偿长度而把组内 skew 拉大。换层次数全组保持一致,每次换层配一对回流地过孔。
- 软件初始化顺序不可跳步:上电默认 1 线 → 读 JEDEC ID → 读 SFDP 确认该器件支持哪一组 8 线命令 → 按 SFDP 指示配置对应使能位(不是 Quad 的 QE)与 dummy cycles → 切 8 线并低速验证 → 逐档提频。dummy 在 8 线 DTR 下比 Quad 更敏感,宁多勿少。
4.4 XTX 8 线(Octal / OPI)器件选型
下表为 XTX 产品库中可用于 Octal 8 线设计的型号,按封装与电压档归类。状态列请重点关注——部分型号仍在 CS / UD 阶段,量产项目须先确认转 MP 进度。
| 封装 | 型号 | 容量 | 电压 | 状态 | 说明 |
|---|---|---|---|---|---|
| SOP-16 300 mil 推荐 | XT25F256BSFIGT XT25F256BSFIGU | 256 Mb | 2.7~3.6 V | MP | 3.3 V 系统首选,引脚可见、易焊接易飞线,适合工控与调试阶段 |
| XT25W512BSFIGA | 512 Mb | 1.65~3.6 V | MP | 宽压,可同时兼容 1.8 V / 3.3 V 系统 | |
| XT25Q512FSFIGA | 512 Mb | 1.7~2.0 V | MP | 1.8 V 系统主力,512 Mb 大容量 | |
| XT55Q1GFSFIGA | 1 Gb | 1.7~2.0 V | CS | 容量上限型号,量产前须确认转 MP 进度 | |
| BGA-24 6×8 mm | XT25Q512FBGIGA | 512 Mb | 1.7~2.0 V | CS | 面积最小,需 4 层板 + 完整扇出;必须 X-Ray 检焊 |
| XT55Q1GFBGIGA | 1 Gb | 1.7~2.0 V | UD | 在研,不建议新项目选用 | |
| XT55Q2GFBGIGA | 2 Gb | 1.7~2.0 V | SS | 送样阶段,仅可用于预研 |
SOP-8 / WSON-8 / DFN-8 这类 8 引脚封装无论容量多大,都只能做到 Quad(4 线)。选型时判断依据不是容量,而是封装引脚数:只有 SOP-16(300 mil)与 BGA-24(6×8 mm) 才具备 IO4 ~ IO7,能真正跑 8 线。反过来,如果主控只有 QSPI 外设,选 SOP-16 器件也只会浪费 IO4~IO7,此时应回到 4.2 的 Quad 方案。
4.5 1 路 SPI 访问多个 SPI 设备
一颗主控的 QSPI 控制器只有一组 SCK / IO0~IO3,但板子上往往不止一片 SPI 器件。共享总线 + 独立片选是最基本的做法,可一旦片数变多,就会牵出四个连锁问题:主控 CS# 不够用、未被选中的器件把总线电容堆高、不同器件的电压域和模式不一致、换片瞬间两片同时抢总线。这一节把这四件事逐个拆开,给出可直接照着画的原理图与取值。
默认主控是一颗 QSPI 控制器、从设备是同一电压域、同类型的 SPI NOR。若总线上还混了传感器、SPI NAND、不同电压的器件,请额外看 4.5.6;因为混合总线会引入这一节没有的约束。
4.5.1 什么时候需要在一路 SPI 上挂多片
先确认你真的需要多片。多片带来的 Layout 复杂度、时序风险和调试成本,往往比「换一颗更大容量的单片」要贵。
| 场景 | 为什么不能只用一片 | 对硬件设计的实际要求 |
|---|---|---|
| 容量不够 | 单片密度到顶(如 128 Mb 已是该系列上限),而 BOM 又不想换接口 | 两片地址空间在软件层拼接;硬件上只要求都能被独立选通 |
| A / B 双备份 OTA | 升级失败必须能回滚,正在运行的那片不能被擦写 | 两片完全对等;CS# 必须真正独立,绝不能用译码器把两片并成一片 |
| 代码与数据分离 | XIP 运行时若同一片在擦写,读会被长时间阻塞 | 代码片放 XIP 区只读,数据片承担频繁擦写;两片可同容量 |
| 混合外设共用 | 上电早期只有一路 SPI 可用,传感器、扩展 IO 也要挂上来 | 见 4.5.6:频率取最小值、模式要逐次切换、注意非标准从设备 |
| 成本 / 供货 | 两片小容量比一片大容量便宜,或大容量料号交期太长 | 纯成本决策,但要先算清 4.5.8 的负载预算,别到 PCB 阶段才降频 |
如果只是为了容量,优先换成更大容量的单片,或换成 Octal / 更高密度的系列。多片方案会永久占用主控 GPIO、增加 Layout 难度,并且把总线速率拉下来(见 4.5.8)。多片真正的价值在于隔离——备份、读写分离、电压域隔离,而不是单纯堆容量。
4.5.2 四种拓扑:先定「片选从哪来,总线要不要隔离」
所有多设备方案,本质上只回答两个问题:片选信号怎么产生,以及共享总线要不要被切开。这两个问题的组合给出下面四种拓扑。
| 拓扑 | 占用主控 IO | 适合片数 | 切换开销 | 什么时候该选它 |
|---|---|---|---|---|
| A 独立 CS# 直驱 | 总线 4 + 每片 1 根 CS# | 2 ~ 4 | 零(GPIO 直接翻转) | 默认方案。片数少、切换频繁时无可替代 |
| B 译码器扩展 | 总线 4 + 地址 3 + 使能 1 | 5 ~ 8(级联更多) | 低(写一次 GPIO 端口) | 片数 5 片以上,且切换频繁、要求纳秒级响应 |
| C 移位寄存器扩展 | 总线 4 + 595 的 3 根 | 8 ~ 24(可多级串联) | 高(要串行移位 8~24 bit) | 片数极多、但切换不频繁(选中后连续大块读写) |
| D 总线开关 / 电平转换隔离 | 总线 4 + 选择 1 ~ 2 | 分 2 ~ 4 组 | 低 | 电压域不同、有器件会拖死总线、或某组要单独断电 |
- 4 片以内 → 直接 A,别为了省 GPIO 上译码器,得不偿失。
- 5 ~ 8 片 → B,3 根地址线换 8 个片选,切换还是 GPIO 级速度。
- 8 片以上、切换少 → C;8 片以上、切换频繁 → B 级联(两片 138 用使能脚分层)。
- 只要电压域不同 → 必须 D,这与片数无关,是硬约束。
4.5.3 拓扑 A:独立 CS# 直驱的接线规则
两片时几乎没有代价,四片时就要开始算账了。下图是两片的接法,挂 N 片同理——再增加 N−2 个 CS# 与对应的 Flash 即可。
- 共享线只串一次阻:SCK 与 IO0 ~ IO3 由主控唯一驱动,未被选中的 Flash 在 CS# 无效时这些脚为高阻,因此串阻只需放在主控侧(源端)一次,不必每片都串;与 4.2 一致,全部信号线统一 33 Ω、取值一致、不留例外。
- 每片独立 CS#:CS#0 选通 U1、CS#1 选通 U2,由主控两个 GPIO 分别驱动,各自串 33 Ω、各自上拉 4.7 kΩ 到本片 VCC。
- 数据线上拉按片独立:每片 Flash 的 IO0 ~ IO3 在器件侧各 4.7 kΩ 上拉(与 4.2 规则一致),确保该片在 CS# 无效、IO 为高阻期间不浮空;图中以一处示意,实际四根线均须上拉。
- 开漏冲突是首要风险:IO1(DO / MISO)在部分命令下是开漏输出,多片共享时未选中的设备必须真正释放总线(CS# 拉高 → 输出高阻)。一旦有两片同时驱动,会直接拉坏总线逻辑或读到错误数据。初始化阶段先以单片、低速(Standard)逐一读 ID 验证 CS# 映射,再切 Quad。
- 等长只针对被使用的线:共享的 SCK 与 IO0 ~ IO3 仍按 4.2 的等长组约束(CLK 与四根数据线 ±1 mm @ 133 MHz);各 CS# 之间无需等长,但不同 CS# 的选通延迟要留足 tCSH / tCSS。
上拉电阻会被并联,这是多片最隐蔽的坑
单片时每根线只有一个 4.7 kΩ 上拉;挂 4 片之后,同一根 IO 线上并联了 4 个 4.7 kΩ,等效只有 1.18 kΩ。后果有两个,第二个更麻烦:
| 片数 | 每片 4.7 kΩ 时的并联值 | 主控拉低需灌入电流(3.3 V) | 评价 |
|---|---|---|---|
| 1 片 | 4.7 kΩ | 0.70 mA | 正常 |
| 2 片 | 2.35 kΩ | 1.40 mA | 可接受 |
| 3 片 | 1.57 kΩ | 2.10 mA | 偏高,需确认主控 IO 驱动能力 |
| 4 片 | 1.18 kΩ | 2.80 mA | 不推荐,且边沿明显变缓 |
- IO0 ~ IO3:上拉的作用是「未被选中的器件输出高阻期间不让线浮空」。既然多片并联,就把每片的上拉统一放大到 10 kΩ,4 片并联后仍有 2.5 kΩ,浮空问题解决,边沿也不至于被拖死。
- 更彻底的做法:只在总线最末端保留一组上拉,其余各片去掉。整条总线任何时刻至少有一片被选中在驱动,其余时候由这组上拉兜底。
- CS#:它是慢信号,上拉只为了防止主控复位、IO 高阻期间误选通,阻值取 10 kΩ ~ 100 kΩ 都可以(Micron 在 M25PX16 数据手册里给的参考值就是 CS# 上拉 100 kΩ、SCK 下拉 100 kΩ)。不要照搬 IO 线的 4.7 kΩ。
- SCK 建议加一组下拉(100 kΩ):保证主控 IO 高阻期间 SCK 停在低电平,避免 CS# 与 SCK 同时为高而违反 tSHCH。
以上阻值均为常见做法,最终以所用器件 datasheet 与实测波形为准。
多片方案里最容易犯的错,是两片共用一颗 100 nF。每片 Flash 的 VCC 引脚必须有自己独立的 100 nF,紧贴引脚放置,再在电源入口共享一颗 1 ~ 10 μF 的体电容。两片共用一个去耦电容时,被选中的那片在读 / 写瞬间的电流跳变会直接耦合到另一片的电源上,表现为「换片之后偶发读错」——这类故障极难定位。
4.5.4 拓扑 B / C:CS# 不够用时怎么扩展
主控的 QSPI 外设往往只提供 1 ~ 2 个硬件 CS#,其余只能用 GPIO 模拟。当片数超过 GPIO 预算时,就该把片选「编」出来而不是「拉」出来。
B 3 根地址线换 8 个片选:74LVC138
| 器件 | 功能 | 输出极性 | 供电范围 | 关键参数 | 适用 |
|---|---|---|---|---|---|
| 74LVC138A | 3 → 8 译码 | 低有效 | 1.65 ~ 3.6 V | tpd ≤ 5.8 ns @ 3.3 V;输入可耐 5.5 V | 首选,输出极性天然就是 CS# |
| 74LVC139 | 双 2 → 4 译码 | 低有效 | 1.65 ~ 3.6 V | 与 138 同系列 | 需要两组彼此独立的 4 选 1 时 |
| 74HC154 | 4 → 16 译码 | 低有效 | 2 ~ 6 V | 速度低于 LVC 系列 | 片数到 16 且总线速率不高时 |
| 74HC595 | 串入并出 8 位 | 高有效 | 2 ~ 6 V | 需 3 根控制线,切换要移位 | 片数极多、切换不频繁(见下文警告) |
主控 GPIO 在上电到初始化完成之前处于高阻或未定义状态,138 的 A / B / C 输入电平不确定,输出可能是任意一个 Y 为低——也就是某片 Flash 被意外选中,总线上的第一条指令会误打进去。如果这个窗口里 SCK 有杂散跳变,甚至可能触发误擦写。
解法:用 G1(高有效使能)门控。G1 用一路带下拉的 GPIO 驱动,上电默认为低 → 138 全部输出为高 → 所有片都不选通;等地址线 GPIO 配置完成、电平稳定之后再拉高 G1。G2A# / G2B# 直接接地常开。代价只是一根 GPIO 和一个下拉电阻。
74LVC138A 在 3.3 V 下的最大传播延迟是 5.8 ns(TI 数据手册)。而 133 MHz 的时钟周期只有 7.5 ns——这个延迟占了整整 77% 的周期,必须计入 CS# 相对 SCK 的建立 / 保持预算(见 4.5.7)。如果预算算不过来,就把总线降到 104 MHz 或更低,或者改用 GPIO 直驱 CS#(拓扑 A)。
另外,138 的 VCC 必须与主控 GPIO 同一电压域;若不同域,需要先做电平转换,那又多一级延迟。
C 挂到几十片:移位寄存器扩展
用 74HC595 之类把片选「串」出去,3 根线(SDI / SCLK / LATCH)理论上可以扩到任意多位,多级串联即可。它的代价是切换片选要串行移 8 ~ 24 bit,因此只适合「选中之后连续大块读写、不常换片」的应用。
CS# 是低有效,而 595 的并行输出是高有效。直接连上的后果是「选中的那片反而不通,其余七片全被选通」——八片同时驱动 MISO,总线直接打死。必须做下面两件事之一:
- 硬件反相:595 输出后串一级 74LVC04 / 74HC04 反相器(推荐,行为确定)。
- 软件取反 + OE# 门控:发送数据前按位取反,同时把 595 的 OE# 用上拉拉高,使上电期间输出为高阻,各 CS# 靠自己的上拉保持高电平(不选通);初始化完成后再拉低 OE#。注意软件取反在复位窗口内仍然不可靠,能加反相器就加。
4.5.5 布线拓扑:星型分支 vs 链式 Fly-by
原理图连对了,Layout 还能把它毁掉。同一段总线有两种走法,差别在于分支点放在哪。
| 对比项 | A 星型分支 | B 链式 / Fly-by |
|---|---|---|
| 走线长度 | 较长,需要更多布线面积 | 较短,主干一条穿过去 |
| 各片负载分布 | 每个分支末端只挂 1 个负载 | 每段走线都带着前级全部负载 |
| 阻抗连续性 | 分支点处一次突变 | 每个器件焊盘处都突变一次 |
| 等长难度 | 各支线等长即可,主控需有余量 | 天然先后到达,各片时序本就不一致 |
| 适用 | 133 MHz 及以下的绝大多数场合 | 板面积紧张、频率 ≤ 50 MHz、片数 ≥ 3 |
- 分支点尽量靠近主控,主干越短越好;Stub(从分支点到器件焊盘的支线)建议 ≤ 5 mm,超过后反射会明显吃掉眼图裕量。
- 各支线等长:SCK 与 IO0 ~ IO3 按 4.2 的等长组约束;不同片之间的支线长度也尽量一致,避免「第一片能跑 133 MHz、第四片只能跑 80 MHz」。
- 总线下方地平面必须完整,不允许被电源分割槽切断;换层处 200 mil 内要有回流地孔。
- 各片去耦电容紧贴各自 VCC,回流路径最短。
JTAG、LED 驱动芯片(如 74HC595 级联)那类器件把 SDO 接到下一级 SDI、数据逐级往下传,这叫协议级菊链。SPI NOR Flash 没有这个模式——每片都必须各自收到完整的命令 + 地址,因此每片必须有独立的 CS#。本文档里说的「链式 / Fly-by」仅指 PCB 走线方式,与协议无关,不要混为一谈。
4.5.6 拓扑 D:混合电压域与总线隔离
只要总线上有一个器件与主控不同电压域(比如 1.8 V 主控挂 3.3 V Flash),或者混了非存储类从设备,就必须引入隔离 / 转换。这一步加错了器件,比不加还糟。
| 器件 | 类型 | 速率能力 | 能否用于多设备 QSPI 总线 |
|---|---|---|---|
| SN74AXC4T245 | DIR 控制型电平转换 | ~380 Mbps 级 | 推荐,4 位 / 方向可控,适合 SCK + CS# + 双向 IO |
| SN74AVC4T245 | DIR 控制型电平转换 | ~380 Mbps 级 | 推荐,同上 |
| TXU0304 | 固定方向电平转换 | 100 Mbps @ 1.8↔3.3 V | 可用,注意是单向,双向 IO 要两片或改选型 |
| TXB0104 / TXS0108E | 自动方向型 | 约 60 Mbps(TI 官方口径) | 禁止,见下方红框 |
| BSS138 等 MOS 管方案 | 开漏 + 上拉 | ~1 Mbps 量级 | 禁止,只适合 I²C 类低速信号 |
- 带宽不够:这类器件内部靠 one-shot 边沿加速器工作,数据率上限约 60 Mbps(TI 官方在 E2E 论坛的答复口径),而 133 MHz QSPI 已经远超。器件手册标称的 100 Mbps 是理想 push-pull、轻载条件下的值,多设备总线上根本达不到。
- 外部禁止加上拉和电容:这是更致命的一条。TXB / TXS 的输入转换速率有要求,外部上拉会与之冲突;而 SPI NOR 的 CS#、IO 线恰恰都需要上拉(见 4.5.3)。两个要求直接打架,怎么调都不对。
结论:QSPI 总线上的电平转换,一律用 DIR 控制型(AXC / AVC 系列)或固定方向型(TXU 系列)。
- 总线频率取所有器件中的最小值:挂了一片最高 50 MHz 的传感器,整条总线就只能跑 50 MHz,Flash 也得跟着降。
- 模式要逐次切换:不同器件可能用不同的 CPOL / CPHA,甚至有的只支持 Standard SPI 不支持 Quad。每次换器件都要重配控制器模式,且切换必须在 CS# 为高期间进行。
- 小心不规范的从设备:少数传感器 / 扩展芯片在 CS# 拉高后并不立即释放 MISO,甚至在 CS# 无效期间仍驱动输出。这类器件与 SPI NOR 共享总线时会直接打架,必须用总线开关或三态缓冲器物理隔离(图 4-8 的 B 方案),软件上怎么躲都躲不掉。
每个从设备的总线释放行为,务必在器件 datasheet 里确认「CS# 无效 → 输出进入高阻」这条,再决定是否共享。
4.5.7 换片时序:总线争用是多设备的头号杀手
多设备独有的失效模式,全发生在换片的那一瞬间:前一片还没放开 MISO,后一片就开始驱动,两片输出对打。
下表给出典型 SPI NOR 的 CS# 相关时序参数。不同厂商、不同型号的差别非常大(例如 CS# 高电平时间,Winbond W25Q 只要 10 ns,Microchip SST25 却要求 50 ~ 100 ns),所以这里的数字只能用来建立量级概念,设计时必须查自己那颗料的数据手册。
| 参数 | 含义 | W25Q128JV(Rev. D) | SST25 系列(25 / 50 MHz) |
|---|---|---|---|
| tSLCH(tCSS) | CS# 有效相对 SCK 的建立时间 | 5 ns(min) | 10 / 5 ns(min) |
| tCHSH | CS# 有效相对 SCK 的保持时间 | 3 ns(min) | 10 / 5 ns(min) |
| tSHCH | CS# 无效相对 SCK 的建立时间 | 3 ns(min) | 10 / 5 ns(min) |
| tCHSL | CS# 无效相对 SCK 的保持时间 | 5 ns(min) | 10 / 5 ns(min) |
| tSHSL1 | CS# 取消选择时间(读之后) | 10 ns(min) | — |
| tSHSL2 | CS# 取消选择时间(擦 / 写之后) | 50 ns(min) | — |
| tCPH | CS# 高电平持续时间 | — | 100 / 50 ns(min) |
| tSHQZ(tDIS) | 输出禁止时间(CS# 变高 → 输出高阻) | 7 ns(max) | 15 / 8 ns(max) |
| tCLQV | SCK 变低到输出有效 | 6 ns(max) | 15 / 8 ns(max) |
主控的硬件 QSPI 外设会在两次片选之间自动插入 tSHSL,这是换片安全的根本保障。但当片数超过硬件 CS# 数量、改用 GPIO 软件模拟 CS# 时,这个自动插入就没了——软件连续翻转两个 GPIO 的间隔可能只有几纳秒,直接踩进争用窗口。
必须做的三件事:
- 在驱动层显式实现「拉高 CS#A → 延时 → 拉低 CS#B」,延时按 max(tSHSL, tDIS) 再留一倍余量取值。
- 擦 / 写之后换片要等更久:tSHSL2 = 50 ns,是读之后(10 ns)的 5 倍。用同一个延时值覆盖两种场景最容易翻车。
- 如果用了译码器(4.5.4),还要把译码器的 tpd 也算进这个间隔。
- 把总线降到 1 ~ 5 MHz、强制 Standard SPI(1-1-1)模式。
- 依次拉低每一个 CS#,读 JEDEC ID(0x9F)。每次应当只读到一片的 ID;如果两片同时回答,说明 CS# 译码有误或上拉接错。
- 确认 CS# 映射无误后,再逐片切 Quad、逐步升频;每升一档都做一次全片读校验。
- 用示波器同时抓 CS#A、CS#B、IO1 三条线,重点看换片瞬间 IO1 上有没有出现「两个电平打架」的中间台阶。
4.5.8 负载预算:挂到第几片开始吃力
这是多设备方案最容易被跳过、也最容易在量产时爆雷的一步。核心事实是:未被选中的器件,其引脚电容依然挂在总线上。片数越多,总线越重,边沿越缓,最终时序不再被保证。
先明确两个来自 datasheet 的基准值:
- 器件引脚电容:以 ISSI IS25LP128F 为例,CIN(CE#、SCK)典型 6 pF,CIN/OUT(IO0 ~ IO3)典型 8 pF。Microchip、芯天下(XTX)等厂家的同类器件也基本是 6 pF / 8 pF 这个量级。
- datasheet 的测试条件:W25Q128JV、IS25LP128F 等器件的 AC 参数都是在 CL = 30 pF 下标定的。超过这个值,手册里的时序参数不再被保证——不是说一定不工作,而是出了问题厂家不认。
| 片数 | 主控引脚 | 各片 IO 引脚 | PCB 走线(按 1 pF/cm) | 总线 CL 合计 | 估算 tr | 建议 |
|---|---|---|---|---|---|---|
| 1 片 | 8 pF | 8 pF | 约 5 pF | 约 21 pF | 约 2.2 ns | 可跑满 133 MHz |
| 2 片 | 8 pF | 16 pF | 约 9 pF | 约 33 pF | 约 3.5 ns | 已超标定条件,建议实测 |
| 3 片 | 8 pF | 24 pF | 约 13 pF | 约 45 pF | 约 4.8 ns | 建议降到 80 MHz 以下 |
| 4 片 | 8 pF | 32 pF | 约 17 pF | 约 57 pF | 约 6.0 ns | 建议 50 ~ 80 MHz,或改方案 |
用一阶 RC 近似:tr ≈ 2.2 × R × CL,其中 R 取驱动器内阻加串阻,约 15 Ω + 33 Ω = 48 Ω。经验上 tr 不应超过时钟周期的 40%,对应 133 MHz(周期 7.5 ns)就是 3 ns。这个模型没有计封装寄生和过孔,只用于快速判断量级,最终以实测波形 / 眼图为准。
- 缩短走线、减少过孔:最有效且零成本。走线电容按 1 pF/cm 估,省 5 cm 就省 5 pF。
- 降频:133 → 104 → 80 → 50 MHz。这是最直接的换裕量方式,代价只有性能。
- 放大或精简上拉:各片 4.7 kΩ 改成 10 kΩ,或只在总线末端保留一组(见 4.5.3)。
- 减小串阻:33 Ω → 22 Ω,但要重新确认过冲仍在允许范围内,别把反射问题引回来。
- 用总线开关把总线切成两组(图 4-8 的 B 方案):任一时刻只有一组挂在总线上,负载直接减半。这是超过 4 片时最有效的办法。
- 换个思路:容量问题就换更大容量单片;非要 4 片以上,评估主控是否带第二组 QSPI(双总线各挂两片)。
4.5.9 多设备原理图设计检查清单
画完原理图、投板之前,逐条对照打勾。前面几节的所有结论都收敛在这张表里。
| # | 检查项 | 合格标准 |
|---|---|---|
| 1 | 片选是否真正独立 | 每片一个独立 CS#;不允许多片共用 CS#(除非是厂商明确支持的多 die 合封) |
| 2 | CS# 上拉 | 每个 CS# 有上拉,阻值 10 ~ 100 kΩ,不照搬 IO 线的 4.7 kΩ |
| 3 | SCK 下拉 | SCK 有一组 100 kΩ 下拉,保证主控高阻期间 SCK 停在低电平 |
| 4 | IO 上拉的并联效应 | 已按片数核算并联阻值与灌电流;4 片时不建议每片 4.7 kΩ |
| 5 | 串阻位置 | SCK / IO0~IO3 的 33 Ω 只在主控侧串一次;各 CS# 各串一次 |
| 6 | 去耦电容 | 每片独立 100 nF 紧贴 VCC,入口另有 1 ~ 10 μF 体电容 |
| 7 | 电压域 | 所有器件与主控同域;不同域时已加 DIR 控制型转换器(非 TXB / TXS) |
| 8 | 译码器使能门控(若用) | G1 有下拉,上电默认全部不选通;初始化完成后才放开 |
| 9 | 译码器时序预算(若用) | tpd 已计入 CS# 建立 / 保持;余量不足则降频 |
| 10 | 移位寄存器极性(若用) | 595 输出已反相;OE# 有上拉保证上电期间高阻 |
| 11 | 换片间隔 | 软件层已实现 CS# 切换延时,且擦写后取 50 ns 而非读后的 10 ns |
| 12 | 负载预算 | 已估算总线 CL;超过 30 pF 时有实测数据或已降频 |
| 13 | 总线频率 | 取所有从设备中的最小值;混合模式器件时已安排逐次切换 |
| 14 | 非标准从设备 | 已确认每个从设备在 CS# 无效时确实释放 MISO;否则已做物理隔离 |
| 15 | WP# / HOLD# | 不用时固定接高或接低,不允许浮空 |
| 16 | Layout 拓扑 | 星型分支、Stub ≤ 5 mm、地平面完整、换层有回流地孔 |
| 17 | 调试预案 | 已规划低速逐一读 ID 的验证步骤;示波器能同时抓到两路 CS# 与 IO1 |
多设备设计里,原理图连接反而是最简单的部分。真正决定成败的是三件容易被跳过的事:上拉的并联效应(4.5.3)、换片时的总线争用(4.5.7)、以及随片数线性增长的负载预算(4.5.8)。这三件事画原理图时都看不见,却会在调试和量产阶段准时出现。