STM32-HAL-SPI-W25Q128FV简单读写测试(2)

news2024/12/23 9:52:06

文章目录

  • 一、Flash的基本读写操作
    • 1.1 向芯片中的某个地址(addr:0x02)连续写入不定长的数据并读取
      • 代码示例
      • 读写流程分析
      • 函数分析
    • 1.2 向芯片中的某个地址(addr:0x00)写入一个数值
      • 代码示例:
      • 读写流程分析

具体的配置接上文STM32-HAL-SPI-读写W25Q128FV-JEDEC ID(1)

为了要进行芯片的读写操作,因此要先了解一下芯片的相关读写指令。

  • 芯片相关的读写指令
0x50允许写状态寄存器的命令0x05读状态寄存器命令
0x01写状态寄存器命令0x9F读器件JEDEC ID命令
0x06写使能命令0x20擦除扇区命令
0x03读数据区命令0xC7批量擦除命令
0xA5哑命令,可以为任意值,用于读操作0x01状态寄存器中的正在编程标志(WIP)

一、Flash的基本读写操作

本次擦写测试非全片擦写,仅仅使用划定大小进行擦写

读写测试地址TEST_ADDR0
读写测试划定大小TEST_SIZE4*1024
连续擦写起始地址0x02
读写一个数值地址0x00

1.1 向芯片中的某个地址(addr:0x02)连续写入不定长的数据并读取

void falsh_Read_Write_Test(void)

向flash芯片写入一串不定长的数据
存储的时候类型都是以字符或者数字

代码示例

void falsh_Read_Write_Test(void)
{	
	uint8_t i;
	uint8_t CMP_Flag = 1;
	
	uint8_t Tx_Buffer[] = "HelloWorld";  
	const uint8_t BufferSize  = sizeof(Tx_Buffer)/sizeof(Tx_Buffer[0]);//要写入的数据长度
	uint8_t Rx_Buffer[BufferSize];//缓冲区的大小是待定的
	
	/*擦除1个扇区 全部写为0xFF 即全部的bit刷为1*/
	sf_EraseSector(0x00000000);  /*可以不写,因为后面的sf_WriteBuffer自动写前擦除*/
	/*向目标地址写入数据*/
	sf_WriteBuffer(Tx_Buffer,0x02,BufferSize);
	printf("写入的数据为:%s 写入数据的大小为:%d \r\n", Tx_Buffer,BufferSize);
	/*读出目标地址的数据*/
	sf_ReadBuffer(Rx_Buffer,0x02,BufferSize);
	printf("读出的数据为:%s\r\n", Rx_Buffer);
	
	/*比较目标地址和待读取地址数据*/
	for(i=0;i<BufferSize;i++)
	{
		if(Tx_Buffer[i] != Rx_Buffer[i])
		{
			CMP_Flag = 0;
			break;
		}
	}
	
	if(CMP_Flag == 1)
		printf("恭喜,Falsh芯片读写不定长数据测试成功!\r\n");
	else
		printf("What?Falsh芯片读写不定长数据测试失败!\r\n");
	
	HAL_Delay(1000);	
    
    sfReadTest();	/* 读串行Flash数据,并打印出来数据内容 */
}
  • 打印出来的数据:
[result]
FF FF 48 65 6C 6C 6F 57 6F 72 6C 64 00 FF FF FF -  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
... ... (省略很多的FF)
 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
数据长度: 4096字节, 读耗时: 3ms, 读速度: 1365333 Bytes/s   
  • 执行扇区擦写,全部擦写为0xFF,即将每一个比特位写入1,因此可以看到全部都是FF
  • 执行写的地址是从0x02开始的,因此可以看到第三位的数据才改变
  • 后面连续的11字节写入预设的字符串
  • 但是最后一位补了\0,因为字符数组在最后是自动补0

