当前位置: 首页 > news >正文

嵌入式——Flash(W25Q64)

目录

一、初识W25Q64

1. 基本认识

2. 引脚介绍

​编辑

二、W25Q64特性

1. SPI模式

2. 双输出SPI方式

三、状态寄存器

1. BUSY位

2. WEL位

3. BP2、BP1、 BP0位

4. TB位

5. 保留位

6. SRP位

四、常用操作指令

1. 写使能指令(06h)

2. 写禁止指令(04h)

3. 读状态寄存器指令(05h)

4. 写状态寄存器指令(01h)

5. 读数据指令(03h)

五、相关代码

1. W25Q64的常用操作驱动。

2. 工程地址


一、初识W25Q64

1. 基本认识

        W25Q64是华邦公司推出的大容量 基于SPI通信 的FLASH 产品,工作电压为 2.7~3.6V,存储容量为 64Mb(8MB),擦写周期可达 10万次,数据保存时间可达 20年。 W25Q64系列 Flash存储器与 普通串行Flash存储器 相比,其使用 更灵活、性能更出色,非常 适合用于存储声音、文本和数据

        W25Q64 有 32768个 可编程页,每页 256字节

        使用 页编程指令 就可以 每次编程 256字节。

        使用 扇区擦除指令 可以 每次擦除 256字节。

        使用 块擦除指令 可以 每次擦除 256 页。

        使用 整片擦除指令 可以 擦除整个 芯片。

        W25Q64 共有 2048个可擦除扇区(一个大小 4096字节) 或 128个 可擦除块

2. 引脚介绍

        W25Q16、 W25Q32 和 W25Q64 支持标准的 SPl接口,传输速率最大 75 MHz,采用四线制,即4个引脚。

    ① 串行 时钟引脚 (CLK)

    ② 芯片 选择引脚 (CS)

    ③ 串行数据 输出引脚(DO)

    ④ 串行数据 输入 / 输出引脚(DIO):在普通情况下,该引脚是 串行输入引脚(DI),当使用 快读双输出 指令时,该 引脚就变成了 输出引脚,在 这种情况下,芯片就有 2个 DO引脚,所以称为 双输出,其 通信速率 相当于翻了 一番,所以 传输速率更快。

二、W25Q64特性

1. SPI模式

        W25Q16 / 32 / 64支持通过 四线制SPl总线方式访问,支持 两种 SPI通信方式,即模式 0 和模式 3 都支持。

        模式 0 和 模式 3 的主要区别是:当主机的SPl接口处于空闲或者没有数据传输时CLK的电平是 高电平还是 低电平。对于模式 0,CLK的电平为 低电平;对于模式 3,CLK的电平为 高电平。在 两种模式下芯片都是在 CLK的上升沿 采集输入数据,下降沿 输出数据。

2. 双输出SPI方式

        W25Q16 / 32 / 64 支持 SPI 双输出方式,但需要使用 快读双输出指令(Fast Read Dual Output),这时通信速率相当于标准 SPI 的 2倍。这个命令非常适合在 需要一上电就快速下载代码到内存中的情况 或者 需要缓存代码段到内存中运行的情况。在使用快读双输出指令后,DI 引脚变为 输出引脚

3.保持功能

        芯片处于使能状态(CS=0)时,把 HOLD引脚拉低可以 使芯片暂停工作,适用于芯片和其他器件 共享主机 SPI 接口的情况。

        例如:当 主机接收到一个更高优先级的中断时 就会抢占主机的 SPl接口,而这时芯片的页缓存区(Page Buffer)还有一部分 没有写完,在这种情况下,保持功能可以保存好 页缓存区的数据,等中断释放 SPI 口时,再继续完成刚才 没有写完的工作。

        使用保持功能,CS引脚必须为低电平。在 HOLD引脚出现下降沿以后,如果CLK引脚为低电平,将 开启保持功能;如果 CLK引脚为高电平,保持功能在 CLK引脚的下一个 下降沿开始。在 HOLD引脚 出现上升沿以后,如果 CLK引脚为低电平,保持功能将结束;如果 CLK引脚为高电平,在 CLK引脚的下一个下降沿保持功能将结束

        在 保持功能起作用期间,DO引脚 处于 高阻抗状态DI引脚 和 DO引脚上的信号将被忽略,而且在此期间,CS引脚 也必须 保持低电平,如果在此期间 CS引脚电平 被拉高,芯片内部的 逻辑将会被重置。

