HAL库 STM32驱动W25QXX驱动例程

HAL库 STM32驱动W25QXX驱动例程


在这里插入图片描述

🔨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
W25Qxx 是一款常用的闪存芯片,它使用 SPI 总线进行数据通信,是许多嵌入式系统的不可或缺的部件。Verilog 是一种硬件描述语言,可以用来描述电路的行为模型和结构。W25Qxx Verilog 是将 W25Qxx 闪存芯片的行为模型和控制器的硬件实现用 Verilog 语言描述出来。 W25Qxx Verilog 的实现包括对 W25Qxx 芯片的 FPGA 硬件平台,SPI 原语(Primitive)和 SPI 控制器的集成设计。为了将闪存芯片和 FPGA 驱动程序连接起来,需要使用 SPI 协议控制器。设计时需要确保 SPI 控制器和芯片的工作方式兼容,并且不会产生冲突。控制器可以支持多种不同的 SPI 命令,包括写入、读取、擦除和其他控制命令。 在实现了 W25Qxx 芯片控制器之后,可以通过使用各种模拟工具进行仿真和测试。在进行测试时需要逐步验证 SPI 的基本功能,包括初始化、写入、读取、擦除和保护等,以确保闪存芯片能够按预期方式正常工作。在应用程序调试阶段可以使用 JTAG 或其他 Debug 工具来检测系统是否正常工作,并且可以通过波形跟踪分析数据传输和电信号传递的行为。 总的来说, W25Qxx Verilog 实现的目的是为了方便嵌入式系统开发人员通过硬件描述语言实现 W25Qxx 芯片驱动程序的硬件实现,并将其与特定的 FPGA 硬件平台集成。这种硬件描述语言实现可以提高系统的性能和可靠性,并且更易于开发人员进行定制和控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值