只读分享解决方案文档原理方案设计📅 2026-09-20🔖 Rev 1.0✅ 长期有效
🔧解决方案&应用市场分析 -> 原理方案设计 -> SPI_NOR_Flash_电路设计指南

SPI_NOR_Flash_电路设计指南

生成时间 2026-09-08 08:51:28 长期有效

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 FlashQuad/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.1HS200/HS400、1.8 V VCCQ、DS 选通与等长
SD NAND 电路设计指南贴片式 SD NANDSPI/SDIO 双模式、无休眠指令、VCC 负载开关断电
NAND MCP 电路设计指南多芯片合封存储多 die 与多 CE、双电源轨、HDI 扇出
并行NOR (PPI NOR) 电路设计指南并行 NOR Flash异步读时序、XIP、等待周期、总线扩展
PSRAM 电路设计指南伪静态 RAMOPI/HyperBus、刷新与延迟周期、XIP 与帧缓存
DDR2 电路设计指南DDR2 SDRAMSSTL_18、T 分支拓扑、VTT 端接、ODT
DDR3 电路设计指南DDR3 / DDR3LFly-by 拓扑、write leveling、动态 ODT
DDR4 电路设计指南DDR4 SDRAMPOD12、bank group、DBI、2D 训练
DDR5 电路设计指南DDR5 SDRAM双子通道、On-DIMM PMIC、DFE、同帧 ECC
EEPROM 电路设计指南EEPROMI²C/SPI 接口、上拉电阻与总线电容、页写与写保护
如何在五者之间快速决策

需要随机读 / 片内执行(XIP)/ 免坏块管理→ SPI NOR。需要 128 MB 以上且成本敏感→ SPI NAND 或 SD NAND。需要跑操作系统 + 大容量→ eMMC。SPI NOR 的短板是写速度慢、每 MB 成本最高;长板是接口最简单、随机读最快、无坏块

1 · 器件基础

1.1 定位与选型对比

对比项SPI NORSPI NAND并行 NANDeMMCSD NAND
常见容量512 Kb ~ 2 Gb
(64 KB ~ 256 MB)
1 Gb ~ 8 Gb
(128 MB ~ 1 GB)
1 Gb ~ 64 Gb4 GB ~ 512 GB128 MB ~ 8 GB
接口SPI 1/2/4 线SPI 1/4 线8/16 位并口MMC 1/4/8 位SPI / SDIO 1/4 位
引脚数8840 ~ 63153 / 169 BGA8 (LGA)
随机读字节级寻址
无页载入延迟

页载入 25 ~ 100 µs

页载入 25 ~ 60 µs

控制器缓存

控制器缓存
顺序读速度6 ~ 104 MB/s10 ~ 40 MB/s20 ~ 200 MB/s100 ~ 400 MB/s5 ~ 25 MB/s
写速度0.1 ~ 0.5 MB/s1 ~ 5 MB/s5 ~ 40 MB/s20 ~ 200 MB/s2 ~ 10 MB/s
最小擦除单位4 KB 扇区128 KB 块128 ~ 512 KB 块控制器管理控制器管理
XIP 片内执行支持不支持不支持不支持不支持
坏块管理无需出厂全好块主机负责
含出厂坏块表
主机 FTL器件内部器件内部
ECC不需要
(部分型号内建)
片内 ECC + 主机校验主机 ECC 引擎内部内部
单位成本最高 /MB中低最低 /GB低 /GB
典型用途启动代码、XIP、字库、参数中大容量代码 + 数据大容量数据OS + 大容量贴片替代 TF 卡
SPI NOR 的两个不可替代优势

随机读 / 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 / GD25WQ3.3 / 1.8 / 宽压与 W25Q 高度 pin-to-pin 兼容
Macronix 旺宏 (MXIC)MX25L (3 V) / MX25U (1.8 V) / MX25R (超低功耗)3.3 / 1.8 / 宽压QE 常在 SR1[6],与华邦不同
ISSIIS25LP (3 V) / IS25WP (1.8 V)3.3 / 1.8QE 常在 SR1[6]
Micron 美光MT25Q / N25Q3.3 / 1.8无独立 QE 位,用增强型易失配置寄存器
Infineon / CypressS25FL / S25FS3.3 / 1.8QE 常在 CR1[1],扇区结构可配置
Boya 博雅BY25Q3.3 / 宽压国产替代,多兼容 W25Q
XTX 芯天下XT25F3.3 / 1.8 / 宽压国产替代,多兼容 W25Q
Puya 普冉PY25Q3.3 / 宽压国产替代,小容量性价比高
Fudan Micro 复旦微FM25Q / FM25W3.3 / 宽压国产替代
“Pin-to-pin 兼容”不等于“寄存器兼容”

多数厂商在 SOP-8 / WSON-8 上引脚一致,但QE 位位置、dummy cycle 默认值、SFDP 内容、4 字节地址进入方式、软复位支持、块保护位定义经常不同。做二供替代时必须逐条比对,并在软件里用 0x9F 读到的 JEDEC ID 分支处理。

1.2 封装与引脚定义

SPI NOR Flash 八脚通用引脚定义 八脚封装顶视图,左侧自上而下为 CS#、DO/IO1、WP#/IO2、GND;右侧自上而下为 VCC、HOLD#或RESET#/IO3、CLK、DI/IO0。 SOP-8 / WSON-8 / USON-8 引脚定义(顶视图) SPI NOR Flash SOP-8 / WSON-8 顶视 XTX XT25F 系列(2.7~3.6 V) Pin 1 1 CS# 2 DO / IO1 3 WP# / IO2 4 GND 8 VCC 7 HOLD# / RESET# / IO3 6 CLK (SCK) 5 DI / IO0
图 1-1 八脚 SPI NOR 通用引脚定义(顶视,Pin 1 在左上)
建库必读:引脚定义各厂商不完全一致

