1. NOR Flash基础认知:什么是NOR Flash、NOR与NAND的区别、NOR Flash的存储单元结构(浮栅晶体管)、NOR Flash的接口类型(SPI/Parallel)
大家好,我是你们的嵌入式驱动讲师。今天咱们正式开讲NOR Flash驱动开发的第一课。
说实话,我刚开始接触嵌入式存储时,也分不清NOR和NAND到底有啥区别。直到有一次项目里选型选错了,板子调了三天死活起不来……嗯,从那以后,我对NOR Flash的理解就深刻多了。
这一节,咱们先把基础打牢。你想想看,驱动开发说白了就是跟硬件打交道。不懂硬件原理,写出来的代码就是空中楼阁。所以,咱们先从NOR Flash是什么开始聊。
1.1 什么是NOR Flash
NOR Flash,全称是“NOR型闪存”。它是一种非易失性存储器——断电后数据不丢失。这一点跟EEPROM、NAND Flash一样。
但NOR Flash有个独特的地方:它支持随机读取。什么意思呢?就是你可以像读内存一样,直接访问任意地址的数据。不需要先读一整块,再从中提取。
我个人习惯把NOR Flash比作“可以断电保存的SRAM”。虽然速度没SRAM快,但胜在掉电不丢数据,而且读取延迟很低。
核心特点:
- 支持XIP(eXecute In Place,原地执行)——代码可以直接在Flash上运行,不用拷贝到RAM
- 读取速度快,适合存代码
- 写入和擦除速度慢,不适合频繁写数据
- 容量通常较小(几MB到几百MB)
我在项目中遇到过最典型的场景:用NOR Flash存Bootloader。上电后CPU直接映射到NOR Flash的地址空间,第一条指令就从这里取。省掉了拷贝到RAM的步骤,启动速度飞快。
1.2 NOR与NAND的区别
很多新手会问:既然都是Flash,为啥还要分NOR和NAND?
说白了,架构不同,决定了它们的使用场景完全不同。我整理了一张对比表,你看完就明白了。
| 对比项 | NOR Flash | NAND Flash |
|---|---|---|
| 读取方式 | 随机读取,类似内存 | 页读取,必须整页读 |
| 写入方式 | 按字节/字写入 | 按页写入 |
| 擦除方式 | 按扇区擦除(通常64KB) | 按块擦除(通常128KB+) |
| 读取速度 | 快(~100ns) | 较慢(~25μs首次,后续快) |
| 写入速度 | 慢(~10μs/字节) | 快(~200μs/页) |
| 擦除速度 | 慢(~1s/扇区) | 快(~2ms/块) |
| 坏块管理 | 无坏块(出厂即好) | 有坏块,需要管理 |
| 典型容量 | 1MB ~ 512MB | 128MB ~ 1TB+ |
| 典型用途 | 存代码、Bootloader | 存文件系统、大容量数据 |
看到这里你可能会问:为什么NOR没有坏块?
嗯,这个问题我当年也困惑过。其实是因为NOR Flash的工艺更成熟,每个存储单元都经过严格测试。而NAND为了追求高密度,允许存在少量坏块,靠软件来管理。说白了,NOR是“精工细作”,NAND是“量大管饱”。
避坑指南:
我曾经在一个项目里用NOR Flash存日志文件,结果发现擦除一次要1秒多,频繁写日志直接把系统卡死了。后来才意识到:NOR适合读多写少的场景,频繁写数据还是得上NAND或者EEPROM。
1.3 NOR Flash的存储单元结构(浮栅晶体管)
咱们深入一点,看看NOR Flash的存储单元到底长什么样。
NOR Flash的每个存储单元是一个浮栅晶体管(Floating Gate Transistor)。跟普通MOS管比,它多了一层“浮栅”——夹在控制栅和沟道之间,被绝缘层包裹着。
为什么会这样设计?
你想想看,普通MOS管断电后,栅极上的电荷就没了。但浮栅晶体管不一样:浮栅被绝缘层包围,电荷可以“困”在里面几十年。这就是非易失性的秘密。
存储原理其实很简单:
- 写入(编程):在控制栅加高电压,通过隧穿效应把电子注入浮栅。浮栅带负电,晶体管的阈值电压升高。
- 擦除:在衬底加高电压,把电子从浮栅拉出来。阈值电压恢复。
- 读取:在控制栅加一个中间电压。如果浮栅有电子(阈值高),晶体管不导通,读出“0”;如果浮栅没电子(阈值低),晶体管导通,读出“1”。
这里有个细节:NOR Flash的擦除状态是“1”,编程状态是“0”。跟咱们直觉相反,对吧?我第一次接触时也觉得很别扭。但这就是硬件特性,写驱动时一定要记住。
关键记忆点:
- 擦除 → 全变成1
- 编程 → 把1变成0(只能1→0,不能0→1)
- 要改0为1?必须先擦除整个扇区
下面这张图是我画的NOR Flash存储单元结构示意,帮你理解浮栅晶体管的工作原理。
1.4 NOR Flash的接口类型(SPI / Parallel)
接口这块,是咱们驱动开发最直接打交道的地方。NOR Flash主要有两种接口:SPI(串行)和Parallel(并行)。
1.4.1 SPI NOR Flash
SPI NOR Flash是目前最主流的。引脚少(通常6~8个),封装小,适合嵌入式设备。
常见的SPI接口引脚:
- CS#:片选,低电平有效
- SCLK:时钟
- SI (MOSI):主机输出,从机输入
- SO (MISO):主机输入,从机输出
- WP#:写保护(可选)
- HOLD#:保持(可选)
现在很多SPI NOR还支持Quad SPI(四线)模式,用4根数据线同时传输,速度能跑到几十MB/s。我常用的W25Q64JV就是这种。
个人经验:
我建议新手先从SPI NOR入手。引脚少,逻辑分析仪一夹就能看波形,调试起来特别方便。Parallel NOR的引脚太多,示波器探头都不够用。
1.4.2 Parallel NOR Flash
Parallel NOR Flash是“老前辈”了。它用并行数据总线(8位或16位)加上地址总线,直接映射到CPU的地址空间。
典型引脚:
- D[7:0] 或 D[15:0]:数据总线
- A[n:0]:地址总线
- CE#:片选
- OE#:输出使能
- WE#:写使能
- RY/BY#:就绪/忙信号
Parallel NOR最大的优势是读取速度极快,而且天然支持XIP。但缺点也很明显:引脚多、封装大、成本高。
我记得早期做ARM9开发时,用的就是Parallel NOR Flash。那时候SPI NOR还没普及,Bootloader和操作系统都直接放在Parallel NOR里跑。现在嘛,除了少数对启动速度要求极高的场景,基本都被SPI NOR取代了。
| 对比项 | SPI NOR | Parallel NOR |
|---|---|---|
| 引脚数 | 6~8个 | 30~50个 |
| 读取速度 | 中(~50MB/s Quad SPI) | 快(~100MB/s) |
| XIP支持 | 支持(但需配置) | 天然支持 |
| 封装大小 | 小(SOP-8, WSON-8) | 大(TSOP-48, BGA) |
| 成本 | 低 | 高 |
| 典型型号 | W25Q64, MX25L256 | JS28F128, S29GL256 |
注意事项:
选型时别只看接口。SPI NOR虽然引脚少,但有些MCU的SPI控制器不支持Quad模式,速度上不去。Parallel NOR虽然快,但PCB布线麻烦,多层板成本高。我建议根据实际项目需求来权衡。
好了,这一节的内容就到这里。NOR Flash的基础认知咱们已经聊透了:它是什么、跟NAND的区别、存储单元怎么工作、接口有哪些类型。这些知识是后续驱动开发的地基,一定要理解透彻。
下一节,咱们会深入SPI NOR Flash的指令集和时序,开始真正动手写驱动。到时候见。