在STM32上使用SPI时序驱动W25Q64 Flash存储器是一种常见的应用,以下是一篇关于STM32通过硬件SPI实现W25Q64读取的详细教程,包括初始化配置、读写操作以及相关代码,篇幅大约2000字。
STM32 SPI时序驱动W25Q64 Flash存储器
1. 简介
W25Q64是一款由华邦电子生产的串行Flash存储器,具有8M位的存储容量,广泛应用于嵌入式系统中。STM32作为流行的32位微控制器,通过其硬件SPI功能可以方便地与W25Q64进行通信。
2. W25Q64特性
- 容量:64Mb (8MB)
- 组织结构:256字节/页,4KB/扇区,128个扇区
- 工作电压:2.7V 至 3.6V
- 接口:标准SPI,双倍数据率SPI,四倍数据率SPI
- 读写周期:至少100,000次
3. STM32硬件SPI配置
STM32的SPI可以通过以下步骤进行配置:
- 使能SPI和GPIO时钟
- 配置SPI的MOSI、MISO、SCK引脚
- 配置SPI的工作模式(主机或从机)、数据大小、时钟极性和相位
- 使能SPI外设
4. W25Q64初始化配置[11]
void W25Q64_InitConfig(void) {
GPIO_InitTypeDef w25q64_GPIO;
SPI_InitTypeDef w25q64_SPI;
// 配置SPI GPIO
w25q64_GPIO.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
w25q64_GPIO.GPIO_Mode = GPIO_Mode_AF_PP;
w25q64_GPIO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &w25q64_GPIO);
// 配置CS GPIO
w25q64_GPIO.GPIO_Pin = GPIO_Pin_4;
w25q64_GPIO.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &w25q64_GPIO);
W25Q64_CS_H(); // 取消选择状态
// 配置SPI
SPI_I2S_DeInit(SPI1);
SPI_Init(SPI1, &w25q64_SPI);
SPI_Cmd(SPI1, ENABLE);
}
5. W25Q64基本操作
- 读取ID:通过发送读取ID指令获取制造商和设备ID。
- 写使能:在执行写操作前,需要先发送写使能指令。
- 扇区擦除:可以擦除4KB大小的扇区。
- 页编程:将数据写入指定页。
6. 读取W25Q64 ID
uint16_t W25Q64_GetID(void) {
uint16_t id = 0;
W25Q64_CS_L();
W25Q64_ReadWriteByte(0x90); // 发送读ID指令
id = (W25Q64_ReadWriteByte(0xFF) << 8) | W25Q64_ReadWriteByte(0xFF);
W25Q64_CS_H();
return id;
}
7. 写数据到W25Q64
void W25Q64_WriteData(uint32_t addr, uint8_t *data, uint32_t size) {
// 写数据前擦除扇区等操作...
W25Q64_PageWrite(addr, data, size);
}
8. 读取数据从W25Q64
void W25Q64_ReadData(uint32_t addr, uint8_t *data, uint32_t size) {
W25Q64_CS_L();
W25Q64_ReadWriteByte(0x03); // 发送读数据指令
for (uint32_t i = 0; i < size; ++i) {
data[i] = W25Q64_ReadWriteByte(0xFF);
}
W25Q64_CS_H();
}
9. 实际测试
在实际应用中,可以测试在不同地址写入数据,并从这些地址读取数据以验证操作的正确性。
10. 总结
通过STM32的硬件SPI与W25Q64通信是一种高效且可靠的方式,可以实现数据的非易失性存储。本教程提供了详细的初始化过程、读写操作以及示例代码,方便开发者快速上手。
请注意,以上代码仅为示例,实际应用中可能需要根据具体的硬件连接和需求进行适当的调整。
✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