上图是绝大多数八脚 SPI NOR 的排布,但不能当成通用定义直接建库。实际差异至少包括:
· 第 7 脚可能是 HOLD#RESET#HOLD#/RESET# 复用,也可能是纯 IO3
· 部分 1.8 V 或大容量型号第 7 脚定义为 RESET#低电平会直接复位,若沿用 HOLD# 的处理方式会导致莫名复位;
· 少数型号存在 NCVPP 等特殊脚;BGA-24 的球脚定义与八脚封装完全不同
规则:每一个新型号都必须逐脚核对目标 datasheet 的 Pin Configuration 章节,并在原理图库里标注型号与文档版本号。

引脚功能表(八脚封装)

脚位Standard 名称Quad 复用方向说明与设计要求
1CS#(/CS、CE#)输入片选,低有效。必须 10 kΩ 上拉到 VCC,保证上电与主控 IO 未初始化期间不被误选中
2DO(SO、MISO)IO1输出 → 双向数据输出;Dual/Quad 下变为双向 IO1
3WP#(/WP)IO2输入 → 双向硬件写保护,低有效(配合 SRP/SRL 位)。建议 4.7 ~ 10 kΩ 上拉或由 GPIO 控制
4GND(VSS)电源地,短粗走线直连地平面
5DI(SI、MOSI)IO0输入 → 双向数据输入;Dual/Quad 下变为双向 IO0
6CLK(SCK、SCLK)输入串行时钟。不上拉,串 33 Ω(与其余信号线取值一致)
7HOLD# 或 RESET#IO3输入 → 双向暂停传输 / 硬件复位(按型号确认)。建议 4.7 ~ 10 kΩ 上拉或由 GPIO 控制
8VCC(VDD)电源电源,0.1 µF 紧靠此脚 + 4.7 ~ 10 µF bulk
Quad 模式的代价:写保护与 HOLD 功能一起消失

一旦启用 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 mm1.27 mm最常用,手焊/返修友好,样机首选
SOP-8 208 mil约 5.3 × 5.2 mm1.27 mm老型号大容量常用,面积大
WSON-8 6 × 56.0 × 5.0 mm1.27 mm薄型无引线,底部有散热/接地焊盘,面积省
WSON-8 8 × 68.0 × 6.0 mm1.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 mm256 Mb 以上大容量常见,球脚定义与八脚封装完全不同
DFN-8 / SOT-23-8因厂商而异小容量特殊型号,需单独核对
WSON / USON 底部焊盘

底部大焊盘的处理各厂商标注不同:多数标为可接地或悬空,少数明确要求必须接 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 电容必须留足
待机电流 ISB10 ~ 50 µACS# 高、时钟停止
Deep Power-Down1 ~ 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 SPICS#、CLK、DI、DO(4 线)1-1-10x03 Read
0x0B 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 SPICS#、CLK、IO0 ~ IO3(6 线)1-1-4(0x6B
1-4-4(0xEB
0x6B / 0xEB命令仍 1 线;WP#/HOLD# 变数据线,硬件保护失效
QPI同 Quad(6 线)4-4-40x38 进入
0xFF 退出
命令/地址/数据全 4 线,命令开销从 8 clk 降到 2 clk;进入后指令编码变化,须记得退出
DTR / DDR同 Quad(6 线)1-4-4D / 4-4-4D0xED / 0xEE(按型号)时钟双沿传输,同频率吞吐翻倍;对等长、阻抗、dummy 配置最敏感,非必要不用
Octal SPI / OPICS#、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
各读取模式指令帧结构与时钟周期数 六种读命令的帧结构对比条形图,分别显示命令段、地址段、空周期段与数据段所占时钟周期,以及各段的总线宽度。 各读取模式指令帧结构与时钟周期数 0x03 Read ×1 ×1 ×1 64 clk 0x0B Fast Read ×1 ×1 dummy ×1 72 clk 0x3B Dual Out ×1 ×1 dummy ×2 56 clk 0x6B Quad Out ×1 ×1 dummy ×4 48 clk 0xEB Quad I/O ×1 ×4 dum ×4 28 clk 0xEB QPI ×4 dum ×4 22 clk 命令 CMD 地址 ADDR 空周期 Dummy 数据 DATA
图 2-1 六种读命令帧结构对比(数据段按“读 4 字节”折算,条内数字为该段总线宽度)
怎么读这张图

横向长度 = 完成一次“读 4 字节”所需的总时钟周期数,越短越快。可以看出:
· 0x030x0B 增加了 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 MHz50 Mbps / 6.3 MB/s100 Mbps / 12.5 MB/s200 Mbps / 25 MB/s400 Mbps / 50 MB/s
80 MHz80 Mbps / 10 MB/s160 Mbps / 20 MB/s320 Mbps / 40 MB/s640 Mbps / 80 MB/s
104 MHz104 Mbps / 13 MB/s208 Mbps / 26 MB/s416 Mbps / 52 MB/s832 Mbps / 104 MB/s
133 MHz133 Mbps / 16.6 MB/s266 Mbps / 33 MB/s532 Mbps / 66.5 MB/s1064 Mbps / 133 MB/s
166 MHz166 Mbps / 20.8 MB/s332 Mbps / 41.5 MB/s664 Mbps / 83 MB/s1328 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)避免模式切换
QE 位:不同厂商位置不同,抄错就是“Quad 全 0xFF”

