2、存储设备基础:Flash 存储器原理、SPI Flash 接口、QSPI 与 OSPI 介绍、NAND 与 NOR Flash 对比
做嵌入式系统开发,尤其是跑 RT-Thread 这类 RTOS 时,文件系统几乎是绕不开的。而文件系统最终要落在存储介质上。在嵌入式世界里,Flash 存储器是绝对的主角。
今天我们就来聊聊 Flash 的那些事儿。我会从原理讲到接口,再聊聊 NAND 和 NOR 怎么选。嗯,这些都是我这些年做项目时反复踩过的坑,希望能帮你省点时间。
2.1 Flash 存储器的工作原理
Flash 存储器,说白了就是一种非易失性存储器。掉电不丢数据,这是它最大的价值。
它的基本存储单元是浮栅晶体管。你可以想象成一个带「小仓库」的开关。往小仓库里注入电子,就代表存了「0」;把电子放出来,就代表存了「1」。这个「小仓库」就是浮栅层,被绝缘体包裹着,电子进去就出不来了——除非你施加高压让它出来。
这里有个关键点:Flash 写入前必须先擦除。为什么?因为擦除操作是把所有位恢复成「1」(或「0」,取决于具体型号),而写入操作只能把「1」变成「0」。你不能直接把「0」改写成「1」。所以 Flash 的写入流程是:擦除 → 写入。
核心概念:Flash 的最小擦除单位是「扇区」(Sector),最小读写单位是「页」(Page)。扇区通常比页大得多。比如常见的 SPI Flash,扇区大小是 4KB,页大小是 256 字节。
我在项目中遇到过一个问题:有人直接在 Flash 上做数据覆盖,结果发现数据写不进去。排查了半天,才发现是忘了先擦除。嗯,这个坑我踩过,希望你记住。
2.2 SPI Flash 接口
SPI Flash 是嵌入式系统里最常见的 Flash 类型。它通过 SPI(串行外设接口)与 MCU 通信。SPI 接口只需要 4 根线:
- CS(片选):选中设备
- SCLK(时钟):同步时钟
- MOSI(主出从入):MCU 发数据给 Flash
- MISO(主入从出):Flash 发数据给 MCU
SPI Flash 的优点是引脚少、体积小、成本低。缺点是速度相对较慢。不过对于大多数 IoT 设备来说,SPI Flash 的速度已经够用了。
我个人的习惯是:如果项目只需要存配置参数、日志文件,或者跑个轻量级文件系统(比如 LittleFS),SPI Flash 是首选。它简单、稳定、便宜。
小技巧:SPI Flash 的时钟频率通常可以跑到 50MHz 甚至更高。但要注意,MCU 的 SPI 外设不一定能支持那么高。实际项目中,我一般先看 MCU 的 SPI 最高频率,再选 Flash 型号。别买了个高速 Flash,结果 MCU 跑不动,那就尴尬了。
2.3 QSPI 与 OSPI 介绍
SPI Flash 虽然好用,但速度是个瓶颈。于是就有了 QSPI 和 OSPI。
QSPI(四线 SPI)
QSPI 在标准 SPI 的基础上,把 MOSI 和 MISO 扩展成了四根数据线。也就是说,它一次可以传输 4 位数据。标准 SPI 一次只能传 1 位。所以理论上,QSPI 的速度是标准 SPI 的 4 倍。
QSPI 的引脚定义通常是:
- CS(片选)
- SCLK(时钟)
- IO0 ~ IO3(四根数据线)
QSPI 有两种模式:单线模式和四线模式。命令阶段通常用单线模式,数据阶段切换到四线模式。这样既兼容了标准 SPI,又提升了速度。
OSPI(八线 SPI)
OSPI 是 QSPI 的升级版,数据线扩展到了 8 根。速度更快,但引脚也更多。OSPI 通常用于需要高速数据吞吐的场景,比如跑 GUI 界面、存音频文件等。
我记得有一次做智能家居网关,需要同时存日志、配置、固件升级包。用 SPI Flash 速度跟不上,换成 QSPI 后,读写速度直接翻了几倍。嗯,选对接口真的很重要。
注意:QSPI 和 OSPI 虽然快,但需要 MCU 有对应的硬件外设支持。不是所有 MCU 都带 QSPI 控制器。如果 MCU 不支持,你只能用 GPIO 模拟,那速度反而更慢。所以选型时要先确认 MCU 的硬件能力。
2.4 NAND 与 NOR Flash 对比
NAND 和 NOR 是两种完全不同的 Flash 架构。它们各有优缺点,适用场景也不同。
| 特性 | NOR Flash | NAND Flash |
|---|---|---|
| 读取速度 | 快(支持随机读取) | 慢(需要按页读取) |
| 写入速度 | 慢 | 快 |
| 擦除速度 | 慢 | 快 |
| 密度 | 低(通常 1MB ~ 64MB) | 高(通常 128MB ~ 1TB) |
| 成本 | 高 | 低 |
| 可靠性 | 高(坏块少) | 低(需要坏块管理) |
| 接口 | SPI / QSPI / 并行 | 并行 / SPI(少见) |
| 典型应用 | 代码存储、配置参数 | 大容量数据存储、文件系统 |
你可能会问:为什么 NOR Flash 读取快,写入却慢?
原因在于 NOR Flash 支持随机读取——你可以像读 RAM 一样直接读任意地址。但写入时,它需要先擦除整个扇区,再逐字节写入。而 NAND Flash 是按页写入的,一次可以写 2KB 甚至更多,所以写入速度快得多。
我个人习惯是:代码存 NOR,数据存 NAND。为什么?因为 NOR Flash 支持 XIP(片上执行),MCU 可以直接从 NOR Flash 里执行代码,不需要先拷贝到 RAM。而 NAND Flash 因为读取速度慢,不适合直接执行代码,但存大文件很合适。
避坑指南:我曾经在一个项目里用 NAND Flash 存代码,结果发现启动速度慢得离谱。后来换成 NOR Flash,启动时间从 5 秒降到了 0.5 秒。嗯,选错存储介质,后果很严重。
2.5 小结
好了,这一章的内容就这些。我们来快速回顾一下:
- Flash 原理:浮栅晶体管,擦除后才能写入
- SPI Flash:4 线接口,简单稳定,适合小数据量
- QSPI / OSPI:多线接口,速度快,适合大数据量
- NAND vs NOR:NOR 快读慢写,适合代码;NAND 快写慢读,适合数据
下一章我们会聊到 RT-Thread 的文件系统框架。到时候我会告诉你,怎么把这些 Flash 知识用到实际项目里。敬请期待。
个人建议:如果你刚开始接触 Flash,可以先从 SPI NOR Flash 入手。它简单、文档多、调试方便。等熟悉了再挑战 NAND 和 QSPI。别一上来就搞复杂的,容易劝退。