HAL库 STM32驱动W25QXX驱动例程
- 📍驱动程序参考:《STM32CubeMX | 基于STM32使用HAL库W25Q128驱动程序》
- 🔑 驱动方式:硬件SPI方式和SPI DMA方式。
- 🔖适用于:W25X系列/GD系列芯片(容量小于或等于16MB)::W25Q80、W25Q16、W25Q32、 W25Q64、 W25Q128、
- 📌W25Q256可以参考《stm32 W25QXX系列驱动 W25Q80 W25Q16 W25Q32 W25Q64 W25Q128 W25Q256》
- 🍁W25Q64原理图:

🔨spi方式配置

🛠SPI DMA配置

- 🌿自定义CS引脚:

⛳相关注意事项(更新内容2024-10-20)
-
🌿推荐将SPI各通讯引脚输出速度设置为高。

-
🌿推荐将CS片选信号引脚默认设置上拉。
-
🌿半双工通信模式下:
- 🔖半双工就是同一个时刻只能为一个方向传输数据,SPI 总线的半工模式接线方式如下:
- 主器件 MOSI和从器件之间,串联一个1KΩ 的接线电阻很有必要,因为当主器件和从器件的通信方向不是同步变化时,容易出现其中一个输出低电平,另一个输出高电平,造成短路。
🛠状态寄存器修改(2024-10-20 新增)
- 🌿修改状态寄存器时序介绍:

- 🌿可以被修改的位介绍:
写入状态寄存器指令允许写入状态寄存器。可写的状态寄存器位包括:状态寄存器-1中的SEC、TB、BP[2:0];状态寄存器-2中的CMP、LB[3:1]、QE、SRL;状态寄存器-3中的DRV1、DRV0、WPS。所有其他状态寄存器位位置都是只读的,并且不受写入状态寄存器指令的影响。LB[3:1]为非易失性的OTP位,一旦设置为1,就不能清除为0。
- 🌿修改状态寄存器指令:Write Status Register-1 (01h), Status Register-2 (31h) & Status Register-3 (11h)
- 修改状态寄存器前,需要先发送使能命令:
0x06
- 代码实现部分:
//写W25QXX状态寄存器
//只有SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)可以写!!!
void W25QXX_Write_SR(uint8_t CH,uint8_t status)
{
uint8_t reg;
W25QXX_Write_Enable(); //写使能
W25QXX_CS_L(); //使能器件
switch(CH)
{
case 1:
reg=W25X_WriteStatusReg1; //写状态寄存器1指令
break;
case 2:
reg=W25X_WriteStatusReg2; //写状态寄存器2指令
break;
case 3:
reg=W25X_WriteStatusReg3; //写状态寄存器3指令
break;
default:
reg=W25X_WriteStatusReg1;
break;
}
W25QXX_SPI_ReadWriteByte(reg); //发送写取状态寄存器命令
__NOP(); __NOP();//__NOP(); __NOP();
W25QXX_SPI_ReadWriteByte(status); //写入一个字节
W25QXX_CS_H(); //取消片选
}
- 🔨修改状态寄存器:3:
W25QXX_Write_SR(3,0x00);(默认是0x60)



🔰SPI方式和SPI DMA方式软件驱动代码不同之处
//SPI读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
static uint8_t W25QXX_SPI_ReadWriteByte(uint8_t TxData)
{
uint8_t RxData = 0X00;
// if(HAL_SPI_TransmitReceive(W25QXX_SPI_Handle, &TxData, &RxData, 1, 10) != HAL_OK)//普通方式
if(HAL_SPI_TransmitReceive_DMA(W25QXX_SPI_Handle, &TxData, &RxData, 1) != HAL_OK) {
//DMA接收和发送
RxData = 0XFF;
}
return RxData;
}
📑W25QXX驱动代码
- 📄 W25QXX.h
#ifndef __W25QXX_H
#define __W25QXX_H
/*
W25QXX ID信息
读取命令(0x90)
W25Q80的芯片ID为:0XEF13
W25Q16 的芯片ID为:0XEF14
W25Q32 的芯片ID为:0XEF15
W25Q64 的芯片ID为:0XEF16
W25Q128的芯片ID为:0XEF17
W25Q256的芯片ID为:0XEF18
W25Q512的芯片ID为:0XEF19
*/
#include <main.h>
//可以根据个人需求配置对应的硬件SPIx
#define W25QXX_SPI_Handle (&hspi2) //使用SPI2
//W25X系列/Q系列芯片列表
//W25Q80 ID 0XEF13
//W25Q16 ID 0XEF14
//W25Q32 ID 0XEF15
//W25Q64 ID 0XEF16
//W25Q128 ID 0XEF17
#define W25Q80 0XEF13
#define W25Q16 0XEF14
#define W25Q32 0XEF15
#define W25Q64 0XEF16
#define W25Q128 0XEF17
#define W25QXX_CS_L() HAL_GPIO_WritePin(W25QXX_CS_GPIO_Port, W25QXX_CS_Pin, GPIO_PIN_RESET)
#define W25QXX_CS_H() HAL_GPIO_WritePin(W25QXX_CS_GPIO_Port, W25QXX_CS_Pin, GPIO_PIN_SET)
extern uint16_t W25QXX_TYPE;
extern uint32_t W25QXX_SIZE;
extern uint8_t W25QXX_UID[8];
//
//指令表
#define W25X_WriteEnable 0x06
#define W25X_WriteDisable 0x04
#define W25X_ReadStatusReg 0x05
#define W25X_WriteStatusReg 0x01
#define W25X_ReadData 0x03
#define W25X_FastReadData 0x0B
#define W25X_FastReadDual 0x3B
#define W25X_PageProgram 0x02
#define W25X_BlockErase 0xD8
#define W25X_SectorErase 0x20

最低0.47元/天 解锁文章
1210

被折叠的 条评论
为什么被折叠?