使用 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 / IS25WPSR1[6]0x01
Infineon / Cypress S25FLCR1[1](配置寄存器)0x01 写 SR1+CR1
Micron MT25Q无独立 QE 位增强型易失配置寄存器 0x61 / 0x65
XTX / BY / PY / FM(多数)多为 SR2[1]0x31 / 0x01,仍需逐型号核对

另注意 QE 位可能是非易失(掉电保持)的,写一次即长期有效;也有型号提供易失版本。软件应先读后判断再写,避免每次上电都做一次擦写、无谓消耗状态寄存器寿命。

关键命令速览

命令名称说明
0x9FRead JEDEC ID返回制造商 ID + 器件 ID(2 B);上电自检必做
0x5ARead SFDP读串行 Flash 可发现参数表,通用驱动的基础
0x06 / 0x04Write Enable / Disable每次编程、擦除、写状态寄存器前都要先发 0x06(置 WEL)
0x05 / 0x35Read Status Reg1 / Reg2SR1 bit0 = WIP(忙),bit1 = WEL;SR2 常含 QE
0x01 / 0x31Write Status Reg写 SR1 / SR2(含 QE、BP、SRP/SRL)
0x03Read Data低速读,无 dummy,通常限 33 ~ 50 MHz
0x0BFast Read带 8 dummy 周期,可跑到器件最高频率
0x3B / 0xBBDual Output / Dual I/O数据 2 线 / 地址+数据 2 线
0x6B / 0xEBQuad Output / Quad I/O数据 4 线 / 地址+数据 4 线;需 QE=1
0x02Page Program页编程,≤ 256 B 且不可跨页边界
0x32Quad Page Program4 线页编程;需 QE=1,提速有限(受编程时间限制)
0x20Sector Erase擦除 4 KB 扇区,30 ~ 100 ms
0x52 / 0xD8Block Erase擦除 32 KB / 64 KB 块,150 ~ 500 ms
0xC7 / 0x60Chip Erase整片擦除,20 ~ 200 s
0x38 / 0xFFEnter / Exit QPI进入 / 退出 4-4-4 模式
0xB7 / 0xE9Enter / Exit 4-Byte Address> 128 Mb 器件访问全空间必需
0xB9Deep Power-Down进入超低功耗,电流降到 µA 级
0xABRelease Power-Down / Read ID唤醒;也可返回 8 bit 器件 ID
0x66 + 0x99Enable Reset + Reset软复位(两条连发);部分型号需先使能
0x75 / 0x7AErase/Program Suspend / Resume擦除期间插入读操作,改善 XIP 实时性
CS# 时序:两个高频踩坑点

整条指令期间 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 上电 / 掉电时序

SPI NOR Flash 上电时序 VCC 单调上升到 VCC(min) 后需等待 tVSL,CS# 期间由上拉电阻保持高电平,之后才可拉低 CS# 发出第一条命令。 上电时序(VCC 斜坡 → tVSL → 首条命令) VCC CS# SCK / 命令 上电期间 CS# 由 10k 上拉为高 首条命令(如 0x9F 读 ID) 单调上升,禁止台阶 tVSL(VCC 稳定 → 首条命令)
图 3-1 上电时序:VCC 斜坡、tVSL 等待与首条命令

上电要求

  • 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 Flash 功耗状态与转换指令 三个功耗状态:工作态 15 至 35 毫安、待机态 10 至 50 微安、深度掉电态 1 至 15 微安;用 0xB9 进入深度掉电,用 0xAB 唤醒。 功耗状态与转换指令 上电 / 复位 工作 Active 15 ~ 35 mA 待机 Standby 10 ~ 50 µA Deep Power-Down 1 ~ 15 µA CS# 拉高 发新指令 0xB9 0xAB 唤醒:0xAB + 3 dummy byte + tRES
图 3-2 功耗状态机:待机、Deep Power-Down 与唤醒
SPI NOR 相对 SD NAND 的低功耗优势

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 断电方案,切电前必须处理 IO

断开 VCC 之前,必须把 CS#、CLK、DI 全部置为低电平或高阻,并断开上拉电阻的供电(上拉必须接在被开关后的 VCC 上,而不是主 3.3 V)。否则主控输出的高电平会通过 Flash IO 脚的 ESD 二极管倒灌到已断电的 VCC 网络,实测漏电可达 50 ~ 500 µA,等于白做断电。另外,断电会丢失所有易失设置(QE 若为易失版本、4 字节地址模式、连续读模式、dummy 配置),恢复后必须重新走一遍初始化流程。

4 · 典型应用电路

4.1 标准 SPI 四信号接法

标准 SPI 四信号最小系统接法 主控 SPI 经 33 欧串阻连接 Flash 的 CS#、CLK、DI、DO;CS# 用 10k 上拉到 VCC,WP# 与 HOLD# 各用 10k 上拉,VCC 配 0.1 微法与 4.7 微法去耦电容并接地。 标准 SPI(1-1-1)最小系统接法 VCC (3.3 V 或 1.8 V) 主控 MCU SPIx_NSS SPIx_SCK SPIx_MOSI SPIx_MISO SPI NOR Flash XT25F64F 系列 1 CS# 6 CLK 5 DI (IO0) 2 DO (IO1) 3 WP# / IO2 7 HOLD# / IO3 33R 33R 33R 33R 四根信号线均串 33 Ω(可选) 10k 10k 10k 8 VCC 0.1µF 4.7µF 10k 10k 4 GND
图 4-1 标准 SPI(1-1-1)四信号最小系统接法
图 4-1 设计说明
  • 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 µF bulk 就近放置。两只电容的另一端都必须显式接地并就近打过孔。
  • 此接法保留了 WP# 硬件写保护与 HOLD# 功能,是 Bootloader / 参数区 / 对可靠性要求高的场合的推荐接法。

