W25Q32驱动 基于HAL库的SPI

2024-09-04 00:28
文章标签 驱动 hal spi w25q32

本文主要是介绍W25Q32驱动 基于HAL库的SPI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

环境

芯片:STM32F103ZET6
库:来自HAL的STM32F1XX.H

原理图

cubeMX配置

W25Q32.h

//
// Created by seven on 2024/9/2.
//#ifndef SPI_W25Q32_H
#define SPI_W25Q32_H
#include "spi.h"/*** 初始化W25Q32闪存芯片*/
void W25Q32_Init(void);/*** 停止W25Q32闪存芯片的操作*/
void w25q32_Stop(void);/*** 读取W25Q32闪存芯片的ID* @param sid 存储制造商ID的指针* @param mid 存储设备ID的指针*/
void W25Q32_ReadId(uint8_t *sid,uint16_t *mid);/*** 等待W25Q32闪存芯片不忙* 原理是发送05h指令,循环读取状态寄存器(8位),直到第0位变为0,表示芯片不忙*/
void Inf_W25Q32_WaitNotBusy(void);/*** 使能W25Q32闪存芯片的写操作*/
void Inf_W25Q32_WriteEnable(void);/*** 禁止W25Q32闪存芯片的写操作*/
void Inf_W25Q32_WriteDisable(void);/*** 擦除W25Q32闪存芯片的指定扇区* @param block 块地址* @param sector 扇区地址*/
void Inf_W25Q32_SectorErase(uint8_t block,uint8_t sector);/*** 向W25Q32闪存芯片的指定页面写入数据* @param block 块地址* @param sector 扇区地址* @param page 页面地址* @param data 写入的数据缓冲区指针* @param len 写入的数据长度*/
void Inf_W25Q32_PageProgram(uint8_t block,uint8_t sector,uint8_t page,uint8_t data[],uint8_t len);/*** 从W25Q32闪存芯片的指定位置读取数据* @param block 块地址* @param sector 扇区地址* @param page 页面地址* @param buff 存储读取数据的缓冲区指针* @param len 读取的数据长度*/
void Inf_W25Q32_ReadData(uint8_t block,uint8_t sector,uint8_t page,uint8_t buff[],uint8_t len);
#endif //SPI_W25Q32_H

W25Q32.c

//
// Created by seven on 2024/9/2.
//#include "W25Q32.h"
void W25Q32_Init(void){MX_SPI1_Init();}
void w25q32_Stop(void){SPI_Stop();
}
void W25Q32_ReadId(uint8_t *sid,uint16_t *mid){// 1. 片选启动SPI_Start();// 2. 发送指令SPI_SwapByte(0x9f);// 3. 接收id// 3.1 首先接收制造商id*sid = SPI_SwapByte(0xff);// 3.2 接收设备id*mid = SPI_SwapByte(0xff) << 8;*mid |= SPI_SwapByte(0xff) << 0;// 4. 片选关闭SPI_Stop();
}// 等待忙状态
// 原理是调用05h指令  可以循环读取8位的状态寄存器  -> 第0位表示忙状态
// 当第0位变为0的时候表示它不忙
void Inf_W25Q32_WaitNotBusy(void){SPI_Start();SPI_SwapByte(0x05);while(SPI_SwapByte(0xff) & 0x01){}SPI_Stop();
}
// 打开写使能
void Inf_W25Q32_WriteEnable(void){SPI_Start();SPI_SwapByte(0x06);SPI_Stop();
}
// 关闭写使能
void Inf_W25Q32_WriteDisable(void){SPI_Start();SPI_SwapByte(0x04);SPI_Stop();
}
// 擦除方法
void Inf_W25Q32_SectorErase(uint8_t block,uint8_t sector){Inf_W25Q32_WaitNotBusy();Inf_W25Q32_WriteEnable();SPI_Start();SPI_SwapByte(0x20);uint32_t address = (block << 16) | (sector << 8);SPI_SwapByte(address >> 16);SPI_SwapByte(address >> 8);SPI_SwapByte(address >> 0);SPI_Stop();Inf_W25Q32_WriteDisable();
}
// 写入数据
void Inf_W25Q32_PageProgram(uint8_t block,uint8_t sector,uint8_t page,uint8_t data[],uint8_t len){Inf_W25Q32_WaitNotBusy();Inf_W25Q32_WriteEnable();SPI_Start();SPI_SwapByte(0x02);uint32_t address = (block << 16) | (sector << 8) | (page << 0);SPI_SwapByte(address >> 16);SPI_SwapByte(address >> 8);SPI_SwapByte(address >> 0);for(int i = 0; i < len; i++){SPI_SwapByte(data[i]);}SPI_Stop();Inf_W25Q32_WriteDisable();}
// 读数据 -> 不需要使能  但需要等待忙状态
void Inf_W25Q32_ReadData(uint8_t block,uint8_t sector,uint8_t page,uint8_t buff[],uint8_t len){Inf_W25Q32_WaitNotBusy();SPI_Start();SPI_SwapByte(0x03);uint32_t address = (block << 16) | (sector << 8) | (page << 0);SPI_SwapByte(address >> 16);SPI_SwapByte(address >> 8);SPI_SwapByte(address >> 0);for(int i = 0; i < len; i++){buff[i] = SPI_SwapByte(0xff);}SPI_Stop();
}

