spi, flash, 存储器,详细解释说明各项

你好!

今天,就让我们一同深入探索嵌入式系统的三个核心基石:SPIFlash存储器。这三者并非孤立的概念,而是紧密协作、相辅相成的。我会为你抽丝剥茧,从宏观到微观,从理论到实践,为你呈现一幅清晰的知识图谱。


第一章:存储器 (Memory) —— 数据的宏伟殿堂

在我们开始讨论任何具体的技术之前,必须先建立一个宏观的框架。存储器,就是这个框架的基石。

想象一座巨大的图书馆。这座图书馆就是计算机系统的存储体系。它的使命只有一个:存放信息。这些信息,在我们的数字世界里,就是二进制的“0”和“1”,它们既可以代表程序指令(告诉处理器该做什么),也可以代表数据(处理器要处理的对象)。

但正如图书馆有不同的区域——有供人随时翻阅的阅览室,有存放珍贵典籍的藏书阁,也有需要办理手续才能借阅的密集书库——计算机的存储器也因其特性和用途而划分为不同的种类。

我们通常从两个最重要的维度来对其进行分类:

1. 根据“易失性” (Volatility) 划分:

易失性存储器 (Volatile Memory): 就像你在草稿纸上做的计算,一旦断电,所有信息都会烟消云散。它的优点是读写速度极快

典型代表:RAM (Random Access Memory, 随机存取存储器)

SRAM (Static RAM): 静态随机存取存储器。它由无数个双稳态触发器构成。只要有电,数据就非常稳定地保持着,不需要刷新。它速度最快,但结构复杂,成本高,容量小。通常用作CPU的高速缓存 (Cache) 和微控制器 (MCU) 内部的少量内存。
DRAM (Dynamic RAM): 动态随机存取存储器。它利用微小电容的充电和放电来表示“1”和“0”。电容会漏电,所以需要定时“刷新”来维持数据。它的结构简单,成本低,容量可以做得很大。我们电脑和手机里的“内存条”就是DRAM。

非易失性存储器 (Non-Volatile Memory): 如同刻在石碑上的文字,即使断电,信息依然能长久保存。它的优点是数据可持久存储,但通常读写速度较慢,且有写入寿命限制。

典型代表:ROM (Read-Only Memory, 只读存储器)

Mask ROM: 出厂时就用光刻掩模技术写入数据,之后无法更改。成本最低,用于大规模量产且固件永不变更的场景。
PROM (Programmable ROM): 可编程只读存储器,允许用户一次性写入。
EPROM (Erasable PROM): 可擦除可编程只读存储器,用紫外线照射来擦除数据。
EEPROM (Electrically Erasable PROM): 电可擦除可编程只读存储器,可以用电信号擦除和写入,是现代非易失性存储器的雏形。
Flash Memory (闪存): 我们接下来要重点讲述的主角,它正是EEPROM的“超级进化版”,兼具了高密度、低成本和电可擦写的优点。

2. 根据“功能与位置”划分:

主存储器 (Primary Memory): 即内存,CPU能直接通过地址总线访问,速度快,通常是易失性的DRAM。
辅助存储器 (Secondary Memory): 即外存,如硬盘、SSD、U盘。CPU不能直接访问,需要通过I/O接口将数据读入主存后才能处理。通常是非易失性的。

小结: 存储器是一个庞大的家族。在嵌入式系统中,我们通常会有一块非易失性存储器 (Flash) 用来存放程序代码和重要配置,再配上一块易失性存储器 (SRAM/DRAM) 作为程序运行时的“工作区”和“草稿纸”。


第二章:Flash 存储器 —— 嵌入式系统的坚固基石

现在,我们聚焦于那座“图书馆”里最重要、最常用的“藏书阁”—— Flash Memory

从物理本质上讲,Flash的核心是一个叫做浮栅晶体管 (Floating-Gate Transistor) 的半导体器件。你可以把它想象成一个微观的“瓶中信”:

浮栅 (Floating Gate): 一个被绝缘氧化层完全包裹的导电层,像一个悬浮在空中的瓶子。
写入 (Programming): 通过施加高电压,利用量子隧穿效应,让电子穿过绝缘层,被“囚禁”在浮栅这个瓶子里。瓶子里有电子,代表’0’。
擦除 (Erasing): 施加反向高电压,将瓶子里的电子“抽”出来。瓶子里没有电子,代表’1’。
读取 (Reading): 通过检测浮栅上是否有电子,来判断存储的是’0’还是’1’。因为瓶子是绝缘的,所以即使断电,电子也跑不掉,这就实现了非易失性。

Flash有两个至关重要的工程特性,你必须牢记于心:

先擦后写,且以块(Block)为单位擦除,以页(Page)为单位写入。

你不能像修改SRAM那样,随意地将一个比特从’0’改回’1’。你只能将’1’改写为’0’。
要想把’0’变回’1’,唯一的办法是擦除。而擦除操作的最小单位是一个块 (Block),一个块通常包含很多个页 (Page)
写入操作的最小单位是一个页 (Page)
这个特性是Flash编程的灵魂! 想象一下,你要修改一本笔记本上的一句话。你不能直接擦掉一个词,而是必须撕掉这一整页(擦除块),然后重新抄写整页内容并做出修改(写入页)。这就是为什么对Flash进行更新操作通常需要一个“读-改-写”的过程:将整个块读到RAM中 -> 修改RAM中的数据 -> 擦除Flash中的原块 -> 将RAM中的新数据写回Flash。

有限的擦写寿命 (Limited Erase/Write Cycles)。