4.2 Quad SPI 六信号接法

Quad SPI 六信号接法 主控 QSPI 控制器的 CS#、CLK 与 IO0 至 IO3 六根线各串一只 33 欧可选串阻后连接 Flash;CS# 用 10k 上拉,IO0 至 IO3 各用 4.7k 弱上拉,上拉点均在串阻之后的器件侧;CLK 与四根数据线要求等长。 Quad SPI(1-4-4 / 4-4-4)六信号接法 VCC (3.3 V 或 1.8 V) 主控 QSPI 控制器 QSPI_NCS QSPI_CLK QSPI_IO0 QSPI_IO1 QSPI_IO2 QSPI_IO3 SPI NOR Flash XT25F64F 系列 · Quad / QPI 1 CS# 6 CLK 5 IO0 / DI 2 IO1 / DO 3 IO2 / WP# 7 IO3 / HOLD# 33R 33R 33R 33R 33R 33R 六根信号线均串 33 Ω(可选) 等长 六根串阻取值一致,均靠驱动端放置 10k 4.7k 4.7k 4.7k 4.7k 上拉到 VCC:CS# 10k,IO0~IO3 4.7k 8 VCC 0.1µF 4.7µF 4 GND
图 4-2 Quad SPI(1-4-4 / 4-4-4)六信号接法
图 4-2 设计说明
  • 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 SDR133 MHz4 bit × 133 MHz≈ 66 MB/s基准
Octal SDR133 MHz8 bit × 133 MHz≈ 133 MB/s2.0 ×
Octal SDR166 MHz8 bit × 166 MHz≈ 166 MB/s2.5 ×
Octal DTR(双沿)200 MHz8 bit × 2 × 200 MHz≈ 400 MB/s6.0 ×
8 线不是 Quad 的简单扩展,三个硬前提缺一不可

① 主控必须带 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 线模式

Octal SPI 十信号接法 主控 OSPI 控制器的 CS#、CLK 与 IO0 至 IO7 共十根线连接 Octal SPI NOR Flash,另含 DQS 数据选通与 RESET#;十一根信号线各串一只 33 欧可选串阻;CS# 用 10k 上拉,IO0 至 IO7 与 DQS 各用 4.7k 弱上拉,上拉点均在串阻之后的器件侧;CLK、IO0 至 IO7 与 DQS 共十根线要求严格等长;VCC 配 0.1 微法与 4.7 微法去耦电容。 Octal SPI(1-8-8 / 8-8-8)十信号接法 VCC(Octal 器件多为 1.8 V,3.3 V 档见型号表) 主控 OSPI 控制器 OSPI_NCS OSPI_CLK OSPI_IO0 OSPI_IO1 OSPI_IO2 OSPI_IO3 OSPI_IO4 OSPI_IO5 OSPI_IO6 OSPI_IO7 OSPI_DQS RESET# 另用 GPIO 驱动 Octal SPI NOR Flash XT25F256BSFIGT · SOP-16 300mil 1 CS# 6 SCLK 5 IO0 / SI 2 IO1 / SO 3 IO2 / WP# 9 IO3 10 IO4 11 IO5 12 IO6 13 IO7 14 DQS 7 RESET# 8 VCC | 4 GND 33R 33R 33R 33R 33R 33R 33R 33R 33R 33R 33R 十一根信号线均串 33 Ω(可选) 等长(10 根) 10k 4.7k 4.7k 4.7k 上拉到 VCC:CS# 10k,IO0~IO7 与 DQS 各 4.7k(共 9 只) IO1~IO6 上拉同 IO0 8 VCC 0.1µF 4.7µF 4 GND CS#、CLK、IO0 ~ IO7 与 DQS 共十一根线全部串 33 Ω,取值一致、不留例外;均为可选端接,靠驱动端放置。引脚编号为通用示意,务必按所选型号 datasheet 核对。
图 4-3 Octal SPI(1-8-8 / 8-8-8)十信号接法。引脚编号为 Octal SOP-16 的通用示意,不同厂商 / 型号顺序不统一,建库前必须逐型号核对 datasheet。
图 4-3 设计说明
  • 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 Mb2.7~3.6 VMP3.3 V 系统首选,引脚可见、易焊接易飞线,适合工控与调试阶段
XT25W512BSFIGA512 Mb1.65~3.6 VMP宽压,可同时兼容 1.8 V / 3.3 V 系统
XT25Q512FSFIGA512 Mb1.7~2.0 VMP1.8 V 系统主力,512 Mb 大容量
XT55Q1GFSFIGA1 Gb1.7~2.0 VCS容量上限型号,量产前须确认转 MP 进度
BGA-24
6×8 mm
XT25Q512FBGIGA512 Mb1.7~2.0 VCS面积最小,需 4 层板 + 完整扇出;必须 X-Ray 检焊
XT55Q1GFBGIGA1 Gb1.7~2.0 VUD在研,不建议新项目选用
XT55Q2GFBGIGA2 Gb1.7~2.0 VSS送样阶段,仅可用于预研
封装与位宽强相关,别按容量选型

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 四种拓扑:先定「片选从哪来,总线要不要隔离」

所有多设备方案,本质上只回答两个问题:片选信号怎么产生,以及共享总线要不要被切开。这两个问题的组合给出下面四种拓扑。

