SPI的收发(W25Q64外部flash 和 内部flsah)
IIC为半双工,同一时刻只能单向传输。
串口和SPI为全双工模式,独立收发线,默认支持同时双向传输。
- SPI核心线:
- MOSI:主机输出,从机输入(主机发送数据到从机)
- MISO:主机输入,从机输出(从机发送数据到主机)
- SCK:时钟线(主机提供同步时钟)
- CS/SS:片选线(主机选中特定从机)
SPI 发送数据时,从机会同时返回一个字节,SPI的收发类似于一个轮盘操作,没有 “单独发送” 或 “单独接收”,只要启动通信(轮盘转动),就必然是双向的数据交换。
因此 “发送” 和 “接收” 是绑定的(即使只需要读或写,也必须进行双向操作)。
u8 SPI1_ReadWriteByte(u8 txd)
{while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)!= SET);
//TXE确保发送缓冲区就绪SPI_I2S_SendData(SPI1, txd);while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)!= SET);
//RXNE确保接收完成return SPI_I2S_ReceiveData(SPI1);
}
接下来为SPI的读写分别进行封装:
W25Q64 这类 SPI Flash 芯片的存储特性是:
- 写入操作(编程):只能将存储单元从 1 改为 0(即只能 “清零”,不能直接 “置 1”)。
- 擦除操作:会将指定区块 / 扇区的所有存储单元恢复为 1(即全为
0xFF
)。
这就是为什么在对 Flash 进行写入前,通常需要先擦除对应区域 —— 因为如果原来的单元是 0,直接写入 1 是无效的,必须先通过擦除恢复为 1,再写入 0。
W25Q64 是一款常用的 SPI Flash 存储芯片,其总容量为 8MB(兆字节)。这个容量决定了它的地址范围是从 0x000000
到 0x7FFFFF
(共 24 位地址空间),也对应了之前提到的页和扇区数量:
- 按每页 256 字节计算,总页数为 8