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存储单元结构示意,帮你理解浮栅晶体管的工作原理。

NOR Flash存储单元结构(浮栅晶体管) 控制栅(Control Gate) 绝缘层(SiO₂) 浮栅(Floating Gate) 绝缘层(SiO₂) 源极 漏极 沟道 P型衬底(Substrate) 字线(Word Line) 位线(Bit Line) 源线(Source Line) 工作原理: 编程:控制栅加高电压 → 电子注入浮栅 → 阈值升高 → 读出"0" 擦除:衬底加高电压 → 电子拉出浮栅 → 阈值降低 → 读出"1" 读取:控制栅加中间电压 → 检测沟道是否导通 → 判断0/1

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的指令集和时序,开始真正动手写驱动。到时候见。


专注资料整理