三、状态寄存器

1. BUSY位

        忙位,是只读位,位于状态寄存器中的S0。当执行页编程、扇区擦除、块擦除、芯片擦除、写状态寄存器等指令时,该位将自动置 1。此时,除了读状态寄存器指令,其他指令都忽略;当页编程、扇区擦除、块擦除、芯片擦除和写状态寄存器等指令执行完毕之后,该位将自动清 0,表示芯片可以接收其他指令了。

2. WEL位

        写保护位,是只读位,位于状态寄存器中的S1。执行完写使能指令后,该位将置 1。当芯片处于写保护状态下,该位为 0。

        在下面两种情况下,会进入 写保护状态:掉电后执行指令写禁止、页编程、扇区擦除、块擦除、芯片擦除,以及 写状态寄存器。

3. BP2、BP1、 BP0位

        块保护位,是可读可写位,分别位于状态寄存器的S4、S3、S2,可以用 写状态寄存器指令置位 这些块保护位。        

        在默认状态下,这些位都为 0,即 块处于 未保护状态下。可以设置块为没有保护、部分保护或者全部保护等状态。

        当 SPR位为 1 或 /P引脚 为低电平时,这些位 不可以被更改。

4. TB位

        底部和顶部块的保护位,是可读可写位,位于状态寄存器的 S5。该位默认为 0,表明顶部和底部块 处于未被保护状态下,可以用 写状态寄存器指令置位该位。当 SPR位为 1 或 /WP引脚 为低电平时,这些位不可以被更改。

5. 保留位

        位于状态寄存器的 S6,读取状态寄存器值时,该位为 0。

6. SRP位

        状态寄存器保护位,是可读可写位,位于状态寄存器的 S7。该位结合 /P引脚 可以禁止写状态寄存器功能

        该位默认值为0。当SRP=0时,/WP引脚 不能控制状态寄存器的写禁止;当 SRP=1 且 /P=0时,写状态寄存器指令失效;当SRP=1 且 /P=1 时,可以执行写状态寄存器指令。

四、常用操作指令

1. 写使能指令(06h)

        该指令会使 状态寄存器WEL位置位。在执行每个页编程、扇区擦除、块擦除、芯片擦除和写状态寄存器等指令之前,都要先置位 WEL/CS引脚 先拉低为低电平后,写使能指令代码 06h 从 DI引脚输入,在 CLK上升沿采集,然后将 /CS引脚 拉高为高电平。

2. 写禁止指令(04h)

        该指令将会使 WEL位 变为0。/CS引脚 拉低为低电平后,再把 04h 从 DI引脚 输入到芯片,将 /CS引脚 拉高为高电平后,就可完成这个指令。

        在执行完 写状态寄存器、页编程、扇区擦除、块擦除、芯片擦除等指令之后,WEL位就会自动变为 0。

3. 读状态寄存器指令(05h)

        当 /CS引脚 拉低为低电平后,开始把 05h 从 DI引脚 输入到芯片在 CLK的上升沿 时数据被芯片采集,当芯片采集到的数据为 05h 时,芯片就会把 状态寄存器的值从 DO引脚输出,数据在CLK的下降沿输出高位在前

        读状态寄存器指令 在任何时候都可以用,甚至在 编程、擦除 和 写状态寄存器的过程中也可以用,这样就可以 根据状态寄存器的 BUSY位 判断编程、擦除和写状态寄存器周期有没有结束,从而知道芯片 是否可以接收 下一条指令了。

        如果 /CS引脚 没有被拉高为高电平状态寄存器的值将一直从DO引脚输出/CS引脚拉高为高电平后,读状态寄存器指令结束

