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

SPI_NAND_Flash_电路设计指南

生成时间 2026-09-17 15:50:50 长期有效

SPI NAND Flash 电路设计指南

编制日期 2026-09-21 | 版本号 Rev 1.0

页 / 块存储结构 · 内置 ECC 与坏块管理 · Standard / Dual / Quad / DTR · 掉电安全 · PCB Layout 与量产

0.1 适用范围

本指南面向使用 SPI NAND Flash(串行 NAND,1-bit / 2-bit / 4-bit SPI 接口,SLC 工艺为主)作为代码或数据存储的硬件与固件设计,覆盖器件选型、原理图设计、电源与低功耗、PCB Layout、可靠性与量产测试。

典型应用:IoT 终端、智能家电、可穿戴、工业 HMI、路由器与网关、摄像头模组、MCU 外部数据存储 / 日志 / OTA 备份区。

最重要的一句话

SPI NAND 不是 SPI NOR。它不能随机读、不能 XIP、写前必须先整块擦除、出厂就带坏块、每次读写都必须检查 ECC 状态。把 SPI NOR 的驱动直接套到 SPI NAND 上,一定会出错。硬件上两者引脚兼容,但软件栈完全不同。

0.2 同系列文档

文档器件类型关注重点
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 接口、上拉电阻与总线电容、页写与写保护

1 · 器件基础

选型先定接口与容量,再定封装与温度等级。SPI NAND 的核心价值是:用 8 个引脚换来 NOR 给不了的大容量与低成本。

1.1 器件定位与选型对比

对比项SPI NANDSPI NOR并行 NANDeMMCSD NAND
典型容量128 MB ~ 4 GB512 KB ~ 256 MB1 ~ 8 GB4 ~ 128 GB128 MB ~ 8 GB
接口SPI / QSPI(×1 / ×2 / ×4)SPI / QSPI / QPI8-bit 并行 ONFIeMMC 8-bit / HS400SPI 或 SDIO
引脚数8(BGA 16 / 24)8(BGA 24)48 / 63153 / 1698(LGA-8)
随机读不支持 需整页 Loadns 级任意地址不支持 整页读支持(控制器)支持(控制器)
XIP不可可以不可不可(需搬 RAM)不可
读吞吐13 ~ 133 MB/s(接口)50 ~ 400 MB/s40 ~ 200 MB/s100 ~ 400 MB/s10 ~ 50 MB/s
写速度(有效)0.5 ~ 3 MB/s0.1 ~ 1 MB/s5 ~ 40 MB/s10 ~ 150 MB/s2 ~ 15 MB/s
编程单位页 2048 B页 256 B(字节可编程)页 4 ~ 16 KB512 B 块512 B 块
擦除单位块 128 KB扇区 4 KB / 块 32 ~ 64 KB块 128 ~ 512 KB内部管理内部管理
坏块管理主控负责无坏块主控负责内置内置
ECC多数内置,需查状态位不需要主控实现内置内置
主控负担中(FTL / BBT / 磨损均衡)
成本(同容量)最低
选型一句话

要跑代码 / 要 XIP → SPI NOR;只要存数据且 > 128 MB、引脚紧张、成本敏感 → SPI NAND;主控没有 NAND 驱动能力或不想做 FTL → SD NAND / eMMC。

1.2 常见封装与引脚定义

封装尺寸典型型号特点
WSON-8(6×5 mm)6.0 × 5.0 × 0.8 mm,pitch 1.27W25N01GV / MT29F1G01 / MX35LF1G主流,底部散热焊盘,手工可焊
WSON-8(8×6 mm)8.0 × 6.0 × 0.8 mm,pitch 1.27W25N02KV / W25N04KV / 部分 Kioxia大容量型号,引脚排布需核对
SOP-8(208 mil)5.3 × 7.9 mm,pitch 1.27GD5F1GQ / MX35LF1G最好焊接与返修,体积大
USON-8 / DFN-84.0 × 3.0 / 3.0 × 2.0 mm部分小容量型号超小体积,焊接难度高
BGA-16 / BGA-24球距 0.8 / 1.0 mmW25N01GV IT / MT29F 系列球位各厂差异大,必须按 datasheet 建库
警告:引脚定义各厂商不完全一致

