【STM32 CubeMX】SPI W25Q64功能实现

news2024/12/26 21:58:43

文章目录

  • 前言
  • 一、内部函数的实现
    • 1.1 选中和取消选中SPI Flash
    • 1.2 写使能函数
    • 1.3 获取读状态
    • 1.4 等待就绪状态
  • 二、Flash读写函数实现
    • 2.1 读Flash ID
    • 2.2 擦除某个扇区
    • 2.3 写扇区
    • 2.4 读数据
  • 三、测试代码
  • 总结


前言

SPI Flash 存储器在嵌入式系统中扮演着重要角色,它可以为微控制器提供额外的存储空间,并且具有快速的读写速度和较大的存储容量。W25Q64 是一款常见的 SPI Flash 存储器,容量为64Mb,采用 SPI 接口进行通信。在 STM32 微控制器上实现对 W25Q64 的功能使用,可以通过 STM32 CubeMX 和相关的库函数轻松完成。本文将介绍如何利用 STM32 CubeMX 和 SPI 库来实现对 W25Q64 的基本功能。


一、内部函数的实现

1.1 选中和取消选中SPI Flash

当CS引脚为GPIO_PIN_RESET为选中该设备,当CS引脚为GPIO_PIN_SET表示取消选中该设备,所以这个函数非常好实现,只需要使用HAL_GPIO_WritePin函数进行写pin即可

static void SPIFlash_Select(void)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET);
}

static void SPIFlash_DeSelect(void)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET);
}

1.2 写使能函数

如果你需要写使能,你只需要发送命令0x06即可,你可以使用查询方式来发送,也可以使用中断函数来发送。
在发送命令的时候,你需要选中该Flash设备,当你写完命令后,需要取消选中Flash设备。
在这里插入图片描述
我们可以这样实现他:

static volatile int g_spi1_tx_complete = 0;
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
	if(hspi == &hspi1)
	{
		g_spi1_tx_complete = 1;
	}
}

void Wait_SPI_TxCplt(int timeout)
{
	while(g_spi1_tx_complete == 0 && timeout--)
	{
		HAL_Delay(1);
	}
	g_spi1_tx_complete = 0;
}

static int SPIFlash_WriteEnable(void)
{
	uint8_t buf[1] = {0x06};
	SPIFlash_Select();
	HAL_SPI_Transmit_IT(&hspi1,buf,1);
	Wait_SPI_TxCplt(SPI_FLASH_TIMEOUT);
	SPIFlash_DeSelect();
}

1.3 获取读状态

当我们擦除扇区或者写扇区的时候,他并不是发送数据完成,这个数据就写进去的,我们需要等待他内部编程完。我们可以使用命令,把里面的状态拿出来
在这里插入图片描述
在这里,我们需要发送2个命令,但是有用的只有命令1(发送的命令为0x05),因为发送了2个命令,所以我们需要接收两个数据,但是有用的只有接收到的数据2。

static volatile int g_spi1_txrx_complete = 0;
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
{
	if(hspi == &hspi1)
	{
		g_spi1_txrx_complete = 1;
	}
}

void Wait_SPI_TxRxCplt(int timeout)
{
	while(g_spi1_txrx_complete == 0 && timeout--)
	{
		HAL_Delay(1);
	}
	g_spi1_txrx_complete = 0;
}

static int SPIFlash_ReadStatus(void)
{
		uint8_t txbuf[2] = {0x05,0xff};
		uint8_t rxbuf[2] = {0,0};
		SPIFlash_Select();
		HAL_SPI_TransmitReceive_IT(&hspi1, txbuf, rxbuf, 2);
		Wait_SPI_TxRxCplt(SPI_FLASH_TIMEOUT);
		SPIFlash_DeSelect();
		
		return rxbuf[1];
}

1.4 等待就绪状态

所谓的等待就绪状态其实就是当SPIFlash_ReadStatus函数&上1他还是等于1,就代表擦除扇区或者写扇区已经完成了

static int SPIFlash_WaitReady(void)
{
	while(SPIFlash_ReadStatus() & 1 == 1);
}