4. 写状态寄存器指令(01h)

        在执行 写状态寄存器指令之前,需要 先执行写使能指令。先将 /CS引脚 拉低为低电平后,然后把 01h 从 DI引脚 输入到芯片,接着把 想要设置的状态寄存器值通过 DI引脚 输入到芯片,/CS引脚拉高为高电平时,写状态寄存器指令结束。如果此时没有把 /CS 引脚 拉高为高电平 或者 拉得晚了,值将不会被写入,指令无效。

        只有 状态寄存器中的 SRP、TB、BP2、BP1、BP0 位可以被写入,其他只读位的值不会变。在该指令执行的过程中,状态寄存器中的 BUSY位为 1,这时可以用 读状态寄存器指令读出 状态寄存器的值并进行判断。当 写寄存器指令 执行完毕时,BUSY 位将自动变为 0,WEL位 也自动变为 0。

        通过对 TB、 BP2、 BP1、 BP0 等位写 1,就可以 实现将芯片的部分或全部存储区域设置为只读。通过对SRP位写 1,再把 /WP引脚 拉低为低电平,就可以 实现禁止写入 状态寄存器的功能。

5. 读数据指令(03h)

        该指令 允许读出一个字节或一个以上的字节。先把 /CS引脚 拉低为低电平,然后把 03h 通过DI引脚 写入芯片,再送入 24位的地址,这些数据将在 CLK 的上升沿被芯片采集

        芯片接收完 24位地址 之后,就会把相应地址的数据在 CLK引脚的下降沿 DO引脚 发送出去,高位在前。当发送完这个地址的数据之后,地址将自动增加,然后通过 DO引脚把 下一个地址的数据发送出去,从而形成一个 数据流。也就是说,只要时钟在工作,通过 一条读指令,就可以把 整个芯片存储区的数据读出来。

        把 /CS引脚 拉高为高电平时,读数据指令将结束当芯片在 执行页编程、扇区擦除、块擦除、芯片擦除和读状态寄存器指令的周期内,读数据指令不起作用。

五、相关代码

1. W25Q64的常用操作驱动。

/*** @brief	W25Q64等待空闲。读取状态寄存器,查询BUSY状态位命令。  ** @return  void*/
void W25Q64_Busy(void)
{uint8_t cmd[2],data[2];cmd[0] = 0x05;  // 读寄存器指令cmd[1] = 0xFF;  // 激活时钟do{CS_ENABLE;HAL_SPI_TransmitReceive(&hspi1,cmd,data,2,1000);CS_DISABLE;} while ((data[1]&0x01)==0x01);     // 判断 BUSY位 是否为 0
}/*** @brief	W25Q64写使能。  ** @return  void*/
void W25Q64_WriteEnable(void)
{uint8_t cmd;cmd = 0x06;W25Q64_Busy();      // 等待W25Q64空闲CS_ENABLE;HAL_SPI_Transmit(&hspi1,&cmd,1,1000);CS_DISABLE;
}/*** @brief	擦除一个扇区  4kB** @param   SectorNum   指定扇区编号** @return  void*/
void W25Q64_SectorErase(uint32_t SectorNum)
{uint8_t cmd[4];cmd[0] = 0x20;  // 擦除寄存器指令cmd[1] = (SectorNum*4096)>>16;cmd[2] = (SectorNum*4096)>>8;cmd[3] = (SectorNum*4096)>>0;W25Q64_WriteEnable();   // W25Q64写使能W25Q64_Busy();      // 等待W25Q64空闲CS_ENABLE;HAL_SPI_Transmit(&hspi1,cmd,4,1000);CS_DISABLE;
}/*** @brief	W25Q64写入一个页** @param   date      待保存数据* @param   PageNum   指定页编号** @return  void*/
void W25Q64_WritePage(uint8_t* date, uint32_t PageNum)
{uint8_t cmd[4];cmd[0] = 0x02;  // 擦除寄存器指令cmd[1] = (PageNum*256)>>16;cmd[2] = (PageNum*256)>>8;cmd[3] = (PageNum*256)>>0;W25Q64_WriteEnable();   // W25Q64写使能W25Q64_Busy();      // 等待W25Q64空闲CS_ENABLE;HAL_SPI_Transmit(&hspi1,cmd,4,1000);HAL_SPI_Transmit(&hspi1,date,256,5000);CS_DISABLE;
}/*** @brief	W25Q64读取数据** @param   rdate   读取数据的保存地址* @param   addr    读取数据的地址* @param   len     读取数据的长度** @return  void*/
void W25Q64_ReadData(uint8_t* rdate, uint32_t addr, uint32_t len)
{uint8_t cmd[4];cmd[0] = 0x03;  // 擦除寄存器指令cmd[1] = addr>>16;cmd[2] = addr>>8;cmd[3] = addr>>0;W25Q64_Busy();      // 等待W25Q64空闲CS_ENABLE;HAL_SPI_Transmit(&hspi1,cmd,4,1000);HAL_SPI_Receive(&hspi1,rdate,len,50000);CS_DISABLE;
}

