SPI Flash驱动开发:扇区擦除与DMA写入优化 - 第1节
1.1 SPI Flash 基本概念
SPI Flash 是一种基于 串行外设接口(Serial Peripheral Interface) 的 NOR 型非易失性存储器。它通过 SPI 总线与主控器(MCU/MPU)通信,仅需 4 根信号线(SCK、MOSI、MISO、CS#)即可完成数据读写,相比并行 NOR Flash 大幅减少了 PCB 布局面积和引脚数量。
SPI Flash 在嵌入式系统中广泛用于存储固件、配置参数、日志数据和文件系统,典型容量范围为 1 Mbit 至 2 Gbit。其核心特性包括:
- 非易失性:断电后数据不丢失。
- 按扇区擦除:写入前必须先擦除,最小擦除单元通常为 4 KB。
- 支持 XIP(就地执行):代码可直接在 Flash 上运行,无需加载到 RAM。
- 低功耗:工作电流通常在 1~20 mA,待机电流可低至 1 μA。
💡 开发提示: 选择 SPI Flash 时需关注最大时钟频率(如 104 MHz)、支持的命令集(标准/双线/四线 SPI)以及擦除/编程时间参数,这些直接影响驱动性能和 DMA 传输设计。
1.2 存储单元结构
SPI Flash 的存储单元采用 浮栅晶体管(Floating Gate Transistor) 结构,通过控制栅极和浮栅之间的电荷存储来保持数据。写入时通过隧道效应注入电子,擦除时通过 Fowler-Nordheim 隧穿或热电子注入移除电子。
从逻辑层次看,SPI Flash 的存储组织分为以下层级:
| 层级 | 典型大小 | 说明 |
|---|---|---|
| 芯片(Chip) | 1 Mbit ~ 2 Gbit | 整个 Flash 器件 |
| 块(Block) | 64 KB | 擦除操作的基本单位之一 |
| 扇区(Sector) | 4 KB | 最小擦除单元,驱动开发核心关注点 |
| 页(Page) | 256 B | 编程(写入)的最小单位 |
| 字节(Byte) | 1 B | 读取的最小单位 |
🔑 关键概念: 扇区擦除是 SPI Flash 驱动中最耗时的操作之一(典型 4 KB 扇区擦除需 30~400 ms),而页编程通常只需 0.5~3 ms。因此,驱动优化策略往往围绕减少擦除次数、合并写入请求展开。
下图展示了 SPI Flash 的存储单元物理结构与逻辑层级映射关系:
1.3 NOR 与 NAND Flash 的区别
SPI Flash 绝大多数属于 NOR Flash 架构,与嵌入式系统中同样常见的 NAND Flash 在存储单元结构、接口方式、读写特性和可靠性方面存在显著差异。下表从驱动开发角度对比两者的关键区别:
| 对比维度 | NOR Flash | NAND Flash |
|---|---|---|
| 存储单元连接 | 每个单元并联在位线上 | 多个单元串联在位线上 |
| 读取速度 | 快(随机读取,支持 XIP) | 较慢(需页读取 + 缓存) |
| 写入速度 | 慢(页编程 0.5~3 ms) | 快(页编程 ~200 μs) |
| 擦除速度 | 慢(扇区擦除 30~400 ms) | 快(块擦除 ~2 ms) |
| 擦除单元 | 扇区(4 KB)或块(64 KB) | 块(128 KB ~ 512 KB) |
| 坏块管理 | 无需(出厂无坏块) | 需要(出厂可能有坏块) |
| 位翻转概率 | 极低 | 较高,需 ECC 纠错 |
| 典型用途 | 固件存储、XIP 代码执行 | 大容量数据存储、文件系统 |
| SPI 接口支持 | 广泛(SPI NOR Flash) | 较少(SPI NAND Flash 存在但非主流) |
⚠️ 驱动开发注意: 本课程聚焦 SPI NOR Flash。若后续项目涉及 SPI NAND Flash,需额外实现坏块管理表和 ECC 校验算法,驱动架构差异较大,不可直接复用。
下图从系统架构层面展示 NOR 与 NAND Flash 在嵌入式系统中的典型连接方式:
1.4 本章小结
- SPI Flash 是嵌入式系统中广泛使用的串行 NOR 型非易失存储器,具有引脚少、支持 XIP、低功耗等优点。
- 存储单元基于浮栅晶体管,逻辑层级为:芯片 → 块 → 扇区 → 页 → 字节,其中扇区(4 KB)是擦除最小单位,页(256 B)是编程最小单位。
- NOR Flash 与 NAND Flash 在读取速度、擦除单元、坏块管理和可靠性方面差异显著,SPI Flash 驱动开发主要面向 NOR 架构。
- 理解扇区擦除的耗时特性是后续 DMA 写入优化设计的基础。