GD25Q32驱动

GD25Q32是一款基于SPI的Flash芯片,容量为32/8=4M bytes。它的引脚如下:

该芯片支持多种SPI操作方式,包括:Standard SPI(标准SPI)Dual SPI(双线 SPI)Quad SPI(四线 SPI) 。有关SPI的介绍可以参考:

SPI通信原理-CSDN博客文章浏览阅读302次,点赞5次,收藏7次。而之所以会有双线SPI和四线SPI的出现,其实主要是因为某些情况下并不需要全双工,但对通信速度有更高的要求,所以对引脚功能做了些调整。但是既然都叫SPI,说明仍然是符合SPI的协议标准的,本次只讲解标准SPI,理解了后感兴趣可以自行研究双线SPI和四线SPI。SPI是一种一主多从的工作模式,不同于IIC,它只有一个主机,读写操作全部由主机发起,从机被动响应。假设CPOL为0,那么在第一个上升沿时,发送方往数据线上发送一位数据,在下降沿时接收方读取一位数据,如此循环8次,一个字节就被发送和接收了。https://blog.csdn.net/u011436603/article/details/136008066其中CS为片选使能脚

SO,WP,SCLK,SI,HOLD为SPI通信引脚,使用标准SPI通信的话,一般只需考虑SCLK,SO和SI就已足够了。

与标准SPI的引脚对应为:

名称标准GD25Q32
片选CSCS#
时钟CLKSCLK
主机发MOSISI(IO0)
主机收MISOSO(IO1)

 GD25Q32属于FLASH,因此和EEPROM不同的是,它无法按字节写入,必须按page去写。擦除的时候可以按扇区或块擦除。每个page有256bytes,注意到每个block可以有32K或64K bytes,这个在后面会影响具体的操作。

接下来直接展示驱动代码,具体解析可以看注释,使用STM32的硬件SPI

//使用spi3读一个字节,用的标准库
unsigned char flash_spi_rchar(void)
{while((SPI3->SR&SPI_I2S_FLAG_TXE)==0) ;SPI3->DR = 0xff;while((SPI3->SR&SPI_I2S_FLAG_RXNE)==0) ;return SPI3->DR;
}//使用spi3写一个字节
void flash_spi_wchar(unsigned char ucChar)
{while((SPI3->SR&SPI_I2S_FLAG_TXE)==0) ;SPI3->DR = ucChar;while((SPI3->SR&SPI_I2S_FLAG_RXNE)==0) ;SPI3->DR;
}

 首先列举一下芯片的默认指令,后面代码中出现的指令可以直接对照参考

继续上代码,主要是读写的驱动函数

unsigned char flash_read_status(void)
{unsigned char ucChar;FLASH_CS_EN;flash_spi_wchar(0x05);     //读取状态;ucChar = flash_spi_rchar();FLASH_CS_DIS;return ucChar;
}void flash_write_trail(unsigned int nAddress,unsigned char* ucData,unsigned int nLength)
{unsigned int i,n;while(flash_read_status()&0x01);        //忙;FLASH_CS_EN;flash_spi_wchar(0x06);                  //写使能;FLASH_CS_DIS;FLASH_CS_EN;flash_spi_wchar(0xd8);                  //擦除BLOCK,按64K擦除;flash_spi_wchar((nAddress>>16)&0xff);   //存储地址flash_spi_wchar((nAddress>>8)&0xff);flash_spi_wchar(nAddress&0xff);FLASH_CS_DIS;while(flash_read_status()&0x01);        //忙for(n=1; (n*256)<=nLength; n++)         //256的倍数,表示按页写{while(flash_read_status()&0x01);    //忙FLASH_CS_EN;flash_spi_wchar(0x06);                  //写使能;FLASH_CS_DIS;FLASH_CS_EN;flash_spi_wchar(0x02);                  //写入数据;flash_spi_wchar(((nAddress+(n-1)*256)>>16)&0xff);flash_spi_wchar(((nAddress+(n-1)*256)>>8)&0xff);flash_spi_wchar((nAddress+(n-1)*256)&0xff);for(i=0; i<256; i++)flash_spi_wchar(*ucData++);FLASH_CS_DIS;}while(flash_read_status()&0x01);        //忙FLASH_CS_EN;flash_spi_wchar(0x06);                  //写使能;FLASH_CS_DIS;FLASH_CS_EN;flash_spi_wchar(0x02);                  //写入数据;flash_spi_wchar(((nAddress+(n-1)*256)>>16)&0xff);flash_spi_wchar(((nAddress+(n-1)*256)>>8)&0xff);flash_spi_wchar((nAddress+(n-1)*256)&0xff);for(i=0; i<(nLength%256); i++)flash_spi_wchar(*ucData++);FLASH_CS_DIS;
}unsigned char flash_read_char(unsigned int nAddress)
{unsigned char ucChar;while(flash_read_status()&0x01);        //忙;FLASH_CS_EN;flash_spi_wchar(0x03);                  //读数据flash_spi_wchar((nAddress>>16)&0xff);   //存储地址flash_spi_wchar((nAddress>>8)&0xff);flash_spi_wchar(nAddress&0xff);ucChar = flash_spi_rchar();FLASH_CS_DIS;return ucChar;
}