1 路 SPI 挂多个设备的四种拓扑A 独立 CS# 直驱、B 译码器扩展、C 移位寄存器扩展、D 总线开关隔离 四种方案对比1 路 SPI 挂多个设备的四种拓扑:差别只在「片选怎么来,总线要不要隔离」A 独立 CS#(GPIO 直驱)MCU直驱(无额外器件)SPI NOR #1SPI NOR #2SPI NOR #3共享总线 SCK / IO0~IO3CS# 各一根占用主控 IO:总线 4 + 每片 1 根 CS#适合片数:2 ~ 4(再多就吃不消)主要代价:片数线性吃掉 GPIOB 译码器扩展(3 → 8)MCU74LVC1383 根地址线 → 8 个 CS#SPI NOR #1SPI NOR #2SPI NOR #3共享总线 SCK / IO0~IO3片选来源占用主控 IO:总线 4 + 地址 3 + 使能 1适合片数:5 ~ 8(级联可更多)主要代价:多一颗逻辑,CS# 多 5.8 ns 延迟C 移位寄存器扩展MCU74HC5953 根 SPI → 8 位并行 CS#SPI NOR #1SPI NOR #2SPI NOR #3共享总线 SCK / IO0~IO3片选来源占用主控 IO:总线 4 + 595 的 3 根适合片数:8 ~ 24(可多级串联)主要代价:切换要重写寄存器,不适合频繁换片D 总线开关 / 电平转换隔离MCU总线开关把总线切成 2 ~ 4 段SPI NOR #1SPI NOR #2SPI NOR #3共享总线 SCK / IO0~IO3片选来源占用主控 IO:总线 4 + 选择 1 ~ 2适合片数:分 2 ~ 4 组,组内各自扩展主要代价:Ron + 带宽上限,且要隔离才划算
图 4-4 1 路 SPI 挂多个设备的四种拓扑。SCK / IO0~IO3 始终是共享总线,四种方案的差别在于片选的产生方式与总线是否被隔离。
拓扑占用主控 IO适合片数切换开销什么时候该选它
A 独立 CS# 直驱总线 4 + 每片 1 根 CS#2 ~ 4零(GPIO 直接翻转)默认方案。片数少、切换频繁时无可替代
B 译码器扩展总线 4 + 地址 3 + 使能 15 ~ 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 片以上、切换少 → C8 片以上、切换频繁 → B 级联(两片 138 用使能脚分层)。
  • 只要电压域不同 → 必须 D,这与片数无关,是硬约束。

4.5.3 拓扑 A:独立 CS# 直驱的接线规则

两片时几乎没有代价,四片时就要开始算账了。下图是两片的接法,挂 N 片同理——再增加 N−2 个 CS# 与对应的 Flash 即可。

1 路 SPI 挂多个设备的四种拓扑A 独立 CS# 直驱、B 译码器扩展、C 移位寄存器扩展、D 总线开关隔离 四种方案对比1 路 SPI 挂多个设备的四种拓扑:差别只在「片选怎么来,总线要不要隔离」A 独立 CS#(GPIO 直驱)MCU直驱(无额外器件)SPI NOR #1SPI NOR #2SPI NOR #3共享总线 SCK / IO0~IO3CS# 各一根占用主控 IO:总线 4 + 每片 1 根 CS#适合片数:2 ~ 4(再多就吃不消)主要代价:片数线性吃掉 GPIOB 译码器扩展(3 → 8)MCU74LVC1383 根地址线 → 8 个 CS#SPI NOR #1SPI NOR #2SPI NOR #3共享总线 SCK / IO0~IO3片选来源占用主控 IO:总线 4 + 地址 3 + 使能 1适合片数:5 ~ 8(级联可更多)主要代价:多一颗逻辑,CS# 多 5.8 ns 延迟C 移位寄存器扩展MCU74HC5953 根 SPI → 8 位并行 CS#SPI NOR #1SPI NOR #2SPI NOR #3共享总线 SCK / IO0~IO3片选来源占用主控 IO:总线 4 + 595 的 3 根适合片数:8 ~ 24(可多级串联)主要代价:切换要重写寄存器,不适合频繁换片D 总线开关 / 电平转换隔离MCU总线开关把总线切成 2 ~ 4 段SPI NOR #1SPI NOR #2SPI NOR #3共享总线 SCK / IO0~IO3片选来源占用主控 IO:总线 4 + 选择 1 ~ 2适合片数:分 2 ~ 4 组,组内各自扩展主要代价:Ron + 带宽上限,且要隔离才划算
图 4-5 1 路 QSPI 挂载两片 SPI NOR。SCK / IO0~IO3 为共享总线(主控侧串阻一次即可),每片 Flash 独立 CS#、独立上拉。
图 4-5 要点
  • 共享线只串一次阻: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

