STM32驱动W25Q
STM32驱动W25Q
驱动W25Q系列SPI Flash存储器(如W25Q64/W25Q128)需要以下步骤,以STM32 HAL库为例:
1. 硬件连接
| W25Q引脚 | STM32引脚 |
|---|---|
CS |
任意GPIO |
DO |
SPI_MISO |
WP |
高电平(3.3V) |
GND |
GND |
DI |
SPI_MOSI |
CLK |
SPI_SCK |
HOLD |
高电平(3.3V) |
VCC |
3.3V |
2. CubeMX配置
- 启用SPI外设(模式:
Full-Duplex Master) - 配置SPI参数:
- 时钟分频:≤ 50MHz(W25Q支持最高133MHz)
- 数据宽度:8位
- 时钟极性(CPOL):Low
- 时钟相位(CPHA):1 Edge
- 设置CS引脚为GPIO输出模式(推挽输出,上拉)
3. 驱动代码实现
(1) 定义操作指令(参考W25Q数据手册)
#define W25Q_WRITE_ENABLE 0x06
#define W25Q_READ_DATA 0x03
#define W25Q_PAGE_PROGRAM 0x02
#define W25Q_SECTOR_ERASE 0x20
#define W25Q_READ_STATUS_REG1 0x05
#define W25Q_DEVICE_ID 0x90
(2) 片选控制函数
void W25Q_CS_Enable(void) {
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_RESET);
}
void W25Q_CS_Disable(void) {
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_SET);
}
(3) 等待Flash就绪
void W25Q_WaitBusy(void) {
uint8_t status;
do {
W25Q_CS_Enable();
HAL_SPI_Transmit(&hspi1, (uint8_t[]){W25Q_READ_STATUS_REG1}, 1, 100);
HAL_SPI_Receive(&hspi1, &status, 1, 100);
W25Q_CS_Disable();
} while (status & 0x01); // 检查BUSY位
}
(4) 读取设备ID
uint16_t W25Q_ReadID(void) {
uint8_t tx[4] = {W25Q_DEVICE_ID, 0x00, 0x00, 0x00};
uint8_t rx[2] = {0};
W25Q_CS_Enable();
HAL_SPI_Transmit(&hspi1, tx, 4, 100);
HAL_SPI_Receive(&hspi1, rx, 2, 100);
W25Q_CS_Disable();
return (rx[0] << 8) | rx[1]; // 返回16位ID
}
(5) 扇区擦除(4KB)
void W25Q_EraseSector(uint32_t addr) {
uint8_t cmd[4] = {
W25Q_SECTOR_ERASE,
(uint8_t)(addr >> 16),
(uint8_t)(addr >> 8),
(uint8_t)addr
};
W25Q_WriteEnable();
W25Q_CS_Enable();
HAL_SPI_Transmit(&hspi1, cmd, 4, 100);
W25Q_CS_Disable();
W25Q_WaitBusy(); // 等待擦除完成
}
(6) 写入数据(页编程)
void W25Q_PageWrite(uint32_t addr, uint8_t* data, uint16_t len) {
uint8_t cmd[4] = {
W25Q_PAGE_PROGRAM,
(uint8_t)(addr >> 16),
(uint8_t)(addr >> 8),
(uint8_t)addr
};
W25Q_WriteEnable();
W25Q_CS_Enable();
HAL_SPI_Transmit(&hspi1, cmd, 4, 100);
HAL_SPI_Transmit(&hspi1, data, len, 1000);
W25Q_CS_Disable();
W25Q_WaitBusy();
}
(7) 读取数据
void W25Q_ReadData(uint32_t addr, uint8_t* buf, uint32_t len) {
uint8_t cmd[4] = {
W25Q_READ_DATA,
(uint8_t)(addr >> 16),
(uint8_t)(addr >> 8),
(uint8_t)addr
};
W25Q_CS_Enable();
HAL_SPI_Transmit(&hspi1, cmd, 4, 100);
HAL_SPI_Receive(&hspi1, buf, len, 1000);
W25Q_CS_Disable();
}
4. 使用示例
// 初始化后验证芯片
uint16_t id = W25Q_ReadID(); // W25Q64应为0xEF17
// 擦除扇区0
W25Q_EraseSector(0x0000);
// 写入数据
uint8_t write_buf[256] = "Hello W25Q!";
W25Q_PageWrite(0x0000, write_buf, 256);
// 读取数据
uint8_t read_buf[256];
W25Q_ReadData(0x0000, read_buf, 256);
关键注意事项:
- 时序要求:操作后必须等待
BUSY标志清除。 - 写使能:擦除/写入前需发送
WRITE_ENABLE指令。 - 地址对齐:页编程不能跨页(每页256字节),扇区擦除为4KB对齐。
- 时钟速度:初始化时使用低频(如2MHz),验证后提高至合适频率。
完整驱动需包含更多功能(块擦除、整片擦除、安全寄存器操作等),建议结合W25Q数据手册完善代码。
STM32F103ZET6将SPI+W25QXX的程序移植后,步进电机均转速转慢的原因?
该如何处理; 程序通过预编绎选择来做不同程序的对比: 部分代码如下: 将W25Q不声明即为原程序; #define W25Q #ifdef W25Q
STM32驱动FLASH(W25Q64)
W25Q64 将 **8M** 的容量分为 **128 个块(Block)** ,每个块大小为 **64K 字节** ,每个块又分为 **16个扇区(Sector)** ,每个扇区 **4K 个字节** 。
2023-10-24 09:50:49
STM32 SPI读写W25Q64(三)
GPIO口模拟SPI读写W25Q64的基本内容已经跟大家介绍完了,今天跟大家介绍下如何通过串口接收文件并保存到W25Q64中。
2023-07-22 11:11:39
stm32 cubemx usb spi flash w25q128 u盘调试笔记
基本代码确定使用需求 USB SPIusb以下配置保持默认配置即可,切记不要胡乱修改参数。spi调试spi flash我使用的flash 是w25q128 spi 通信模式,所以直接找一个别人写好的驱动就可以了。
资料下载
陈文博
2021-12-14 18:52:02
剖析STM32F103读写W25Q64
最近使用STM32F103+W25Q64+USB+FATFS做了一个U盘设备。程序已经调试完成了,现在重新梳理一下知识再做一个记录。STM32F103+USB是根据官方demo修改的,这一部分没啥
资料下载
佚名
2021-12-02 11:21:39
【STM32Cube-18】使用硬件QSPI读写SPI Flash(W25Q64)
本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件QSPI外设与 SPI Flash 通信(W25Q64)。
资料下载
31274
2021-12-01 21:06:09
STM32 SPI驱动增加信号量进行传输完成通知哪位兄弟做过这样的尝试吗
了 while 死等目前有点问题。我在 SPI 上挂了一个 W25Q 的 flash,在使用原来的驱动 while 等待传输方式时是没问题的,换成中断发送,等待信号量后出现了一些问题
Linux驱动开发-编写W25Q64(Flash)驱动
本篇文章就介绍如何在Linux系统下编写W25Q64芯片的驱动,完成数据存储,W25Q64支持标准SPI总线,当前
2022-09-17 15:09:38
RT-thread两种方式读取到W25Q16的ID不一样是什么原因
;;rt_spi_send_then_recv(spi_dev_w25q, &w25x_read_id, 1, id1, 5);rt_kprintf("
介绍W25Q64和驱动函数
最近使用STM32F103+W25Q64+USB+FATFS做了一个U盘设备。程序已经调试完成了,现在重新梳理一下知识再做一个记录。STM32F103+USB是根据官方demo修改的,这一部分没啥
有关W25Q16的基本知识汇总
关键字:RTC,定时器, Flash, stm32,SPI,W25Q16W25Q1625Q系列,**16M-bit(1bytes=8 bits) **的flash。可以保存voice,text
如何解决xc7s不支持w25q系列芯片的问题?
今天给大侠带来Spartan-7 XC7S100程序固化 w25q128FVSG,解决xc7s不支持w25q系列芯片的问题,话不多说,上货。 1、将芯片配置模式改为001。 2
2021-05-08 11:09:57
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- amoled屏幕和oled区别
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机