二、Flash读写函数实现

2.1 读Flash ID

读Flash ID可以让我们知道这个SPI Flash是否有用
和前面的获取读状态一样。在这里,我们需要发送2个命令,但是有用的只有命令1(发送的命令为0x9F),因为发送了2个命令,所以我们需要接收两个数据,但是有用的只有接收到的数据2。

int SPIFlash_ReadID(void)
{
	uint8_t txbuf[2] = {0x9F,0xff};
	uint8_t rxbuf[2] = {0,0};
	
	SPIFlash_Select();
	HAL_SPI_TransmitReceive_IT(&hspi1, txbuf, rxbuf, 2);
	Wait_SPI_TxRxCplt(SPI_FLASH_TIMEOUT);
	SPIFlash_DeSelect();
	
	return rxbuf[1];
}

当rxbuf[1]的值为0xEF时,代码这个SPI Flash没有问题

2.2 擦除某个扇区

首先,我们要发送命令加上3个字节的地址,所以我们需要4字节的buf
如果你想擦除某个扇区,你需要使用0x20命令。
接下来,我们往buf的后3字节填充地址,地址是先发高位再发低位的。
再完成发送之后,我们还需要等待就绪,即调用SPIFlash_WaitReady函数

int SPIFlash_EraseSector(uint32_t addr)
{
	SPIFlash_WriteEnable();
	
	uint8_t txbuf[4] = {0x20};
	
	txbuf[1] = addr>>16 & 0xff;
	txbuf[2] = addr>>8 & 0xff;
	txbuf[3] = addr>>0 & 0xff;
	
	SPIFlash_Select();
	HAL_SPI_Transmit_IT(&hspi1,txbuf,4);
	Wait_SPI_TxCplt(SPI_FLASH_TIMEOUT);
	SPIFlash_DeSelect();
	
	SPIFlash_WaitReady();
	
	return 0;
}

2.3 写扇区

写操作在发送命令+地址的和我们的擦除某个扇区的是一样的,只不过我们的写扇区的命令为0x02
再发送完命令+地址之后,我们就可以直接调用HAL库的发送函数进行datas的发送即可。

int SPIFlash_Write(uint32_t addr,uint8_t *datas,uint32_t len)
{
	SPIFlash_WriteEnable();
	
	uint8_t txbuf[4] = {0x02};
	
	txbuf[1] = addr>>16 & 0xff;
	txbuf[2] = addr>>8 & 0xff;
	txbuf[3] = addr>>0 & 0xff;
	
	SPIFlash_Select();
	HAL_SPI_Transmit_IT(&hspi1,txbuf,4);
	Wait_SPI_TxCplt(SPI_FLASH_TIMEOUT);
	
	HAL_SPI_Transmit_IT(&hspi1,datas,len);
	Wait_SPI_TxCplt(SPI_FLASH_TIMEOUT);
	
	SPIFlash_DeSelect();
	
	SPIFlash_WaitReady();
	
	return 0;
}

2.4 读数据

读操作在发送命令+地址的和我们的擦除某个扇区的是一样的,只不过我们的写扇区的命令为0x03
在写完上面这些数据之后,我们需要等待写完,接下来我们就可以去调用HAL库的读SPI函数了

static volatile int g_spi1_rx_complete = 0;

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
	if(hspi == &hspi1)
	{
		g_spi1_rx_complete = 1;
	}
}

void Wait_SPI_RxCplt(int timeout)
{
	while(g_spi1_rx_complete == 0 && timeout--)
	{
		HAL_Delay(1);
	}
	g_spi1_rx_complete = 0;
}

int SPIFlash_Read(uint32_t addr,uint8_t *datas,uint32_t len)
{
	uint8_t txbuf[4] = {0x03};
	
	txbuf[1] = addr>>16 & 0xff;
	txbuf[2] = addr>>8 & 0xff;
	txbuf[3] = addr>>0 & 0xff;
	
	SPIFlash_Select();
	HAL_SPI_Transmit_IT(&hspi1,txbuf,4);
	Wait_SPI_TxCplt(SPI_FLASH_TIMEOUT);
	
	HAL_SPI_Receive_IT(&hspi1,datas,len);
	Wait_SPI_RxCplt(SPI_FLASH_TIMEOUT);
	
	SPIFlash_DeSelect();
	
	return 0;
}