以上就是GD25Q32的驱动代码,驱动函数中是按64K擦除的,如果需要按32K擦除,则使用0x52指令即可。

差点忘了,FLASH_CS_EN和FLASH_CS_DIS表示片选使能和失能,即CS引脚的拉高或拉低,由于低电平有效,因此FLASH_CS_EN表示的是引脚拉低。

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

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

相关文章

flutter 文字一行显示,超出换行

因为app有多语言&#xff0c;中文和其他语言长度不一致&#xff0c;可能导致英文会很长。 中文样式 英文样式 代码 Row(mainAxisAlignment: MainAxisAlignment.end,crossAxisAlignment: CrossAxisAlignment.end,children: [Visibility(visible: controller.info.fee ! null,ch…

探寻2024年国内热门低代码平台排行!| 功能特点一览

低代码开发是一项革命性的技术&#xff0c;主要目的是尽量避免程序研发的复杂性&#xff0c;让外行开发者也能加入到应用程序的搭建中。低代码平台的核心概念和构成部分通常包括用户界面和拖拽设计、预构件和模块、自动化工作内容与数据库集成和扩展应用&#xff0c;应用低代码…

U盘弹出提示“该设备正在使用中”:原因与解决方案

在日常使用U盘时&#xff0c;我们可能会遇到一个问题&#xff1a;当尝试安全弹出U盘时&#xff0c;系统提示“该设备正在使用中”。这种情况可能会让用户感到困惑&#xff0c;担心数据是否安全或是否会导致U盘损坏。本文旨在探讨这一现象背后的原因&#xff0c;并提供相应的解决…

【前端素材】推荐优质后台管理系统网页Stisla平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理和控制网站、应用程序或系统的管理界面。它通常被设计用来让网站或应用程序的管理员或运营人员管理内容、用户、数据以及其他相关功能。后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;通常由管理员使…

铅冶炼作业VR虚拟现实互动培训平台降低实操风险

在钢铁工业中&#xff0c;焦炉作业是一个关键的环节&#xff0c;也是一项技术要求高、操作复杂的任务。传统焦炉作业的培训通常需要在实际的焦炉上进行&#xff0c;这不仅对学员的身体素质和心理素质提出了较高的要求&#xff0c;而且也存在一定的安全风险。基于VR虚拟现实制作…

React富文本编辑器开发(三)

现在我们的编辑器显示的内容很单一&#xff0c;这自然不是我们的目标&#xff0c;让呈现的内容多元化是我们的追求。这就需要让编辑器能够接收多元素的定义。从初始数据的定义我们可以推断数据的格式远不止一种&#xff0c;那么其它类型的数据如何定义及呈现的呢&#xff0c;我…

手把手教你免费用Flashduty做消息通知

为什么需要消息通知&#xff1f; 如果有重要的情况发生&#xff0c;希望能通过各种媒介通知我们。可以举几个例子&#xff1a; 家里燃气费没有了&#xff0c;希望能有短信或者app通知api频繁500报错&#xff0c;希望及时感知&#xff0c;及时修复公司网站是https自签名证书&a…

白话大模型① :AI分析能做什么?在实际落地中会碰到什么问题?

白话大模型系列共六篇文章&#xff0c;将通俗易懂的解读大模型相关的专业术语。本文为第一篇&#xff1a;AI分析能做什么&#xff1f;在实际落地中会碰到什么问题&#xff1f; 作者&#xff1a;星环科技 人工智能产品部 我们使用一个简单的应用实例来解析人工智能分析都在做什…

若依框架使用mars3d的环境配置,地球构建