读写流程分析

  1. 定义一个比较标志(CMP_Flag)并初始化为1,用于比较目标地址和待读取地址数据是否一致。
  2. 定义一个要写入的字符串 Tx_Buffer,并通过 sizeof(Tx_Buffer)/sizeof(Tx_Buffer[0]) 获取其长度 BufferSize
  3. 调用 sf_EraseSector 函数对存储器中的指定扇区进行擦除。
  4. 调用sf_WriteBuffer函数将Tx_Buffer写入存储器的指定地址。
  5. 调用 sf_ReadBuffer 函数从存储器的指定地址读取数据到 Rx_Buffer
  6. 使用 for 循环比较 Tx_BufferRx_Buffer 中的数据是否一致,如果存在不一致的情况,则将 CMP_Flag 置为0。
  7. 最后根据 CMP_Flag 的值输出测试结果,如果一致则输出 “恭喜,Falsh芯片读写不定长数据测试成功!” 否则输出“What?Falsh芯片读写不定长数据测试失败!”。

函数分析

sf_EraseSector(0x00000000);  /*可以不写,因为后面的sf_WriteBuffer自动写前擦除*/
  • 扇区擦写函数,可以一次性擦除4K字节的空间,地址为扇区的起始地址,一般设置为4的倍数,如0x0000擦除扇区1 0x2000擦除扇区2。

在这里插入图片描述

擦除一个扇区,256个字节

sf_WriteBuffer(Tx_Buffer,0x02,BufferSize);
  • 连续向空间中的某个地址写入一系列数据的函数,这个函数自带擦写功能即在写之前便会自己进行擦写。

在这里插入图片描述

按位置连续写入

在这里插入图片描述

写入的11个字节数据放大图
sfReadTest();	
  • 读测试函数,可以将测试区域按字节打印到终端。

1.2 向芯片中的某个地址(addr:0x00)写入一个数值

void falsh_Read_Write_OneData_Test(void)

向Flash芯片写入一个数值,由于Flash的一个字节有8位,因此就是存储一个值的范围是0~255

代码示例:

void falsh_Read_Write_OneData_Test(void)
{	
	#define n 4  //测试用,指定一个字节
	
	uint8_t WriteData[5] = {12,13,14,15,16};  
	uint8_t ReadData = 0;  
	
	/*擦除扇区*/
	sf_EraseSector(0x00000000);  //要求地址为4的倍数 
	/*向目标地址写入数据*/
	sf_WriteBuffer(&WriteData[n],0x00,1);
	printf("写入的数据为:%d 写入数据的大小为:%d \r\n", WriteData[4],1);
	/*读出目标地址的数据*/
	sf_ReadBuffer(&ReadData,0x00,1);
	printf("读出的数据为:%d \r\n", ReadData);	
	
	if(ReadData == WriteData[n])
		printf("恭喜,Falsh芯片单个数字读写测试成功!\r\n\r\n\r\n");
	else
		printf("What?Falsh芯片单个数字读写测试失败!\r\n\r\n\r\n");
	
	HAL_Delay(1000);	
	
	sfReadTest();	/* 读串行Flash数据,并打印出来数据内容 */
}
  • 查看Flash的读写情况
10 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
 ... ... (省略很多的FF)
 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
数据长度: 4096字节, 读耗时: 3ms, 读速度: 1365333 Bytes/s
  • 执行扇区擦写,全部擦写为0xFF,即将每一个比特位写入1,因此可以看到全部都是FF
  • 执行写的地址是从0x00开始的,因此可以看到仅仅第一字节的数据改变

读写流程分析

  1. 定义一个测试用的字节数 n,用于指定待写入的数据。
  2. 定义一个长度为 5 的 WriteData 数组,并将其第 n 个元素赋值为 12,13,14,15,16。
  3. 调用 sf_EraseSector 函数对存储器中的指定扇区进行擦除。
  4. 调用sf_WriteBuffer函数将 WriteData[n] 写入存储器的指定地址。
  5. 调用 sf_ReadBuffer 函数从存储器的指定地址读取数据到ReadData
  6. 比较 ReadDataWriteData[n]是否相等,如果相等则输出“恭喜,Falsh芯片单个数字读写测试成功!”,否则输出“What?Falsh芯片单个数字读写测试失败!”。

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

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