三、测试代码

char *str = "www.csdn.net\r\n";
	
r = SPIFlash_ReadID();
SPIFlash_EraseSector(4096);
SPIFlash_Write(4096,(uint8_t*)str,strlen(str)+1);
SPIFlash_Read(4096,(uint8_t*)flash_buf,20);

总结

通过本文的介绍,我们了解了如何在 STM32 CubeMX 中配置并利用 SPI 库来实现对 W25Q64 SPI Flash 存储器的功能。首先,我们通过 CubeMX 配置了 STM32 的 SPI 外设,包括时钟分频、数据大小、模式等参数。然后,我们编写了初始化代码,将 SPI 外设与 W25Q64 进行连接,并实现了基本的读写功能。在编写代码时,我们充分利用了 STM32 的 HAL 库提供的函数,简化了通信过程的实现。最后,我们在主函数中调用了相应的读写函数,并通过调试工具验证了功能的正确性。通过本文的学习,读者可以掌握在 STM32 微控制器上使用 CubeMX 和 SPI 库来实现对 W25Q64 SPI Flash 存储器的功能,为嵌入式系统的开发提供了便利。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1452764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

各类有关于花卉的深度学习数据集

花卉的识别和分类在深度学习过程中是最常见的使用的案例,因此各类有关花卉分类、识别、计数的图像数据集是大家都常用的数据集。最近收集到各类有关花卉的各类数据集分享给大家!! 1、16种花常见的图像数据集 数据说明:我们看到我…

数据库设计、JDBC、数据库连接池

数据库设计 数据库设计概念 数据库设计就是根据业务 系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。建立数据库中的表结构以及表与表之间的关联关系的过程。有哪些表?表里有哪些字段?表和表之间有什么关系? 数据库设计的步骤…

企业计算机服务器中了faust勒索病毒怎么办?Faust勒索病毒解密数据恢复

网络技术的不断发展与更新,为企业的生产运营提供了极大便利,但也为企业的数据安全埋下隐患。近期,云天数据恢复中心接到很多企业的求助,企业的计算机服务器遭到了faust勒索病毒攻击,给企业的生产运营带来了极大困扰&am…

使用新的 AI 工具和生产力工具提升 Windows 上的开发人员体验

随着 9 月 26 日最新的 Windows 11 更新,我们发布了一系列开发人员功能作为 Windows 操作系统的核心组件,旨在提高每个开发人员在 Windows 上的工作效率。今天,我们很高兴地宣布推出 Windows AI Studio,这是一种新的 AI 体验&…

SCI文章复现 | GEO文章套路,数据下载和批次效应处理

原文链接: SCI文章复现 | GEO文章套路,数据下载和批次效应处理https://mp.weixin.qq.com/s/KBA67EJ7cCK5NDTUzrwJ2Q 一、前言 这是2024年春节后的第一个推送教程,我们也给大家赠送一个福利。将前期的付费教程免费推送给大家。其实&#xff…

关于Build Your Own Botnet的尝试

这是一次失败的尝试、 原文地址:关于Build Your Own Botnet的尝试 - Pleasure的博客 下面是正文内容: 前言 我在上一篇关于DDOS的文章种提到过这个项目,而且说明了由于这个项目是在2020年发布并开源的,并且已经有两年没有进行跟…

C++入门学习(二十八)跳转语句—continue语句

当在循环中遇到continue语句时,它会跳过当前迭代剩余的代码块,并立即开始下一次迭代。这意味着continue语句用于跳过循环中特定的执行步骤,而不是完全终止循环。 直接看一下下面的代码更清晰: 与上一节的break语句可以做一下对比…

spring boot3登录开发-2(1图形验证码接口实现)

⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途。 目录 前置条件 内容简介 图形验证码接口实现 导入糊涂工具依赖 接口分析 编写验证码接口 测试验证码接口 前置条件 …