74LVC138 译码器扩展 CS# 原理图主控用 3 根地址线驱动 74LVC138,得到 8 路低有效片选;SCK 与 IO0~IO3 仍是共享总线译码器扩展 CS#:3 根地址线 + 1 根使能,换 8 个片选共享总线SCK / IO0~IO3MCU / SoC• QSPI 控制器• 4 根共享总线• 3 根 GPIO = A/B/C• 1 根 GPIO = EN(总线与地址线 来自同一电源域)74LVC138A3→8 译码 · 输出低有效A / B / CG1(高有效使能)G2A# / G2B#(低有效)Y0Y1Y2Y3Y4Y5Y6Y7虚线框的 Y4 ~ Y7 为预留A / B / C(3 根)EN → G1G2A# / G2B# 接地常开SPI NOR #1CS# ← Y0 总线 ← SCK/IO0~IO3Y0串 33 ΩSPI NOR #2CS# ← Y1 总线 ← SCK/IO0~IO3Y1串 33 ΩSPI NOR #3CS# ← Y2 总线 ← SCK/IO0~IO3Y2串 33 ΩSPI NOR #4CS# ← Y3 总线 ← SCK/IO0~IO3Y3串 33 Ω↑ Y4 ~ Y7 可再挂 4 片,主控 IO 不变为什么行得通138 的输出是低有效,天然就是 CS#;任一时刻只有一路 Y 为低,硬件上保证了片选互斥——比软件管更可靠。时序代价74LVC138A 在 3.3 V 下 tpd 最大 5.8 ns,要算进 CS# 相对 SCK 的建立 / 保持;133 MHz 周期仅 7.5 ns,别直接忽略。最容易被忽略的一点上电 / 复位期间地址线电平未定,138 可能短暂误选通某片。必须用 G1 使能门控:初始化完成、地址线稳定后再放开使能。
图 4-6 74LVC138 译码器扩展 CS#:主控用 3 根地址线 + 1 根使能换 8 路低有效片选,SCK / IO0~IO3 仍是唯一的一条共享总线。
器件功能输出极性供电范围关键参数适用
74LVC138A3 → 8 译码低有效1.65 ~ 3.6 Vtpd ≤ 5.8 ns @ 3.3 V;输入可耐 5.5 V首选,输出极性天然就是 CS#
74LVC139双 2 → 4 译码低有效1.65 ~ 3.6 V与 138 同系列需要两组彼此独立的 4 选 1 时
74HC1544 → 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,因此只适合「选中之后连续大块读写、不常换片」的应用。

74HC595 的输出是高有效,直接接 CS# 会出事

CS# 是低有效,而 595 的并行输出是高有效。直接连上的后果是「选中的那片反而不通,其余七片全被选通」——八片同时驱动 MISO,总线直接打死。必须做下面两件事之一:

  • 硬件反相:595 输出后串一级 74LVC04 / 74HC04 反相器(推荐,行为确定)。
  • 软件取反 + OE# 门控:发送数据前按位取反,同时把 595 的 OE# 用上拉拉高,使上电期间输出为高阻,各 CS# 靠自己的上拉保持高电平(不选通);初始化完成后再拉低 OE#。注意软件取反在复位窗口内仍然不可靠,能加反相器就加。

4.5.5 布线拓扑:星型分支 vs 链式 Fly-by

原理图连对了,Layout 还能把它毁掉。同一段总线有两种走法,差别在于分支点放在哪

多设备布线拓扑:星型分支 vs 链式 Fly-by星型分支各支线等长、每个分支只带一个负载;链式 Fly-by 主干串联,负载沿线累加同一段总线,两种走法:分支点在哪,决定了 Stub 和反射在哪A 星型分支(推荐)分支点尽量靠近主控,各支线等长;每个分支末端只挂一个负载MCUQSPI主干SPI NOR #1SPI NOR #2SPI NOR #3Stub 等长 L每段只带1 个负载6 ~ 8 pFB 链式 / Fly-by(谨慎使用)主干依次穿过各器件焊盘,省走线面积,但负载沿线累加、阻抗反复跳变MCUQSPISPI NOR #1短线(Stub)SPI NOR #2短线(Stub)SPI NOR #3短线(Stub)负载沿线累加每段走线都带前级全部负载注意:SPI NOR 不支持协议级「移位菊链」(那是 JTAG / LED 驱动的方式)。这里的「链式」只指 PCB 走线方式,各片仍必须各有独立 CS#。
图 4-7 多设备布线拓扑。星型分支各支线等长、每个分支只带一个负载;链式 Fly-by 主干依次穿过各器件焊盘,负载沿线累加。
对比项A 星型分支B 链式 / Fly-by
走线长度较长,需要更多布线面积较短,主干一条穿过去
各片负载分布每个分支末端只挂 1 个负载每段走线都带着前级全部负载
阻抗连续性分支点处一次突变每个器件焊盘处都突变一次
等长难度各支线等长即可,主控需有余量天然先后到达,各片时序本就不一致
适用133 MHz 及以下的绝大多数场合板面积紧张、频率 ≤ 50 MHz、片数 ≥ 3
Layout 硬规则
  • 分支点尽量靠近主控,主干越短越好;Stub(从分支点到器件焊盘的支线)建议 ≤ 5 mm,超过后反射会明显吃掉眼图裕量。
  • 各支线等长:SCK 与 IO0 ~ IO3 按 4.2 的等长组约束;不同片之间的支线长度也尽量一致,避免「第一片能跑 133 MHz、第四片只能跑 80 MHz」。
  • 总线下方地平面必须完整,不允许被电源分割槽切断;换层处 200 mil 内要有回流地孔。
  • 各片去耦电容紧贴各自 VCC,回流路径最短。
SPI NOR 不支持协议级「移位菊链」

JTAG、LED 驱动芯片(如 74HC595 级联)那类器件把 SDO 接到下一级 SDI、数据逐级往下传,这叫协议级菊链。SPI NOR Flash 没有这个模式——每片都必须各自收到完整的命令 + 地址,因此每片必须有独立的 CS#。本文档里说的「链式 / Fly-by」仅指 PCB 走线方式,与协议无关,不要混为一谈。

4.5.6 拓扑 D:混合电压域与总线隔离

只要总线上有一个器件与主控不同电压域(比如 1.8 V 主控挂 3.3 V Flash),或者混了非存储类从设备,就必须引入隔离 / 转换。这一步加错了器件,比不加还糟。

