基于 FPGA 的 SPI 控制 FLASH 读写
一、SPI 简介
SPI 是 Serial Peripheral Interface 的缩写,即串行外围设备接口。由 Motorola 公司推出的一种全双工、同步串行总线接口,只需要四根信号线即可实现多个芯片之间的主从连接结构,节约引脚,同时有利于 PCB 布局。它主要应用在 Flash 存储器、EEPROM 存储器、ADC、DAC、RTC 等,实现主控器与芯片之间的串行数据传输。
[图片]
SPI 通信需要四根信号线,分别为 SCLK、MOSI、MISO 和 CS_N。其中 CS_N、SCLK、MOSI 是由主机输出给从机,而 MISO 由从机输出给主机。
- SCLK (Serial Clock): 串行时钟线 (Master>Slave),控制数据交换的时机和速率;
- MOSI (Master Out Slave In): 主机输出,从机输入 (Master>Slave),用于 SPI 设备发送数据;
- MISO (Master In Slave Out): 主机输入,从机输出 (Slave>Master),用于 SPI 设备接收数据;
- CS_N (Chip Select): 片选信号 (Master->Slave),以控制与哪个从机通信。
[图片]
[图片]
SPI 通讯设备之间的常见连接方式:一主机一从机、一主机多从机。其中一主机多从机连接方式又分常规多片选模式和菊花链 (星链) 模式。
SPI 数据传输需要注意以下几点:
- SPI 总线在一次数据传输过程中,只能有一个主机和一个从机通信,并且主机和从机可以同时向对方进行数据传输;
- 当 SPI 总线上有多个 SPI 接口的设备时,应注意区分各设备的主从地位,在某时刻只能有一个设备作为主机;
- 从机只能在主机发起通信时,才能接收或向主机传输数据;
- SPI 每次数据传输可以为 8 位或 16 位为单位,每次传输的单位数不受限制,且大多以 MSB 的方式进行传输。
[图片]
SPI 传输模式有四种,通过 CPOL(时钟极性)与 CPHA(时钟相位)控制;CPOL 为 0 时代表时钟空闲状态为低,1 时为高;CPHA 为 0 时代表数据在时钟周期的第一个改变沿(前沿)采样,在第二个改变沿(后沿)输出(改变),为 1 时代表数据在时钟周期的第一个改变沿(前沿)输出,在第二个改变沿(后沿)采样(改变)。
| CPOL\CPHA | 0 | 1 |
|---|---|---|
| 0 | 模式 0 | 模式 1 |
| 1 | 模式 2 | 模式 3 |
二、FLASH_M25P16 简介
M25P16 是一款 16 兆位 (2M×8)串行闪存,配备先进的写保护机制,通过高速 SPI 兼容总线进行访问。该存储器支持使用页编程指令以 1 至 256 字节为单位进行编程。其存储结构由 32 个扇区组成,每个扇区包含 256 页,每页宽度为 256 字节。因此整个存储器可视为由 8192 页(即 2,097,152 字节)构成。存储器可通过批量擦除指令进行整体擦除,或使用扇区擦除指令逐扇区擦除。
| 扇区 | 最小地址 | 最大地址 |
|---|---|---|
| 31 | 1F0000h | 1FFFFFh |
| 30 | 1E0000h | 1EFFFFh |
| 29 | 1D0000h | 1DFFFFh |
| 28 | 1C0000h | 1CFFFFh |