每次擦写,高电压都会对那层脆弱的绝缘层造成微小的、不可逆的损伤。日积月累,绝缘层最终会被击穿,导致数据无法可靠保存。
典型的Flash擦写寿命在1万到10万次之间。为了延长寿命,工程师们发明了磨损均衡 (Wear Leveling) 算法,确保对所有存储块的擦写次数尽可能均匀,避免“逮着一只羊使劲薅羊毛”。

根据内部结构的不同,Flash主要分为两大流派:

NOR Flash:

特点: 地址线和数据线独立,支持按字节的随机读取。读取速度快,堪比SRAM。但写入和擦除速度慢,成本高,密度低。
优势: 支持 XIP (Execute-In-Place, 片上执行)。CPU可以直接从NOR Flash中读取并执行指令,就像直接在内存中运行一样,无需先把代码复制到RAM。
应用: 主要用于存储启动代码 (Bootloader)、固件程序等需要快速启动和直接执行的场合。

NAND Flash:

特点: 地址和数据线复用,以页/块为单位进行读写。读取速度较慢,但写入和擦除速度快,成本低,密度极高
优势: 容量可以做得非常大,价格便宜。
应用: 主要用于大容量数据存储,如智能手机的存储、SSD固态硬盘、U盘、SD卡等。

特性 NOR Flash NAND Flash
接口 独立地址/数据总线(类SRAM) 复用I/O总线
读取 快速,按字节随机读取 较慢,按页读取
写入
擦除
容量密度
成本
XIP 支持 不支持
应用 代码存储、固件 数据存储、文件系统

第三章:SPI (Serial Peripheral Interface) —— 高效的信使

好了,我们有了MCU这个“大脑”,也有了Flash这个“藏书阁”。那么,大脑如何从藏书阁里获取信息呢?这就需要一位高效的“信使”——通信总线SPI 就是其中最常用、最经典的一位。

SPI,全称串行外设接口 (Serial Peripheral Interface),是一种高速、全双工、同步的通信总线。让我们来解读这几个关键词:

串行 (Serial): 数据是一位一位(1-bit by 1-bit)地在单根数据线上进行传输。就像一列士兵排着队通过一扇窄门。与之相对的是并行(Parallel),像一排士兵同时通过一排门,速度快但需要更多线缆。
同步 (Synchronous): 通信双方(主设备和从设备)共享一根时钟线。所有的数据传输都由这个时钟信号来协调步调。就像一个乐队的指挥,时钟的每一次“挥棒”(时钟边沿),都标志着一次数据的发送或接收。这保证了数据传输的精确可靠。
全双工 (Full-Duplex): 主设备向从设备发送数据的同时,从设备也可以向主设备发送数据。这是通过两根独立的单向数据线实现的。
主从结构 (Master-Slave): SPI总线上必须有一个主设备 (Master),通常是MCU或CPU。它可以连接一个或多个从设备 (Slave),如Flash芯片、传感器、屏幕等。主设备是通信的发起者和掌控者,它产生时钟信号,并决定与哪个从设备通信。

一个典型的SPI接口由四根线组成:

SCLK (Serial Clock): 串行时钟线。由Master产生,驱动整个通信过程。
MOSI (Master Out Slave In): 主出从入线。Master通过这条线向Slave发送数据。
MISO (Master In Slave Out): 主入从出线。Slave通过这条线向Master发送数据。
CS / SS (Chip Select / Slave Select): 片选线。由Master控制。当Master想和某个Slave通信时,就将对应于该Slave的CS线拉低(置为有效电平)。总线上可以有多个Slave,但同一时刻只有一个Slave的CS线被拉低,从而被“选中”。

一次典型的SPI通信流程(以读取Flash数据为例):

选定目标: Master将目标SPI Flash芯片的CS线拉低。
发出指令: Master通过MOSI线,在SCLK的驱动下,向Flash发送一个“读取数据”的命令字节。
指定地址: Master继续通过MOSI线,发送要读取数据的起始地址(通常是2或3个字节)。
接收数据: Flash接收到命令和地址后,开始通过MISO线,在SCLK的驱动下,将指定地址的数据一位一位地传回给Master。
结束通信: Master读取完所需数量的数据后,将CS线拉高,结束本次通信。该Flash芯片重新回到待命状态。


终章:三位一体,奏响嵌入式交响乐

现在,让我们将这三者串联成一幅完整的画卷:

场景:一个嵌入式设备上电启动。

设备上电,MCU (大脑) 开始运行。它首先会执行一段固化在内部ROM中的引导代码 (Bootloader)。
这段引导代码的首要任务,就是初始化与外部存储器 (Memory) 的通信接口。在这个场景里,这个接口就是 SPI
MCU作为 SPI Master,通过拉低片选(CS)线,选中了那块存储着主程序的 NOR Flash (一种非易失性存储器) 芯片。
MCU通过 SPI 总线的 MOSI 线,向 Flash 发送读取指令和程序代码的起始地址。
Flash 芯片作为 SPI Slave,在 SCLK 的同步下,将程序指令通过 MISO 线源源不断地送回给MCU。
MCU将从Flash中读取到的代码,加载到其内部高速的 SRAM (一种易失性存储器) 中。
加载完毕后,MCU的程序计数器 (PC) 跳转到SRAM中的程序入口,开始正式执行我们编写的应用程序。

看,存储器是数据的载体,Flash是承载代码和关键数据的具体实现,而SPI则是连接大脑与数据仓库之间的生命线。它们三者协同工作,才构成了嵌入式系统运行的基础。

理论的深度决定了工程实践的高度。理解了这些底层的原理,才能在面对时序问题、驱动开发、系统优化时游刃有余,而不是仅仅停留在调用库函数的表层。

这个盛夏,愿你心中燃起不灭的火焰,在代码与电路的交响中,谱写属于你自己的华彩乐章!

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容