2. 工程地址

2_Flash_W25Q64 · CXDNW/STM32F103C8T6练习项目 - 码云 - 开源中国 (gitee.com)


串口软件可以查看这篇博客:

http://t.csdnimg.cn/oB1pEicon-default.png?t=N7T8http://t.csdnimg.cn/oB1pE

相关文章:

嵌入式——Flash(W25Q64)

目录 一、初识W25Q64 1. 基本认识 2. 引脚介绍 ​编辑 二、W25Q64特性 1. SPI模式 2. 双输出SPI方式 三、状态寄存器 1. BUSY位 2. WEL位 3. BP2、BP1、 BP0位 4. TB位 5. 保留位 6. SRP位 四、常用操作指令 1. 写使能指令(06h) 2. 写禁…...

stm32:pwm output模块,记录一下我是用smt32,输出pwm波的记录--(实现--重要)

我是实现了输出pwm波,频率固定,占空比可以不断调整的方法,将PA0接到示波器上,可以看到是一个标准的PWM波,如图下面示波器图。 1,首先是ioc的配置 我刚开始设置的分频的倍数是7199,使得分频的太大了,示波器显示不了,最后修改为71就可以,我之前设置读取pwm也是一样的…...

phpstrom创建thinkphp项目

安装php和composer 参考 安装phpstrom 创建项目 查看thinkphp版本 https://packagist.org/packages/topthink/think 打开所在项目编辑配置 即可调试运行...

【Linux】线程同步