多设备共享总线的电平转换与隔离A 转换器放在共享总干线上,一次转换所有器件共用;B 每个分支各放一套,隔离更好但器件更多混合电压域共享总线:转换器放总干线上,还是每个分支各放一套?A 转换器放在共享总干线上(推荐)一次转换,所有器件共用;器件少、成本低MCU1.8 V 域SN74AXC4T245DIR 控制型(或 TXU0304)3.3 V 域SPI NORCS# 各一根SPI NANDCS# 各一根传感器CS# 各一根总线只转换一次;分支上都是同电压、同模式器件时最优B 每个分支各放一套(需要隔离时才划算)器件多、成本高,但各组可以彻底断开MCU1.8 V 域AXC4T245 / 总线开关SPI NOR3.3 V该组可单独断电 / 单独隔离AXC4T245 / 总线开关SPI NAND3.3 V该组可单独断电 / 单独隔离AXC4T245 / 总线开关传感器1.8 V该组可单独断电 / 单独隔离某个器件会拉死总线、或电压域不同、或需要单独断电时,才值得这样拆多设备 + 高速 QSPI 场景,这两类电平转换器不要用TXB0104 / TXS0108E(自动方向型)① 数据率上限约 60 Mbps,133 MHz QSPI 直接超② 内部靠 one-shot 边沿加速,外部禁止加上拉 / 电容BSS138 之类的 MOS 管方案开漏结构 + 上拉,典型只有 1 Mbps 量级,只适合 I²C 类低速信号,不能进 QSPI 总线
图 4-8 混合电压域共享总线的两种接法:转换器放在共享总干线上(一次转换,器件共用),或每个分支各放一套(可单独隔离 / 断电)。
器件类型速率能力能否用于多设备 QSPI 总线
SN74AXC4T245DIR 控制型电平转换~380 Mbps 级推荐,4 位 / 方向可控,适合 SCK + CS# + 双向 IO
SN74AVC4T245DIR 控制型电平转换~380 Mbps 级推荐,同上
TXU0304固定方向电平转换100 Mbps @ 1.8↔3.3 V可用,注意是单向,双向 IO 要两片或改选型
TXB0104 / TXS0108E自动方向型约 60 Mbps(TI 官方口径)禁止,见下方红框
BSS138 等 MOS 管方案开漏 + 上拉~1 Mbps 量级禁止,只适合 I²C 类低速信号
自动方向型电平转换器(TXB / TXS)为什么不能用
  • 带宽不够:这类器件内部靠 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,后一片就开始驱动,两片输出对打。

多设备 CS# 切换时序与总线争用场景一:两片 CS# 之间留足间隔,前片释放总线后后片才驱动;场景二:CS# 重叠,两片同时驱动 MISO 造成争用换片的瞬间最危险:前一片还没放开 MISO,后一片就抢着驱动场景一 安全的换片(前片彻底释放后,后片才驱动)CS#0CS#1SCKIO1 (MISO)高阻tDIS≤ 7 ns,前片释放 MISO 所需tSHSL ≥ 10 ns(读)/ 50 ns(写)间隔充足,不会撞车场景二 CS# 重叠导致的争用(两片同时驱动 MISO)CS#0CS#1SCKIO1 (MISO)争用窗口两片对打电平被拉偏 / 读到错误数据 / 长期可能损坏输出级软件必须保证:任意时刻只有一个 CS# 有效,且两片切换之间插入 ≥ tSHSL 的间隔。用 GPIO 模拟 CS# 时,硬件自动插入的 tSHSL 不再生效,这一段要自己写。
图 4-9 CS# 切换时序。上:两片之间留足间隔,前片释放 MISO 后后片才驱动;下:CS# 重叠,两片同时驱动 MISO,产生争用窗口。

下表给出典型 SPI NOR 的 CS# 相关时序参数。不同厂商、不同型号的差别非常大(例如 CS# 高电平时间,Winbond W25Q 只要 10 ns,Microchip SST25 却要求 50 ~ 100 ns),所以这里的数字只能用来建立量级概念,设计时必须查自己那颗料的数据手册。