相关文章

react native ios 添加启动页 xcode14

最近更新xcode&#xff0c;有些配置有些不同&#xff0c;网上查的方法都是过时的&#xff0c;导致配了一段时间卡在这里&#xff0c;最后访问官网才弄好了&#xff0c;所以以后解决问题的办法先看官网再查其他各路神仙的办法。 官网的步骤&#xff1a;https://github.com/crazy…

MAC 查看已装载的卷宗

查看卷宗目录命令 ls /Volumes网络卷宗&#xff1a;本机、系统报告。 参考资料&#xff1a;https://blog.csdn.net/qq_41731201/article/details/125407204

建筑行业如何进行高效管理文件?

建筑设计行业在日常办公中会产出大量文件&#xff0c;如设计图纸协作商议&#xff0c;项目资料等&#xff0c;建筑行业该如何高效管理文件呢&#xff1f; 建筑设计行业团队可能遇到的文件管理问题&#xff1a; 1&#xff0c;设计图纸一般较大&#xff0c;来回传输不仅麻烦&…

【矩阵快速幂 | 斐波那契数列 | 矩阵加速】

文章目录 基础知识1. 矩阵结构2. 重载 * 运算符3. 矩阵快速幂 例题1&#xff1a; 矩阵幂求和例题2&#xff1a; 矩阵快速幂例题3&#xff1a; 斐波那契数列例题4&#xff1a; 矩阵加速例题5&#xff1a; 广义斐波那契例题6&#xff1a; 斐波那契公约数例题7&#xff1a; 这个勇…

设计模式——设计模式介绍和单例设计模式

目录 一、设计模式概述和分类 1.1 设计模式介绍 1.2 设计模式分类 二、创建型设计模式-单例模式 2.1 介绍 2.2 八种单例模式的创建方式 2.2.1 饿汉式&#xff08;静态常量&#xff09; 2.2.2 饿汉式&#xff08;静态代码块&#xff09; 2.2.3 懒汉式&#xff08;线程…

TCP/IP协议基础

1.TCP/IP模型的分层 网络接口层&#xff08;Network Interface Layer&#xff09;&#xff1a;&#xff08;数据链路层&#xff09; 功能&#xff1a; ①将数据帧发送到物理网络&#xff0c;并从物理网络接收数据帧。 ②处理硬件地址&#xff0c;如MAC地址。 主要协议&#xff…

[独家]自动播放K线图训练盘感能力!股票量化分析工具QTYX-V2.3.5

K线量价的重要性 K线图对炒股的朋友来说太熟悉不过了&#xff0c;每一根K线包含了开盘价、收盘价、最高价和最低价这四个价位信息&#xff0c;分别用红和绿两种颜色来表示上涨或下跌&#xff0c;反映了单位时间周期内价格变动的情况。 不过K线的功效可不仅仅用来记录价格的变动…

Linux信号:信号 信号集 信号集函数

1. 信号的概念 Linux进程间通信的方式之一。信号也称为“软件中断”。 信号特点&#xff1a; 简单&#xff1b;携带信息有限&#xff1b;满足特定条件才发送信号&#xff1b;可进行用户空间和内核空间进程的交互&#xff1b; 信号4要素&#xff1a; &#xff08;1&#xf…

根据Java的TreeMap源码的原理编写C++红黑树删除操作

&#xff08;一&#xff09;了解二叉搜索树的删除操作 删除操作总结&#xff1a; ******普通结点删除&#xff1a;******* ①删除叶结点 ②删除只有1个子结点的结点 >>如果被删除结点的左子树为空&#xff0c;则令其右子树子承父业代替其位置即可 >>如果被删除结点…

JPA整合达梦数据库

