登录/注册

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配置


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);

关键注意事项:

  1. 时序要求:操作后必须等待BUSY标志清除。
  2. 写使能:擦除/写入前需发送WRITE_ENABLE指令。
  3. 地址对齐:页编程不能跨页(每页256字节),扇区擦除为4KB对齐。
  4. 时钟速度:初始化时使用低频(如2MHz),验证后提高至合适频率。

完整驱动需包含更多功能(块擦除、整片擦除、安全寄存器操作等),建议结合W25Q数据手册完善代码。

STM32F103ZET6将SPI+W25QXX的程序移植后,步进电机均转速转慢的原因?

该如何处理; 程序通过预编绎选择来做不同程序的对比: 部分代码如下: 将W25Q不声明即为原程序; #define W25Q #ifdef W25Q

2024-04-02 08:30:47

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驱动W25Q64读写数据资料

STM32驱动W25Q64读写数据资料

资料下载 jf_71771911 2023-04-12 14:28:01

stm32 cubemx usb spi flash w25q128 u盘调试笔记

基本代码确定使用需求 USB SPIusb以下配置保持默认配置即可,切记不要胡乱修改参数。spi调试spi flash我使用的flash 是w25q128 spi 通信模式,所以直接找一个别人写好的驱动就可以了。

资料下载 陈文博 2021-12-14 18:52:02

QSIP驱动W25Q256调试记录

QSIP驱动W25Q256调试记录发现异常初始化配置初始化要点指令时序分析与驱动函数W

资料下载 李艳 2021-12-04 17:06:08

剖析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 等待传输方式时是没问题的,换成中断发送,等待信号量后出现了一些问题

2022-11-17 10:17:25

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, &amp;w25x_read_id, 1, id1, 5);rt_kprintf("

2022-08-31 14:43:17

调试QSPI方式驱动W25Q256的过程分享

调试QSPI方式驱动W25Q256的过程分享

2022-02-07 08:29:09

介绍W25Q64和驱动函数

最近使用STM32F103+W25Q64+USB+FATFS做了一个U盘设备。程序已经调试完成了,现在重新梳理一下知识再做一个记录。STM32F103+USB是根据官方demo修改的,这一部分没啥

2022-01-26 07:53:10

有关W25Q16的基本知识汇总

关键字:RTC,定时器, Flash, stm32,SPI,W25Q16W25Q1625Q系列,**16M-bit(1bytes=8 bits) **的flash。可以保存voice,text

2022-01-21 10:48:30

如何解决xc7s不支持w25q系列芯片的问题?

今天给大侠带来Spartan-7 XC7S100程序固化 w25q128FVSG,解决xc7s不支持w25q系列芯片的问题,话不多说,上货。     1、将芯片配置模式改为001。 2

2021-05-08 11:09:57

7天热门专题 换一换
相关标签