参数含义W25Q128JV(Rev. D)SST25 系列(25 / 50 MHz)
tSLCH(tCSSCS# 有效相对 SCK 的建立时间5 ns(min)10 / 5 ns(min)
tCHSHCS# 有效相对 SCK 的保持时间3 ns(min)10 / 5 ns(min)
tSHCHCS# 无效相对 SCK 的建立时间3 ns(min)10 / 5 ns(min)
tCHSLCS# 无效相对 SCK 的保持时间5 ns(min)10 / 5 ns(min)
tSHSL1CS# 取消选择时间(读之后10 ns(min)
tSHSL2CS# 取消选择时间(擦 / 写之后50 ns(min)
tCPHCS# 高电平持续时间100 / 50 ns(min)
tSHQZ(tDIS输出禁止时间(CS# 变高 → 输出高阻)7 ns(max)15 / 8 ns(max)
tCLQVSCK 变低到输出有效6 ns(max)15 / 8 ns(max)
用 GPIO 模拟 CS# 时,硬件不再帮你插间隔

主控的硬件 QSPI 外设会在两次片选之间自动插入 tSHSL,这是换片安全的根本保障。但当片数超过硬件 CS# 数量、改用 GPIO 软件模拟 CS# 时,这个自动插入就没了——软件连续翻转两个 GPIO 的间隔可能只有几纳秒,直接踩进争用窗口。

必须做的三件事:

  • 在驱动层显式实现「拉高 CS#A → 延时 → 拉低 CS#B」,延时按 max(tSHSL, tDIS) 再留一倍余量取值。
  • 擦 / 写之后换片要等更久:tSHSL2 = 50 ns,是读之后(10 ns)的 5 倍。用同一个延时值覆盖两种场景最容易翻车。
  • 如果用了译码器(4.5.4),还要把译码器的 tpd 也算进这个间隔
调试手法:先低速逐一验 ID,再提速
  1. 把总线降到 1 ~ 5 MHz、强制 Standard SPI(1-1-1)模式。
  2. 依次拉低每一个 CS#,读 JEDEC ID(0x9F)。每次应当只读到一片的 ID;如果两片同时回答,说明 CS# 译码有误或上拉接错。
  3. 确认 CS# 映射无误后,再逐片切 Quad、逐步升频;每升一档都做一次全片读校验。
  4. 用示波器同时抓 CS#A、CS#B、IO1 三条线,重点看换片瞬间 IO1 上有没有出现「两个电平打架」的中间台阶。

4.5.8 负载预算:挂到第几片开始吃力

这是多设备方案最容易被跳过、也最容易在量产时爆雷的一步。核心事实是:未被选中的器件,其引脚电容依然挂在总线上。片数越多,总线越重,边沿越缓,最终时序不再被保证。

多设备负载电容预算与上升时间降额左:1~4 片时一根 IO 线上的电容构成,30 pF 为 datasheet AC 参数标定条件;右:上升时间随负载增长,与 133 MHz 周期对比挂到第几片开始吃力:把电容算出来,而不是凭感觉一根 IO 线上的电容是怎么堆起来的(器件 IO 引脚取 8 pF、主控 8 pF、走线按 1 pF/cm 估)21 pF1 片33 pF2 片45 pF3 片57 pF4 片30 pFdatasheet 标定条件主控引脚各片 IO 引脚PCB 走线上升时间 vs 133 MHz 的时钟周期tr ≈ 2.2 × R × CL,R 取驱动器内阻 + 33 Ω 串阻 ≈ 48 Ω010203040506002468总线负载 CL(pF)tr(ns)133 MHz 周期 7.5 ns建议上限 tr ≈ 3 ns(40% 周期)2.2 ns1 片3.5 ns2 片4.8 ns3 片6.0 ns4 片2 片起 tr 就超过建议值:先降频试,别硬跑 133 MHz以上为估算:tr 用一阶 RC 近似,未计封装寄生与过孔;最终以实测眼图 / 波形为准。
图 4-10 多设备负载电容预算。左:1 ~ 4 片时一根 IO 线上电容的构成,30 pF 是 datasheet AC 参数的标定条件;右:上升时间随负载增长,与 133 MHz 周期(7.5 ns)对比。

先明确两个来自 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 pF8 pF约 5 pF约 21 pF约 2.2 ns可跑满 133 MHz
2 片8 pF16 pF约 9 pF约 33 pF约 3.5 ns已超标定条件,建议实测
3 片8 pF24 pF约 13 pF约 45 pF约 4.8 ns建议降到 80 MHz 以下
4 片8 pF32 pF约 17 pF约 57 pF约 6.0 ns建议 50 ~ 80 MHz,或改方案
tr 是怎么估出来的

用一阶 RC 近似:tr ≈ 2.2 × R × CL,其中 R 取驱动器内阻加串阻,约 15 Ω + 33 Ω = 48 Ω。经验上 tr 不应超过时钟周期的 40%,对应 133 MHz(周期 7.5 ns)就是 3 ns。这个模型没有计封装寄生和过孔,只用于快速判断量级,最终以实测波形 / 眼图为准。

算不过来时的降额手段(按优先级)
  1. 缩短走线、减少过孔:最有效且零成本。走线电容按 1 pF/cm 估,省 5 cm 就省 5 pF。
  2. 降频:133 → 104 → 80 → 50 MHz。这是最直接的换裕量方式,代价只有性能。
  3. 放大或精简上拉:各片 4.7 kΩ 改成 10 kΩ,或只在总线末端保留一组(见 4.5.3)。
  4. 减小串阻:33 Ω → 22 Ω,但要重新确认过冲仍在允许范围内,别把反射问题引回来。
  5. 用总线开关把总线切成两组(图 4-8 的 B 方案):任一时刻只有一组挂在总线上,负载直接减半。这是超过 4 片时最有效的办法。
  6. 换个思路:容量问题就换更大容量单片;非要 4 片以上,评估主控是否带第二组 QSPI(双总线各挂两片)。

4.5.9 多设备原理图设计检查清单

画完原理图、投板之前,逐条对照打勾。前面几节的所有结论都收敛在这张表里。

#检查项合格标准
1片选是否真正独立每片一个独立 CS#;不允许多片共用 CS#(除非是厂商明确支持的多 die 合封)
2CS# 上拉每个 CS# 有上拉,阻值 10 ~ 100 kΩ,不照搬 IO 线的 4.7 kΩ
3SCK 下拉SCK 有一组 100 kΩ 下拉,保证主控高阻期间 SCK 停在低电平
4IO 上拉的并联效应已按片数核算并联阻值与灌电流;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;否则已做物理隔离
15WP# / HOLD#不用时固定接高或接低,不允许浮空
16 Layout 拓扑星型分支、Stub ≤ 5 mm、地平面完整、换层有回流地孔
17调试预案已规划低速逐一读 ID 的验证步骤;示波器能同时抓到两路 CS# 与 IO1
一句话总结

多设备设计里,原理图连接反而是最简单的部分。真正决定成败的是三件容易被跳过的事:上拉的并联效应(4.5.3)、换片时的总线争用(4.5.7)、以及随片数线性增长的负载预算(4.5.8)。这三件事画原理图时都看不见,却会在调试和量产阶段准时出现。

📥 芯参谋客户端下载