基于官方HAL库spi额外添加的函数

 在spi.c

/* USER CODE BEGIN 1 */
/* USER CODE END 1 */

内添加下面代码

/*** @brief SPI通信启动函数** 该函数通过将片选(CS)信号置低来启动SPI通信。*/
void SPI_Start(void)
{// 将CS(片选)信号置低,启动SPI通信HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);
}/*** @brief SPI通信停止函数** 该函数通过将片选(CS)信号置高来结束SPI通信。*/
void SPI_Stop(void)
{// 将CS(片选)信号置高,结束SPI通信HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
}/*** @brief SPI通信中字节交换函数** 该函数在SPI通信中交换一个字节,并返回接收到的字节。** @param byte 要发送和交换的字节* @return uint8_t 返回从SPI通信接收到的字节*/
uint8_t SPI_SwapByte(uint8_t byte)
{uint8_t rByte = 0;// 通过SPI通信发送字节并接收回应字节HAL_SPI_TransmitReceive(&hspi1, &byte, &rByte, 1, 1000);return rByte;
}

在spi.h的

/* USER CODE BEGIN Prototypes */
/* USER CODE END Prototypes */

内添加下面代码

// 初始化SPI通信
void SPI_Start(void);
// 停止SPI通信
void SPI_Stop(void);
// 数据位交换
// 将输入的8位数据进行位交换,例如0x01交换后变为0x80
uint8_t SPI_SwapByte(uint8_t byte);

这篇关于W25Q32驱动 基于HAL库的SPI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134471

相关文章

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

STM32CubeMX和HAL库-新建项目

目录 新建项目 选择开发板  MCU图形化配置界面总览 MCU配置 新建项目 新建项目包含选择MCU创建项目、选择开发板新建项目和交叉选择MCU新建项目三部分。 1. 选择MCU创建项目 单击主菜单项File→New Project,或Home视图上的ACCESS TO MCU SELECTOR 按钮,都可以打开的New Project from a MCU/MPU对话框。

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6

STM32 HAL CAN通讯 实操

1、简介 相比于串口通讯,对于刚接触CAN通讯的小白来说,CAN通讯相对复杂,看各种视频、帖子理论,总是一知半解。本次通过傻瓜式操作,先实现CAN通讯的交互,以提高小白的信心,也便于自己复习观看。本次以STM32CubeMX进行初始化配置,通过Keil 5软件进行软件设计,通过CAN盒实现进行数据的交互。该流程实际以STM32F0、F1、F3、F4、F7实测好用(理论上都适用),这三种型号单片机

我在高职教STM32——准备HAL库工程模板(1)

新学期开学在即,又要给学生上 STM32 嵌入式课程了。这课上了多年了,一直用的都是标准库来开发,已经驾轻就熟了。人就是这样,有了自己熟悉的舒适圈,就很难做出改变,老师上课也是如此,排斥新课和不熟悉的内容。显然,STM32 的开发,HAL 库已是主流,自己其实也在使用,只不过更换库就意味着教学内容有很大变化,自己也就迟迟没有迈出调整这一步。现在,是时候做出变化了,笔者计划保持教学项

电脑驱动分类

电脑驱动程序(驱动程序)是操作系统与硬件设备之间的桥梁,用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类: 1. 设备驱动程序 显示驱动程序:控制显卡和显示器的显示功能,负责图形渲染和屏幕显示。 示例:NVIDIA、AMD 显示驱动程序。打印机驱动程序:允许操作系统与打印机通信,控制打印任务。 示例:HP、Canon 打印机驱动程序。声卡驱动程序:管理音频输入和输出,与声卡硬件

麒麟系统安装GPU驱动

1.nvidia 1.1显卡驱动 本机显卡型号:nvidia rtx 3090 1.1.1下载驱动 打开 https://www.nvidia.cn/geforce/drivers/ 也可以直接使用下面这个地址下载 https://www.nvidia.com/download/driverResults.aspx/205464/en-us/ 1.1.3安装驱动 右击,