SPI Flash操作
https://blog.csdn.net/qq_41126242/article/details/145050324
Nor Flash和Nand Flash
特性 | Nor Flash | Nand Flash |
---|---|---|
读写速度 | 高速,支持随机读写(类似于RAM) | 较慢,按块顺序读写 |
写入速度 | 较慢 | 快速 |
擦除速度 | 较慢,擦除整个块(约5秒) | 快速,擦除块(约4毫秒) |
擦除次数 | 较少,一般为10000次左右 | 较多,可达100万次以上 |
可靠性 | 高,不易发生位反转 | 一般,易发生位反转,需使用ECC/DCC算法 |
容量 | 较小,通常在1MB到32MB之间 | 较大,通常在8GB到512GB之间 |
成本 | 较高 | 较低 |
接口 | 类似SRAM,有独立地址和数据总线 | 使用I/O总线串行访问 |
擦除方式 | 按字节擦除 | 按块擦除 |
应用领域 | 存储代码、关键数据、嵌入式系统等 | 存储大量数据,如固态硬盘、U盘等 |
执行方式 | 支持片上执行(XIP) | 需要先将数据读入RAM再执行 |
硬件连线
Flash Pin | MCU--FLash方向 | 作用 |
---|---|---|
SCK | M-->F | 串行时钟, 确定Flash工作频率 |
CS | M-->F | 片选, 需要交互的时候打开(拉高),用完关闭(拉低) |
MOSI | M-->F | MCU输出/串行输入, 有时候简称SI |
MISO | M<--F | MCU输入/串行输出, 有时候简称SO |
此外Flash还有VCC和GND自然不用说, 还有WP(写保护)和 HOLD/RESET(暂停/复位), 这两个一般就拉高处于可写、可用状态, 加起来就8个脚.
还有一种四线SPI的用法加快读的速度(Flash写比较慢也快不了), 叫做QSPI, 此时SI/SO/WP/HOLD都将作为双向IO口与MCU连接. 但多数情况单线就够了.
与Flash的交互通道: SPI的3个寄存器
SPI寄存器 | MCU--Flash写入方向 | 作用 |
---|---|---|
CR | M-->F | 控制寄存器1~2Byte, 控制Master模式, SPI使能能 |
DR | M<->F | 数据寄存器 1Byte, 双向的, 读写都通过这一个. 通常是一串数据包括 1B命令 + 3B地址 + nB数据. |
SR | M<--F | 状态寄存器 1Byte, 读取Flash发来的状态, 主要是看Flash处理完上一条发过去的数据没有 |
Flash读/擦/写结构
Flash都是必须先擦再写的,否则就写不进去。英文里,为了与普通的写 Write
区别, Flash的写叫做Program
,所以普通的Write = Erase + Program
.
Flash从小到大的结构单位依次是 Page < Sector < Block < Device. Page是Program的最小单位, Sector是Erase的=最小单位. 所以每次写操作是要先在内存中读取并合并至少一个Sector的新旧数据, 擦除并写入的.