SPI NAND 的 8 脚排列虽然大多沿用 SPI NOR 的通用排布(1=CS#、2=DO/IO1、3=WP#/IO2、4=GND、5=DI/IO0、6=CLK、7=HOLD#/IO3、8=VCC),但存在真实差异:

  • 第 7 脚功能不同:部分型号是 HOLD#,部分是 RESET#,部分是 HOLD#/RESET# 复用(由配置寄存器选择)。设计成 RESET# 时,复位时序与上拉要求不同。
  • BGA 球位完全不同:同为 BGA-24,Winbond、Micron、Kioxia 的球定义不可互换,不能凭经验建库
  • WSON 底部焊盘:多数接地或悬空,少数型号底部焊盘有电气连接要求,需查 Land Pattern 章节。
  • IO2 / IO3 内部上拉:部分型号内置弱上拉,外部可不加上拉;部分型号必须外部上拉,否则 Quad 模式不稳定。

结论:原理图与 PCB 建库前,必须逐一核对目标型号的 datasheet 引脚表与封装图,禁止直接复制同系列其他型号或 SPI NOR 的封装。

SPI NAND 八脚封装引脚定义(顶视图) 八脚封装顶视图,左侧 CS#、DO/IO1、WP#/IO2、GND,右侧 VCC、HOLD#/RESET#/IO3、CLK、DI/IO0。 SPI NAND 八脚通用引脚定义(顶视图) SPI NAND WSON-8 / SOP-8 顶视 Pin 1 1 CS# 2 DO / IO1 3 WP# / IO2 4 GND 8 VCC 7 HOLD# / RESET# / IO3 6 CLK (SCK) 5 DI / IO0 警告:各厂商 / 型号的复用功能(HOLD# 或 RESET#)与 BGA 球位不完全一致,须逐一核对。 Quad 模式需占用 IO2 / IO3 作数据线,此时硬件上不能再把它们当作 WP# / HOLD# 使用。
图 1-1 · 八脚封装通用引脚定义。适用范围:WSON-8 6×5 / 8×6、SOP-8、USON-8;BGA 封装请以 datasheet 球位图为准。

引脚功能说明

引脚类型说明硬件设计要点
CS#输入片选,低有效;帧起始 / 结束必须 10 kΩ 上拉到 VCC,避免上电期间误选通
SCK输入串行时钟,最高 104 MHz(DDR 型更高)源端串阻 22 ~ 33 Ω;包地;与 IO0~3 等长
SI (IO0)输入/输出标准模式下主发从收;Quad 下为 DQ0串阻靠近主控
SO (IO1)输出/输入标准模式下从发主收;Quad 下为 DQ1串阻靠近器件(回读方向)
WP# (IO2)输入/输出写保护,低有效;Quad 下为 DQ2建议 4.7 ~ 10 kΩ 上拉或 GPIO 控制;Quad 时接主控
HOLD# / RESET# (IO3)输入/输出保持或复位;Quad 下为 DQ3同 IO2;若为 RESET#,需保证上电期间为高
VCC电源2.7 ~ 3.6 V(3.3 V 型)或 1.7 ~ 1.95 V(1.8 V 型)0.1 µF 紧靠引脚 + 4.7 ~ 10 µF bulk;禁止串磁珠
GND地回路完整地平面,多打过孔;WSON 底部焊盘按手册处理

1.3 关键电气参数

参数典型值说明
供电电压 VCC3.3 V 型:2.70 ~ 3.60 V
1.8 V 型:1.70 ~ 1.95 V
同一板上不可混接,需确认主控 IO 电平
接口时钟最高 104 MHz(常见)
部分型号 133 MHz;DDR 型更高
见 4.3,实际吞吐受 NAND 编程时间限制
页大小2048 B(+ spare 64 / 128 B)部分 1 Gb 以下型号为 1024 B
块大小64 页 = 128 KB(+ spare 4 / 8 KB)擦除最小单位
页读到 Cache tRD25 ~ 100 µs阵列 → Cache 寄存器
页编程 tPROG200 µs ~ 1.5 ms与 P/E 次数、温度相关
块擦除 tBERS2 ~ 10 ms典型 3 ~ 4 ms
复位恢复 tRST最大 5 ~ 10 ms(部分更长)Reset 0xFF 后必须等待
读电流15 ~ 30 mA连续读
编程 / 擦除电流20 ~ 40 mA电源需按 50 mA 设计余量
待机电流10 ~ 50 µACS# 拉高,无操作
深睡眠电流1 ~ 20 µA(视型号)需 datasheet 确认是否支持 0xB9
ECC 能力1 bit / 512 B(常见)
部分型号 4 ~ 8 bit / 512 B
必须检查 ECC 状态位
擦写耐久性SLC 5 ~ 10 万次需磨损均衡
数据保持10 年(@ < 10% P/E 次数,常温)随擦写次数与温度下降
ESDHBM ±2 kV(部分 ±4 kV);CDM ±500 ~ 1 kV见第 9 章
工作温度工业级 −40 ~ +85 °C;部分 −40 ~ +105 °C高温下数据保持显著下降

1.4 与 SPI NOR 的核心差异

SPI NAND 与 SPI NOR 的 8 脚封装高度兼容,但两者是完全不同的器件。以下差异决定了整个软件栈的形态。

差异点SPI NORSPI NAND影响
读方式发送地址后直接输出数据两段式:先 0x13 整页读入内部 Cache,再用 0x03/0x0B 从 Cache 读NAND 不能随机读任意字节,随机访问开销大
XIP支持,CPU 可直接取指不支持,Cache 只有一页大小,无法映射整个地址空间代码必须搬到 RAM 运行
擦除粒度扇区 4 KB块 128 KB改 1 字节也要搬整块,需要 FTL 或日志结构文件系统
编程粒度可按字节编程(1 → 0)只能按页编程(2048 B)不足一页需填充 0xFF
写前擦除需要,但粒度小需要,且粒度大写入放大明显
坏块出厂坏块 + 使用中坏块必须建坏块表(BBT)与替换映射
ECC不需要必须有,多数内置每次读都要检查 ECC 状态位
spare 区每页 64 / 128 B存 ECC 校验码、坏块标记、文件系统元数据
状态轮询0x05 读状态寄存器0x0F + 地址 0xC0(GET FEATURE)NOR 驱动直接复用会一直读到错误状态
写保护状态寄存器 BP 位SET FEATURE 0xA0(BP0~BP3 / TB / WP#)寄存器访问方式不同
OTP安全寄存器OTP 区,由 0xB0 控制用于存放唯一 ID、校准数据
掉电后果丢失当前页数据可能造成坏块,甚至破坏相邻页掉电保护要求更高
最常见的迁移错误
  • 0x05 轮询 SPI NAND 的 busy → 读到的是无意义数据,驱动卡死或误判。
  • 0x03 当作"从阵列读"使用 → 实际读到的是上一次 Cache 里的内容,不是目标页。
  • 按 4 KB 扇区擦除 → NAND 最小擦除单位是 128 KB 块,命令会失败或擦掉不该擦的数据。
  • 忽略 ECC 状态位 → 读到已被纠正/无法纠正的数据,长时间运行后数据静默损坏。

2 · 存储结构与访问模型

理解"阵列 → Cache → 总线"这条数据通路,是写对 SPI NAND 驱动的前提。

2.1 页 / 块 / plane / die 结构

SPI NAND 存储阵列层次结构 左图展示 Device、Die、Plane、Block 的嵌套层次,右图展示块与页以及数据区与 spare 区的划分。 存储阵列层次:Device / Die / Plane / Block / Page Device / Target Die (LUN) Plane 0 Blk 0 · 64 Pg Blk 1 · 64 Pg Blk 2 · 64 Pg Blk 1023 · 64 Pg Plane 1 Blk 0 · 64 Pg Blk 1 · 64 Pg Blk 2 · 64 Pg Blk 1023 · 64 Pg OTP 区:独立于主阵列,一次性可编程 块 / 页 / spare 结构 Block = 64 × Page Page 0 · 2048 B + 64 B Page 1 · 2048 B + 64 B Page 63 · 2048 B + 64 B 页结构(Page) Data 2048 B Spare 用户数据 64 B spare:坏块标记 + ECC 校验 + 元数据 擦除以块为单位,写前必擦;不可字节编程 不能 XIP:必须先整页载入 Cache
图 2-1 · 存储阵列层次(左)与块 / 页 / spare 结构(右)。块数、plane 数、die 数随容量变化,以 datasheet 为准。

层次概念

  • Page(页):编程与读出的最小单位,2048 B 数据区 + 64 B(部分型号 128 B)spare 区。
  • Block(块):擦除的最小单位,64 页 = 128 KB 数据区 + 4 KB spare。擦除时间 2 ~ 10 ms。
  • Plane:若干块组成一个 plane,不同 plane 可并行操作(部分型号支持 multi-plane program / erase)。
  • Die / LUN:一个独立的操作单元,有自己的状态寄存器;多 die 器件通过片内地址区分。
  • Target / Device:一个 CS# 下的完整器件,可能包含 1 ~ 4 个 die。
  • OTP 区:独立于主阵列的一次性可编程区域,常用于存放设备序列号、校准参数、密钥。通过 SET FEATURE 0xB0 进入与加锁,加锁后不可逆

2.2 spare 区布局

spare 区(部分文档称 OOB / redundant area)由三部分占用,布局由厂商与软件栈共同决定:

偏移(典型)内容说明
Byte 0坏块标记出厂坏块由厂商在非 0xFF 处标记(多为 0x00);软件标记时同样写非 0xFF
中间若干字节ECC 校验码内置 ECC 型号由器件自动写入与校验,软件不可覆盖
其余文件系统元数据littlefs/FAT 的 tag、CRC、版本号、块序列号
注意

使用内置 ECC 时,spare 区中 ECC 占用的字节对软件是只读/自动维护的。Program Load 阶段如果往这些字节写入数据,可能被器件覆盖或导致 ECC 校验失败。spare 可用字节数请以 datasheet 的 "Spare Area Mapping" 为准。

2.3 Cache 读模型:为什么不能 XIP

SPI NAND 内部只有一个 Cache 寄存器(页缓冲),大小等于页大小(2048 B)。读操作必须分两步:

  1. Page Read to Cache(0x13):器件把目标页从 NAND 阵列整体搬进 Cache,耗时 tRD = 25 ~ 100 µs。期间 OIP = 1。
  2. Read from Cache(0x03 / 0x0B / 0x3B / 0x6B):从 Cache 中按列地址读出,可以任意长度、任意起始偏移、可分多次读。
SPI NAND 页读两段式 Cache 读模型 数据从 NAND 阵列经 Page Read 命令进入 Cache 寄存器,再由读 Cache 命令按列地址输出到主控。 页读两段式:Page Read to Cache → Read from Cache NAND 存储阵列 Block / Page Page Read 0x13 · tRD 25~100 µs Cache 寄存器 2048 B (= 页大小) Read from Cache 0x03 / 0x0B / 0x3B / 0x6B 阶段 1:阵列 → Cache 阶段 2:Cache → MCU(可按字节读) 0x13 + 地址 tRD 25~100 µs(阵列→Cache) 0x0B + A + dummy 数据输出 2048 B(×1/×2/×4) 两段之间 CS# 必须保持有效;部分型号要求第 1 段结束后拉高 CS#
图 2-2 · 页读两段式流程。每次换页都必须重新执行 0x13,这是 SPI NAND 随机读性能远低于 NOR 的根本原因。
为什么不能 XIP

XIP 要求 CPU 在任意时刻、任意地址都能在几十纳秒内取到指令。SPI NAND 的 Cache 只有 一页,切换地址(跨页)就要重新执行 0x13 并等待 25 ~ 100 µs —— 相当于每次跨页取指停顿上百微秒,完全不可接受。因此:

  • 代码存储请用 SPI NOR;
  • SPI NAND 只用于数据、日志、文件系统、OTA 镜像;
  • 若必须从 NAND 启动,需 BootROM 把镜像整体搬到 RAM 再跳转。
连续读(Continuous Read)

部分型号支持 Read from Cache 的连续读模式:读满一页后器件自动启动下一页的 Page Read 并继续输出,无需主控重发 0x13。此特性大幅改善顺序读吞吐,但各厂实现与使能方式不同,且跨块边界时行为需确认,使用前务必查 datasheet。

3 · ECC 与坏块管理

这是 SPI NAND 与 NOR 在软件层面最大的工作量所在。硬件工程师虽不写 FTL,但必须理解其需求,才能在原理图与电源设计上留足余量。

3.1 内置 ECC 与外置 ECC

方案实现优点缺点适用
内置 ECC(主流)器件内部硬件校验,spare 区自动写校验码主控零负担,兼容性好纠正能力固定(多为 1 bit / 512 B),状态位位置各厂不同MCU 资源有限的绝大多数设计
外置 / 软件 ECC主控计算 Hamming / BCH,写进 spare纠正能力可选(4 ~ 24 bit)占用 Flash 带宽与 CPU,spare 布局需自行管理无内置 ECC 的老型号、高可靠性需求
器件 ECC + 软件 CRC器件管位翻转,软件管逻辑错误/掉电半写覆盖掉电、半页写等器件 ECC 管不到的场景少量开销推荐
ECC 使能与状态检查
  • 多数内置 ECC 型号出厂即启用;部分型号需要软件通过 SET FEATURE 0xB0 置位 ECC_EN 后才生效。上电初始化时显式配置一次最稳妥。
  • 典型纠正能力 1 bit / 512 B;部分新型号支持 4 ~ 8 bit / 512 B。
  • 每次读操作之后必须检查 ECC 状态位。若出现"已纠正"提示,说明该块正在退化,应记录并在空闲时把数据搬走到好块;若出现不可纠正错误,该页数据已丢失,须立即标记坏块并从备份恢复。
  • 不要因为"ECC 帮我纠了"就忽略状态位 —— 等到不可纠正时数据已经没了。

3.2 坏块标记与坏块表(BBT)

SPI NAND 出厂时即存在坏块(厂商允许一定比例),使用过程中还会产生新坏块。坏块不可修复,只能标记并替换。

  • 标记位置:厂商在每个坏块的第 1 页和第 2 页的 spare 区首字节写入非 0xFF 值(多为 0x00)。双页冗余是为了防止第一页本身损坏。
  • 识别方法:读该字节,非 0xFF 即为坏块。注意必须在 ECC 禁用或忽略 ECC 状态的前提下读原始值,否则可能被 ECC 纠正逻辑干扰。
  • 建表时机:上电时扫描全盘建立 BBT。1 Gb 器件有 1024 个块,扫描耗时约 1024 × (tRD + 读 spare) ≈ 数十毫秒到数百毫秒。对启动时间敏感的系统,可把 BBT 固化到指定块,上电直接读取,只在校验失败时才全盘重扫。
  • 运行期新增:出现 P_FAIL、E_FAIL 或 ECC 不可纠正错误时,立即把该块标记(写 spare 首字节非 0xFF,需要时先擦除)并加入 BBT,然后从备用块池取一块做替换映射。
SPI NAND 坏块管理流程 上电后复位、读 ID、逐块读 spare 首字节判断是否坏块,好块进入空闲池,坏块记入坏块表。 坏块管理:上电扫描与运行期替换 ① 上电复位(0xFF) 等待 tRST 后再发命令 ② 读 JEDEC ID(0x9F) 核对厂商 ID 与容量 ③ 遍历全部块 读第 1 页 spare 首字节 ④ spare 首字节是否为 0xFF? 坏块 → 记入 BBT 不参与分配与映射 ⑤ 好块 → 纳入空闲块池 运行中:P_FAIL / E_FAIL / ECC 不可纠 → 立即标记坏块并从备用块池替换
图 3-1 · 坏块扫描与替换流程。全盘扫描较慢时可把 BBT 固化到固定块,上电校验后直接加载。

3.3 磨损均衡与垃圾回收

  • 磨损均衡(Wear Leveling):把擦写次数摊到所有块上,避免日志区等热点块提前失效。SLC 典型 5 ~ 10 万次 P/E,若无均衡,反复写同一块可在数天内写穿。
  • 垃圾回收(GC):日志型文件系统写满后,需要把某块中的有效页搬到新块,再擦除旧块。GC 期间写入延迟会突然增大,实时性要求高的系统要预留时间预算。
  • 预留空间(Over-Provisioning):建议保留 5% ~ 10% 的块作为备用池,用于替换坏块与 GC 周转。容量规划时不能按满容量设计。
  • 文件系统选型:优先 littlefs(掉电安全、内置磨损均衡、专为 NOR/NAND 设计),其次是 FATFS + 自有 FTL,或 SPIFFS。裸擦写管理容易在掉电时损坏元数据。

4 · 接口与工作模式

SPI NAND 沿用标准 SPI 帧格式,但命令集与 NOR 不同。Quad 模式是性能关键,也是最容易踩坑的地方。

4.1 Standard / Dual / Quad / DTR

模式数据线命令/地址时钟沿说明
Standard SPIIO0(出)/ IO1(入)单线单沿(SDR)默认上电状态,兼容性最好
Dual SPIIO0 + IO1单线单沿读吞吐 ×2,用 0x3B
Quad SPIIO0 ~ IO3单线(命令/地址)单沿读吞吐 ×4,用 0x6B;需占用 IO2/IO3
QPI(部分型号)IO0 ~ IO3四线单沿命令也走 4 线,进一步省周期,型号支持差异大
DTR / DDRIO0 ~ IO3单线双沿相同时钟频率下再翻倍,时序裕量小,Layout 要求高

4.2 读 Cache 命令帧结构

Read from Cache 各模式帧结构对比 五种读 Cache 命令的命令段、列地址段、空周期段与数据段占用的时钟周期与总线宽度对比。 Read from Cache 各模式帧结构(含列地址与空周期) 0x03 Read Cache CMD 16 bit 列地址 DATA ×1 无空周期,速率最低 0x0B Fast Read CMD 16 bit 列地址 dummy DATA ×1 8 个空周期 0x3B Dual Out CMD 16 bit 列地址 dummy DATA ×2 8 空周期,数据 2 线 0x6B Quad Out CMD 16 bit 列地址 dummy DATA ×4 8 空周期,数据 4 线 0x6B Quad DTR CMD 16 bit 列地址 dummy DATA ×4(DDR) 时钟双边沿采样 命令 CMD 列地址(选页内偏移) 空周期 Dummy 数据 DATA
图 4-1 · Read from Cache 帧结构。列地址为 16 bit(0 ~ 2111,含 spare 区);空周期数各型号不同,以 datasheet 为准。

4.3 速率档位与等效吞吐

SPI NAND 接口理论吞吐与实际有效写吞吐对比 柱状图对比 Standard、Dual、Quad、Quad DTR 四种模式的接口理论吞吐,以及受页编程时间限制的实际持续写吞吐。 接口理论吞吐与实际有效写吞吐对比 Standard ×1 · 104 MHz 13.0 MB/s Dual ×2 · 104 MHz 26.0 MB/s Quad ×4 · 104 MHz 52.0 MB/s Quad DTR · 133 MHz 133 MB/s 理论 实际持续写吞吐 ≈2 MB/s(受页编程时间限制) 0 50 MB/s 100 MB/s
图 4-2 · 接口速率与实际吞吐。读吞吐取决于接口宽度,写吞吐被页编程时间(200 µs ~ 1.5 ms)锁死,提高时钟几乎没有帮助。

吞吐计算示例

读 2048 B 一页的总耗时(Quad ×4,104 MHz,忽略开销):

  阶段 1  Page Read to Cache        tRD              =  60 µs   (典型)
  阶段 2  0x6B 帧:
          命令 8 clk               8 / 104 MHz       =   0.08 µs
          列地址 16 clk                               =   0.15 µs
          空周期 8 clk                                =   0.08 µs
          数据 2048 B = 4096 clk(×4 线,每 clk 4 bit)=  39.4 µs
        小计                                          ≈  39.7 µs

  单页合计 ≈ 99.7 µs  →  2048 B / 99.7 µs ≈ 20.5 MB/s
  (连续读模式可省去重复 tRD,接近接口理论值 52 MB/s)

写一页的总耗时(页编程 tPROG = 1 ms):

  Program Load 0x32(Quad)         2048 B             ≈  39.4 µs
  Program Execute 0x10              tPROG              = 1000 µs
  轮询状态                                             ≈   5 µs
  合计 ≈ 1044 µs  →  2048 B / 1044 µs ≈ 1.96 MB/s

结论:把时钟从 104 MHz 提到 133 MHz,写吞吐只从 1.96 提到 1.99 MB/s。
      想提高写性能,只能靠 multi-plane / cache program,或换器件。

4.4 模式切换流程

SPI NAND 上电后默认处于 Standard SPI。切换到 Quad 需要两个条件同时满足:

  1. 软件置位 QE(Quad Enable):通过 SET FEATURE(0x1F)写入配置寄存器(通常地址 0xB0)的 QE 位。部分型号出厂已置位,但建议初始化时显式写一次,并回读确认。
  2. 硬件把 IO2 / IO3 接到主控:若 IO2 / IO3 被接到固定电平或用作 WP# / HOLD#,Quad 模式下数据会出错。
// 上电初始化参考流程(伪代码,寄存器地址以 datasheet 为准)
spi_nand_reset();                    // 0xFF,等待 tRST(最大 5~10 ms)
delay_ms(10);

jedec_id = cmd_read_id(0x9F);        // 核对厂商 / 容量,型号不符直接报错
if (!id_match(jedec_id)) return ERR_DEVICE;

set_feature(0xB0, QE | ECC_EN);      // 使能 Quad 与 ECC
if (get_feature(0xB0) & QE != QE) return ERR_QE_FAIL;

set_feature(0xA0, BP_ALL_CLEAR);     // 解除块保护,否则编程会被拒绝
scan_bad_blocks();                   // 建立 BBT(见第 3 章)

// 轮询 busy 必须用 0x0F + 0xC0,不能用 NOR 的 0x05
uint8_t st = get_feature(0xC0);
while (st & OIP) { st = get_feature(0xC0); }
if (st & (P_FAIL | E_FAIL)) { mark_bad_block(); }
状态轮询:不能用 0x05

SPI NAND 没有 NOR 那种 0x05 读状态寄存器的机制。必须用 GET FEATURE(0x0F)+ 地址 0xC0 读取状态。常见位定义:

名称含义
bit 0OIPOperation In Progress,1 = 器件忙
bit 1P_FAIL编程失败,1 = 本次 Program Execute 失败
bit 2E_FAIL擦除失败,1 = 本次 Block Erase 失败
bit 4 ~ 5ECC 状态00 = 无错误;01/10 = 已纠正;11 = 不可纠正

注意:WEL 位的位置、ECC 状态位的具体编码与所在地址各厂商不同(部分型号 ECC 状态在 0xC0 的 bit 4~5,部分另有专用地址)。以上为常见定义,必须以目标型号 datasheet 的 Status Register 表为准

📥 芯参谋客户端下载