陈老老老板&#x1f9b8; &#x1f468;‍&#x1f4bb;本文专栏&#xff1a;国产数据库-达梦数据库&#xff08;主要讲一些达梦数据库相关的内容&#xff09; &#x1f468;‍&#x1f4bb;本文简述&#xff1a;本文讲一下SpringBoot整合JPA与达梦数据库&#xff0c;就是简单&…

《算法工程师带你去》读书笔记

什么是稀疏向量&#xff08;向量的稀疏表示&#xff09; 对数据进行预处理时&#xff0c;一般需要对类别型特征进行编码&#xff1a; 序号编码独热编码 二进制编码 其中独热编码用的是最多的。但是当类别数十分巨大时&#xff0c;独热编码是一个非常稀疏的向量&#xff0c;只有…

IDEA(八)常用插件推荐

目录 1.GitHub Copilot2.MyBatisCodeHelperPro3.Maven Helper4.Translation5.Api Savior6.Alibaba Java Coding Guidelines7.Sequence Diagram8.Key Promoter X9.Restfultoolkit-fix 在IDEA中&#xff0c;Ctrl Alt S 选择 Plugins&#xff0c;可以添加很多帮助我们开发的插件…

Arduino串口提取数字(整型和浮点型)

数据提取 文章目录 数据提取前言一、提取整型数据二、提取浮点型数据 前言 之前需要用32和ESP进行通信上传数据&#xff0c;一直都用的都是数据上传然后处理成整型数据&#xff0c;今天需要处理成浮点型数据所以就查了一下&#xff0c;于是就记录一下。 一、提取整型数据 #i…

〖Python网络爬虫实战⑳〗- 数据存储之CSV操作实战

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…

JDBC数据库连接技术学习笔记

1. 概述 本笔记是学习尚硅谷教育的23版jdbc的课后笔记 1.1 JDBC概念和理解 1. jdbc是(Java Database Connectivity)单词的缩写,翻译为java连接数据库 2. jdbc是java程序连接数据库的技术统称 3. jdbc由java语言的规范(接口)和各个数据库厂商的实现驱动(jar)组成 4. jdbc是一…

Mysql 判断语句

目录 5 判读 5.1 if ... then ...->示例演示 局部变量 -> 打包储存过程 5.2 case 5.2.1 语法一 5.2.2 语法二 -> 示例演示 5.3 while 循环 ->有条件循环 5.3.1 示例演示 5.4 repeat 循环 -> 满足条件 -> 退出循环 5.4.1 示例演示 5.5 loop 5.5.1…

【c语言小项目】基于easyX的俄罗斯方块

EeayX是针对 C/C 的简单图形库插件&#xff0c;本项目基于easyX游戏框架下实现俄罗斯方块游戏。 俄罗斯方块功能实现中主要运用了二维数组的循环遍历。能够实现基本功能&#xff0c;暂未实现旋转 c语言系列专栏&#xff1a;c语言之路重点知识整合 更多相关&#xff1a;c语…

AI VS 好莱坞?新时代电影工作流;MJ制作微信表情包的麻瓜教程;关于ControlNet的一切;AI创业真钱景 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『OpenAI通过了一大批GPT-4申请』大量放号ing~快去看邮箱&#xff01; &#x1f916; 『小马智行 | 广州南沙区开启车内无安全员的自动…

opencv-python加载pytorch训练好的onnx格式线性回归模型

opencv是一个开源的图形库&#xff0c;有针对java,c,python的库依赖&#xff0c;它本身对模型训练支持的不好&#xff0c;但是可以加载其他框架训练的模型来进行预测。 这里举一个最简单的线性回归的例子&#xff0c;使用深度学习框架pytorch训练模型&#xff0c;最后保存模型为…

【软考备战·希赛网每日一练】2023年4月28日

文章目录 一、今日成绩二、错题总结第一题第二题第三题 三、知识查缺 题目及解析来源&#xff1a;2023年04月28日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; 大体了解即可&#xff0c;题目要考察的核心意思&#xff1a;确定的有限自动机和不确定的…