【MySQL进阶之路】MySQL中到底为什么会出现幻读?

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复 「资料」 可领取编程高频电子书! 在我后台回复「面试」可领取硬核面试笔记! 文章导读地址…

第六篇【传奇开心果系列】Python微项目技术点案例示例:庖丁解牛tkinter.ttk库gui界面编程

传奇开心果微博系列 系列微博目录Python微项目技术点案例示例系列 微博目录前言一、主窗口和子窗口创建和切换,以员工信息管理系统示例代码二、主窗口添加有菜单项图标的菜单栏、工具栏和右键菜单示例代码三、使用sqlite3数据库增删改查管理员工信息示例代码四、在主…

从物联网到数字孪生:智慧社区的演变

随着科技的飞速发展和数字化转型的深入推进,智慧社区已成为提升城市治理水平和居民生活质量的重要方向。在这一演变过程中,物联网和数字孪生技术起到了至关重要的作用。本文将深入探讨从物联网到数字孪生的演变过程,分析这一转变对智慧社区建…

FL Studio 21中文破解激活版2024免费下载安装图文教程

FL Studio 21.2.1.3859中文破解激活版是我见过更新迭代最快的宿主软件,没有之一。FL Studio12、FL Studio20、FL Studio21等等。有时甚至我刚刚下载好了最新版本,熟悉了新版本一些好用的操作,Fl Studio就又推出了更新的版本,而且F…

基于springboot大学生租房系统源码和论文

伴随着全球信息化发展,行行业业都与计算机技术相衔接,计算机技术普遍运用于各大行业,大学生租房系统便是其中一种。实施计算机系统来管理可以降低大学生租房管理的成本,使整个大学生租房的发展和服务水平有显著提升。 本论文主要面…

知识图谱:py2neo导入周杰伦歌单csv文件

文章目录 py2neo导入csv文件py2neo导入周杰伦歌单csv效果展示 py2neo导入csv文件 之前写的知识图谱指南 知识图谱:py2neo将csv文件导入neo4j 因为没有区分不同实体entity的类型,所以颜色相同,无法相互区分歌手、歌曲还是专辑等等。 py2ne…

解决STM32MP157开发板密码登录问题

开发板密码登录问题是很多人遇到的问题,网上有很多帖子,我也参考过,不太适用,很复杂,甚至会被误导,我差点连ubuntu虚拟机都无法登录了。有的密码匹配,有的取消不了密码。 1、密码配置&#xff…

恒流模块与常用电容

户外电源电芯:DJ采用无热中心设计:每个电芯都有一部分裸露在外面,保证良好散热上 固态电容相较于普通电解电容具有更高的电气性能、更长的使用寿命和更稳定的温度特性,但成本也相对较高。固态电容在1块左右,电解电容在…

import tensorflow_hub报错

问题: 导入tensorflow_hub报ModuleNotFoundError: No module named ‘tensorflow.python.checkpoint’ 解决: tensorflow-estimator版本不对 和tensorflow(2.6.0)版本一致 。 pip install -U tensorflow-estimator2.6.0 验证&a…

无线充电 线圈设计

本文所讨论参数,均有论文,仿真和实测支撑,也欢迎感兴趣的小伙伴一起讨论。 有个笑话,说是18年无线充白牌热销的时段,单片机没赚到钱,壳料没赚到钱,pcba也没赚到钱,钱都被卖NP0电容和…

Codeforces Round 926 (Div. 2) B. Sasha and the Drawing (Java)

Codeforces Round 926 (Div. 2) B. Sasha and the Drawing (Java) 比赛链接:Codeforces Round 926 (Div. 2) B题传送门:B. Sasha and the Drawing 题目:B. Sasha and the Drawing Example input 3 4 3 3 3 10 3 9 4 7 7 11 2 3output 2 …

挑战杯 YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快,YOLOv6还没用熟YOLOv7就来了,如果有同学的毕设项目想用上最新的技术,不妨看看学长的这篇文章,学长带大家简单的…