因项目需要&#xff0c;原本使用过的cesium依赖&#xff0c;现在想使用火星科技mars3d的一些功能&#xff0c;所以需要引入mars3d依赖&#xff0c;整个过程非常的坎坷&#xff0c;以至于我都不知道到底是哪些部分是标准的。。。先把我认为对的记录一下&#xff1a; 1.vue.conf…

sqlserver保存微信Emoji表情

首先将数据库字段&#xff0c;设置类型为 nvarchar(200)一个emoji表情&#xff0c;占4字节就可以了&#xff0c;web前端展示不用改任何东西&#xff0c;直接提交数据保存&#xff1b;回显也会没有问题&#xff0c;C#代码不用做任何处理&#xff1b; 不哭不闹要睡觉&#x1f31…

【机器学习300问】24、模型评估的常见方法有哪些?

一、为什么要对模型进行评估&#xff1f; 对机器学习和神经网络的模型进行评估是至关重要的&#xff0c;原因如下&#xff1a; 得知模型的泛化能力 模型评估的主要目的是了解模型在未见过的数据上的表现&#xff0c;即其泛化能力。这是因为模型的性能在训练数据上可能会过拟合…

构建大语言模型的四个主要阶段

大规模语言模型的发展历程虽然只有短短不到五年的时间&#xff0c;但是发展速度相当惊人&#xff0c;国内外有超过百种大模型相继发布。中国人民大学赵鑫教授团队在文献按照时间线给出 2019 年至 2023 年比较有影响力并且模型参数量超过 100 亿的大规模语言模型。大规模语言模型…

LangFlow——一款可轻松实验和原型化 LangChain流水线的AI项目

LangFlow——一款可轻松实验和原型化 LangChain流水线的AI项目。 前言 在人工智能兴起的当下&#xff0c;AI正在重塑着很多行业。今天介绍的是一款近期登上github热门的一款可轻松实验和原型化 LangChain[1] 流水线的AI项目—LangFlow。 Flowise——通过拖放界面构建定制的LLM…

Flask学习笔记

不论POST请求还是GET请求都支持在 URL 中添加变量&#xff0c;可以选择性的加上一个转换器&#xff0c;为变量指定数据类型。 history_alarm.route(/test/<int:post_id>, methods[POST]) def test(post_id):print(f"参数类型为&#xff1a;{type(post_id)}")i…

VUE3中的组件传值

一、父传子(props) 在子组件中可以使用defineProps接收父组件向子组件的传值 父组件fatherPage.vue&#xff1a; <template><div class"father"><button click"a a 1">按钮</button><childPage :a"a" /><…

Nginx 隐藏版本信息和logo

1.隐藏版本信息 http {### 隐藏版本号 server_tokens off; } 2.隐藏图标 2.1 cd nginx 安装的路径 cd/XXXX/nginx-1.2.0 2.2 编辑文件 vim src/core/nginx.h 修改define nginx_ver 中的内容 vim src/http/ngx_http_special_response.c 修改 u_char ngx_http_error_tail[]…

java 基础(核心知识搭配代码)

前言 java的学习分为了上部分以及下部分进行学习&#xff0c;上部分就是对于java的基础知识&#xff0c;面向对象上&#xff0c;面向对象下&#xff0c;异常操作&#xff0c;javaApi&#xff1b;下部主要是集合&#xff0c;泛型&#xff0c;反射&#xff0c;IO流&#xff0c;J…

Grid-Based Continuous Normal Representation for Anomaly Detection 论文阅读

Grid-Based Continuous Normal Representation for Anomaly Detection 论文阅读 摘要简介方法3.1 Normal Representation3.2 Feature Refinement3.3 Training and Inference 4 实验结果5 总结 文章信息&#xff1a; 原文链接&#xff1a;https://arxiv.org/abs/2402.18293 源码…

【MIT 6.S081】2020, 实验记录(6),Lab: Copy-on-Write Fork

目录 Task: Implement copy-on writestep 1&#xff1a;对内存块进行引用计数step 2&#xff1a;uvmcopy 实现 fork 时将 parent 的物理页映射到 child 中step 3&#xff1a;在 usertrap 中增加对 page fault 的处理执行测试 官方说明&#xff1a;Lab: Copy-on-Write Fork for …

C++进阶-- map和set

关联式容器 在前面&#xff0c;我们所学的vector、list、deque&#xff0c;这些都是序列容器&#xff0c;也就是底层为线性序列的数据结构。 而关联式容器是C标准库中的一种类别&#xff0c;用于存储键值对&#xff08;key-value pair&#xff09;&#xff0c;关联式容器中的元…