线程同步 一、条件变量1. 同步概念2. 条件变量概念3. 条件变量接口(1)pthread_cond_init()(2)pthread_cond_destroy()(3)pthread_cond_wait()(4)pthread_cond_signal()(5…...

如何在多头自注意力机制的交叉学习中引入对于物理、生理、心理世界客观规律的对照验证...

要在多头自注意力机制的交叉学习中引入对于物理世界客观规律的对照验证,可以考虑以下方法: 1、引入物理模型 首先,建立一个物理模型,该模型能够描述物理世界中的客观规律。这个模型可以是已知的科学理论,也可以是通过实…...

智慧公厕:让智慧城市的公共厕所焕发“智慧活力”

智慧城市的建设已经进入了一个新的阶段,不仅仅是智慧交通、智慧环保,如今甚至连公厕都开始迎来智慧化时代。智慧公厕作为智慧城市的神经末梢,正在通过信息化、数字化和智慧化的方式,实现全方位的精细化管理。本文以智慧公厕源头专…...

vue导出word文档(图文示例)

第076个 查看专栏目录: VUE 本文章目录 示例说明示例效果图导出的文件效果截图示例源代码参数说明:重要提示:API 参考网址 示例说明 在Vue中导出Word文档,可以使用第三方库file-saver和html-docx-js。首先需要安装这两个库: npm …...

【C Primer Plus第六版 学习笔记】 第十七章 高级数据表示

有基础&#xff0c;进阶用&#xff0c;个人查漏补缺 链表&#xff1a;假设要编写一个程序&#xff0c;让用户输入一年内看过的所有电影&#xff0c;要储存每部影片的片名和评级。 #include <stdio.h> #include <stdlib.h> /* 提供malloc()的原型 */ #include <s…...

租用一个服务器需要多少钱?2024阿里云新版报价

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…...

python-产品篇-游戏-成语填填乐

文章目录 准备代码效果 准备 无需其他文件&#xff0c;复制即用 代码 import random list["春暖花开","十字路口","千军万马","白手起家","张灯结彩","风和日丽","万里长城","人来人往",&…...

数据库数据加密的 4 种常见思路的对比

应用层加解密方案数据库前置处理方案磁盘存取环节&#xff1a;透明数据加密DB 后置处理 最近由于工作需要&#xff0c;我对欧洲的通用数据保护条例做了调研和学习&#xff0c;其中有非常重要的一点&#xff0c;也是常识性的一条&#xff0c;就是需要对用户的个人隐私数据做好加…...

HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-PWM

目录 一、PWM 概述二、PWM 模块相关API三、接口调用实例四、PWM HDF驱动开发4.1、开发步骤(待续...) 坚持就有收获 一、PWM 概述 PWM&#xff08;Pulse Width Modulation&#xff09;又叫脉冲宽度调制&#xff0c;它是通过对一系列脉冲的宽度进行调制&#xff0c;等效出所需要…...

001kafka源码项目gradle报错UnsupportedClassVersionError-kafka-报错-大数据学习

1 报错提示 java.lang.UnsupportedClassVersionError: org/eclipse/jgit/lib/AnyObjectId has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0 如…...

单片机学习笔记---直流电机驱动(PWM)

直流电机介绍 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极&#xff0c;当电极正接时&#xff0c;电机正转&#xff0c;当电极反接时&#xff0c;电机反转 直流电机主要由永磁体&#xff08;定子&#xff09;、线圈&#xff08;转子&#xff09;和换向器…...

Scrum敏捷培训机构推荐

敏捷培训机构中&#xff0c;Scrum中文网&#xff08;www.scrum.cn&#xff09;是一个值得考虑的选择。 Scrum中文网(Scrum.CN)是全球第一个Scrum中文网站&#xff0c;是中国最早的Scrum和敏捷的布道者、教育及推广机构&#xff0c;也是国际Scrum联盟&#xff08;Scrum Allianc…...

《Go 简易速速上手小册》第5章:并发编程(2024 最新版)

文章目录 5.1 Goroutines 的基础 - Go 语言中的轻盈舞者5.1.1 基础知识讲解5.1.2 重点案例&#xff1a;并发下载器功能描述实现代码扩展功能 5.1.3 拓展案例 1&#xff1a;网站健康检查功能描述实现代码扩展功能 5.1.4 拓展案例 2&#xff1a;并发日志处理器拓展案例 2&#xf…...

python - 模块

rootlearning ~]# cat gcdfunction.py #写一个模块&#xff0c;并调用此模块 def gcd(n1,n2): #之前用过的求最大公约数的代码gcd 1k 2while k< n1 and k<n2:if n1%k 0 and n2 % k 0:gcd kk k 1return gcd [rootlearning ~]# cat module.py #完整代码 from gc…...

【Web】CTFSHOW java刷题记录(全)

目录 web279 web280 web281 web282 web283 web284 web285 web286 web287 web288 ​web289 web290 web291 web292 web293 web294 web295 web296 web297 web298 web299 web300 web279 题目提示 url里告诉我们是S2-001 直接进行一个exp的搜 S2-001漏洞分析…...

全球付汇业务的流程

全球付汇业务&#xff0c;主要是针对的进口类业务&#xff0c;并且是一般贸易进口的业务。 主要流程如下&#xff1a; 1.境内客户通过大额系统将人民币转入支付公司的备付金账户&#xff08;一般此客户为企业客户&#xff09;&#xff0c;转账需要通过大额系统&#xff1b; 2.至…...

ubuntu22.04@laptop OpenCV Get Started: 012_mouse_and_trackbar

ubuntu22.04laptop OpenCV Get Started: 012_mouse_and_trackbar 1. 源由2. mouse/trackbar应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 鼠标位置跟踪注释3.1 注册回调函数3.2 回调操作3.3 效果 4. 使用轨迹栏调整图像大小4.1 初始化轨迹栏&注册回调函数4.2 回调操作4.3 效…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...