基于 FPGA 的 SPI Flash 读写控制设计
一、SPI 协议基础
SPI(Serial Peripheral Interface)是 Motorola 推出的一种全双工同步串行总线,仅需四根信号线即可实现主从设备间的高效数据传输,广泛应用于 Flash、EEPROM、ADC/DAC 等外设。
SPI 通信依赖四根关键信号线:
- SCLK:串行时钟,由主机控制数据交换速率与时机。
- MOSI:主机输出/从机输入,用于发送指令或数据。
- MISO:主机输入/从机输出,用于接收数据。
- CS_N:片选信号,低电平有效,选中特定从机。
常见连接模式包括一主机一从机及一主机多从机(常规多片选或菊花链)。传输时需注意单主机原则,且数据通常以 MSB(最高位优先)方式传输,支持 8 位或 16 位帧长。
SPI 支持四种工作模式,由 CPOL(时钟极性)和 CPHA(时钟相位)决定:
| CPOL\CPHA | 0 | 1 |
|---|---|---|
| 0 | 模式 0 | 模式 1 |
| 1 | 模式 2 | 模式 3 |
本设计采用模式 0(CPOL=0, CPHA=0),即空闲时钟为低电平,上升沿采样数据,下降沿输出数据。
二、M25P16 Flash 特性
M25P16 是一款 16Mb(2M×8bit)串行闪存,支持高速 SPI 兼容总线。其存储结构分为 32 个扇区,每扇区 256 页,每页 256 字节,总计约 2MB 容量。支持页编程、扇区擦除及批量擦除操作。
引脚功能简述:
- Q:串行数据输出,下降沿移出。
- D:串行数据输入,上升沿锁存。
- C:串行时钟,提供时序控制。
- S:芯片选择,低电平激活设备。
- HOLD:保持信号,暂停通信但不取消选中。
- W:写保护,配合状态寄存器控制区域保护。
核心指令集包括写使能(WREN)、读 ID(RDID)、读状态(RDSR)、字节读(READ)、快速读(FAST_READ)、页编程(PP)、扇区擦除(SE)及批量擦除(BE)。所有指令均以最高有效位为先进行传输。
关键时序要求:
| 操作 | 最小时间 | 最大时间 | 单位 |
|---|---|---|---|
| 命令间隔 | 100 | - | ns |
| 页写 | 1.4 | 5 | ms |
| 扇区擦除 | 1 | 3 | s |
| 全擦除 | 17 | 40 | s |
三、系统设计思路
硬件架构主要包含 SPI 控制器、状态机逻辑及外设接口。
框图设计 系统通过按键触发不同操作,并通过数码管与串口反馈结果:
- 读 ID:按键触发后读取 Flash 制造商及设备 ID,显示于数码管并上传串口。
- 读数据:读取指定地址数据,实时显示。


