W25Q64简介

W25Q64介绍

在这里插入图片描述
本节使用的是:W25Q64: 64Mbit / 8MByte。存储器分为易失性存储器和非易失性存储器,易失性存储器一般是SRAM,DRAM。非易失性存储器一般是E2PROM,Flash等。非易失性存储器,掉电不丢失。

字库存储,可以应用到显示屏上,在屏幕上显示汉字,就得把汉字的点阵数据存起来,把字库直接存在stm32内部,这样适合少量汉字显示的情况,如果汉字非常多, 就不合适了,所以我们可以用这个芯片来存储汉字。

固件程序存储,这个就相当于直接把程序文件下载到外挂芯片里,需要执行程序的时候,直接读取外挂芯片的程序文件来执行,这就是XIP就地执行,比如我们电脑里的bios固件,就可以存储在这个系列的芯片里。

存储介质:Nor Flash(闪存):flash就是闪存存储器,闪存分为Nor Flash和Nand Flash,两者各有优势和劣势,适用领域不同,stm32的程序存储器、u盘、电脑里的固态硬盘等使用的都是flash闪存。

时钟频率:80MHz / 160MHz (Dual SPI)双重SPI模式等效的频率 / 320MHz (Quad SPI)四重SPI模式等效的频率。

160MHz (Dual SPI):MOSI和MISO同时兼具发送和接收的功能,一个SCK时钟我同时发送或接收两位数据,就是双重SPI模式,等效的时钟频率就是80MHz的二倍就是16MHz,但实际上这个频率最大还是80MHz,只是我一个时钟发两位而已。

320MHz (Quad SPI):就是一个时钟发送或接收四位。

24位的地址最大能分配多少个字节呢,是2^24=16MB,所以24位地址的最大寻址空间是16MB。
但是这个W25Q256型号比较特殊,24位地址对于32MB来说是不够的,根据手册里描述W25Q256分为3字节地址模式和4字节地址模式,在字节地址模式下,只能读写前16MB的数据,要想读写到所有存储单元,可以进入4字节地址的模式。

硬件电路

在这里插入图片描述

1号脚CS,这个CS左边画了个斜杠代表是低电平有效,或者这边CS上面画了个横线也是低电平有效,那这里CS对应SS的片选引脚。

3号引脚WP,意思是写保护配合内部的寄存器器配置,可以实现硬件的写保护,写保护低电平有效,WP接低电平,保护住,不让写;WP接高电平,不保护,可以写。

7号引脚,HOLD是数据保持,低电平有效,如果你在进行正常读写时突然产生中断,然后想用SPI通信线去操控其他器件,这时如果把CS置回高电平,那时序就终止,但如果你又不想终止总线,又想操作其他器件,这就可以HOLD引脚置低电平,这样芯片释放总线,但是芯片时序也不会终止,它会记住当前的状态,当你操作完其他器件时,可以回过来,HOLD置回高电平,然后继续HOLD之前的时序,相当于SPI总线进来一次中断,并且在中断里还可以用SPI干别的事情,这就是HOLD的功能。

DI、DO、WP、和HOLD,旁边都有括号,写了lO0、lO1、lO2、lO3 ,这个就是双重SPI和四重spi,如果是普通的SPI模式,那括号里的都不用看。
如果是双重SPI,那di和do就变成lO0和lO1,也就是数据同时收和同时发的两个数据位。
如果是四重SPI,那就再加上WP当做lO2 ,HOLD当做lO3 ,这四个引脚都作为数据收发引脚,一个时钟四个数据位。
电路原理图中,HOLD的和WP这两个都是直接接到的VCC,低电平有效,那都接到VCC,就这两个功能我们都不用。

W25Q64框图

在这里插入图片描述

在这里插入图片描述

可以看到左下角第一个字节,它的地址是00 00 00h,之后的空间地址依次自增,直到最后一个字节,地址是7FFFFFh,那最后一个字节为啥是7f开头,不是f f开头呢,因为24位地址最大寻址范围是16MB,我们这个芯片只有8MB,所以地址空间我们只用了一半,8MB排到最后一个字节,就是7 FFFFFh,那这是整个地址空间,从000000~7F FF FF。

在这整个空间里,我们以64KB为一个基本单元,把它划分为若干的块block,从前往后依次是块0块1块2等等,一直分到最后一块,那整块蛋糕是8MB,以64kb为一块进行划分,最后分得的快数就是8MB/64kB=128,这里可以分得128块,那块序号就是块0一直到最后一个是块127。

左边这个示意图,我们还要再对每一块进行更细的划分,分为多个扇区sector,这里的虚线指向了右边的各个块,告诉你每一块里面都是这个样子的,那在每个块里,它的起始地址是XX0000,结束地址是XXf f f f。在一块里我们再以4kb为一个单元进行切分,一个块是64kb,64/4=16,所以在每一块里都可以分为扇区0一直到扇区15。

在这里插入图片描述

页是对整个存储空间划分的,当然你也可以把它看作在扇区里再进行划分都一样,那页的大小是256个字节,一个扇区是4kb,4KB*1024/256=16页,所以一个扇区里可以分为16页。
页的地址规律,,在这里每一行就是一页,左边这里指了个箭头,写的是页地址的开始,右边这里也指了个箭头,写的是页地址的结束,在一页中,地址变化范围是XXXX00到XXXXFF,一页内的地址变化,仅限于地址的最低一个字节,这就是页的划分。

这个一整个存储空间,首先划分为若干块,对于每一块又划分为若干扇区,然后对于整个空间会划分为很多很多页,每页256字节。

状态寄存器器,这个状态寄存器器是比较重要的,比如芯片是否处于忙状态,是否写使能,是否写保护,都可以在这个状态寄存器器里体现。

写控制逻辑,和外部的wp引脚相连,显然这个是配合wp引脚实现硬件写保护的。

高电压生成器,这个是配合flash进行编程的,因为flash是掉电不丢失的,我们要让它产生即使断电也不会消失的状态,一般都需要一个比较高的电压去刺激它,所以这种掉电不丢失的存储器,一般都需要一个高压源,那这里芯片内部集成了高电压发生器,所以就不需要我们在外接高电压了。

页地址/锁存计数器,然后下面还有一个,字节地址锁存/计数器,这两个地址锁存和记数器就是用来指定地址的。我们通过SPI总共发过来三个字节的地址,因为一页是256字节,所以一页内的字节地址就取决于最低一个字节,而高位的两个字节就对应的是页地址,所以在这里我们发的三个字节地址,前两个字节会进到这个页地址锁存计数器里,最后一个字节会进到这个字节地址锁存计数器里。

256字节的页缓存区,它其实是一个256字节的ram存储器,要数据读写,就是通过这个ram缓冲区域来进行的,我们写入数据会先放到缓存区里,然后在时序结束后,芯片再将缓冲区的数据复制到对应的flash里,进行永久保存。

Flash操作注意事项

在这里插入图片描述

  • 写入操作前必须先进行写使能,这个是一种保护措施,防止你误操作的。
  • 每个数据位只能由1改写为0,不能由0改写为1,这个意思就是说,flash并没有像ram那样的直接完全覆盖改写的能力,比如在某一个字节的存储单元里面,存储了0xAA这个数据,对应的二进制位就是10101010,如果我直接再次在这个存储单元写入一个新的数据,比如我再次写入一个0x55,因为0x55的二进制是01010101,当这个01010101要覆盖原来的10101010时,就会受到这里第二条规定的限制,每个数据位只能由1改写为0,不能由0改写为1。所以为了弥补这个只能1改0,不能0改1的缺陷,我们就引出了第三条规定。
  • 写入数据前必须先擦除,擦除后所有数据位变为1,擦除会有专门的擦除电路进行,只要给他发送擦除的指令就行了,那通过擦除电路擦除之后,所有的数据位都变成1。

总结:就是flash中数据位为1的数据,拥有单项改成0的权利,一旦改写为0之后,就不能反悔再改写成1了,要想反悔就必须得先擦除,所有的位先统一都变成一,然后再重新来过,这是flash改写的特性。那擦除之后所有的位变1,就是16进制的ff,所以有时候你读取flash会发现数据全是f f,那就说明这一段有可能是擦除之后,还没有写入数据的空白空间,在flash中ff代表空白,那这个改写和擦除的注意事项。

  • 擦除必须按最小拆除单元进行,不能指定某一个直接去擦除,要擦就得一大片一起擦,那在我们这个芯片里,你可以选择整个芯片擦除,也可选择按块擦除,按扇区擦除,所以最小的擦除单元就是一个扇区,刚才我们看了一个扇区是4KB就是4096个字节,所以你擦除最少就得4096个字节一起擦。只擦除某一个字节,只能把那个字节所在扇区的4096个字节全都擦掉。

  • 连续写入多字节时,最多写入一页的数据,超过页尾位置的数据会回到页首覆盖写入。一个写入时序最多只能写一页的数据也就是256字节,每个时序最多写入一页的数据,你再写多缓冲区存不下了,如果你非要写,那超过页尾位置的数据会回到页首覆盖写入,另外我们这个页缓存区是和flash的页对应的,你必须得从页起始位置开始写,才能最大写入256字节,如果你从页中间的地址开始写,那写到页尾时,这个地址就会跳回到页首,这会导致地址错乱哈,所以我们在进行多字节写入时,一定要注意这个地址范围不能跨越页的边缘,否则会地址错乱。

  • 写入操作结束后,芯片进入忙状态,不响应新的读写操作。写入操作后,都有一段时间的忙状态,在这个状态下不要进行新的读写操作,否则芯片是不会响应我们的,要想知道芯片什么时候结束忙状态,我们可以使用读状态寄存器器的指令,看一下状态寄存器的BUSY位是否为1,为0时芯片就不忙了,我们再进行操作,另外注意这个写入操作,包括上面的擦除,在发出擦除指令后,芯片也会进入忙状态,我们也得等忙状态结束后才能进行后续操作。

芯片手册

在这里插入图片描述
状态寄存器有2个:状态寄存器1和状态寄存器2。
状态寄存器1:BUSY,写使能锁存位WEL。

BUSY:当设备正在执行页编程,然后扇区擦除,块擦除,整片擦除或者写状态寄存器指令时,BUSY位置1,在这期间,设备将会忽略进一步指令,除了读状态寄存器和擦除挂起指令。当编程,擦除,写状态寄存器指令后,BUSY清0,表示设备准备好了。

写使能锁存位WEL:在执行写使能指令后,WEL置1,代表芯片写入操作。当设备写失能时,WEL位清0。设备写失能:一是上电后,芯片默认写使能。在执行发送写失能指令,页编程,扇区擦除,这些写入操作后,WEL位为0。

设备ID号
在这里插入图片描述
SPI指令集
在这里插入图片描述
在这里插入图片描述
时序图
在这里插入图片描述
芯片供电电压范围
在这里插入图片描述
执行编程和擦除的时间
在这里插入图片描述
页编程的时间:典型时间是0.7ms,最大时间是3ms。

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

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

相关文章

分布式一致性理论

分布式一致性理论 1.数据库事务ACID理论 为保证事务正确可靠而必须具备的四个核心特性。这四个特性分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(D…

k8s——pod控制器

一、pod控制器定义 Pod控制器,又称之为工作负载(workload),是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试进行重启,当根据重启策略无效&#xf…

攻防演练之-动员大会

清晨的阳光透过薄雾洒在甲方的攻防演练中心。由于国家对于重点行业的数据灾备的要求。因此每一家企业都会选择在不同的地理位置建多个数据中心,包括一个生产中心、一个同城灾难备份中心、一个异地灾难备份中心。通过这种方式将业务分布在不同地理位置的数据中心&…

Makefile:从零开始入门Makefile

目录 1.前言 2.Makefile的简单介绍 3.Makefile中的指令规则 4.Makefile的执行流程 5.Makefile中的变量类型 6.Makefile中的模式匹配 7.Makefile中的函数 8.Makefile补充知识 前言 在Linux中编译CPP文件,我们能够使用GCC命令进行编译,但当项目文件多且繁杂…

不能访问huggingface、与GPU配置

不能访问huggingface解决方法 如果是从 huggingface.co 下载模型,由于国内不能访问,所以建议先配置一下环境变量, 通过访问国内镜像站点 https://hf-mirror.com来下载模型。 (1)Linux系统设置环境变量: e…

【Android Studio】导入import android.support.v7.app.AppcompatActivity;时报错

一、问题描述 在进行安卓项目开发时使用import android.support.v7.app.AppcompatActivity;报错: 运行后会有乱码出现: 二、解决办法 将import android.support.v7.app.AppcompatActivity;改为import androidx.appcompat.app.AppCompatActivity;基本上…

一篇文章搞定Java数组初始化,从此告别迷惑

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

面试官:Spring如何解析配置类

你好,我是柳岸花开。 大家好,今天我们来深入探讨一下Spring框架中的配置类解析与扫描过程的源码。Spring作为Java开发中最为广泛使用的框架之一,其核心机制一直是开发者关注的焦点。本文将带领大家从源码角度,详细剖析Spring配置类…

红黑树/红黑树迭代器封装(C++)

本篇将会较为全面的讲解有关红黑树的特点,插入操作,然后使用代码模拟实现红黑树,同时还会封装出红黑树的迭代器。 在 STL 库中的 set 和 map 都是使用红黑树封装的,在前文中我们讲解了 AVL树,对于红黑树和 AVL 树来说&…

k8s 1.28 搭建rabbitmq集群

1.环境 1.1 k8s 1.28 1.2 rabbit 3.8 1.3 工作空间default 1.4 注意,内存最好充足一点,因为我就两个节点一个master、一个node,起初我的node是8g,还剩3~4G,集群竟然一直起不来,后来将虚拟机内存扩大&#x…

Word中插入Mathtype右编号,调整公式与编号的位置

当你已经将mathtype内置于word后,可以使用右编号快速插入公式 但是往往会出现公式和编号出现的位置或之间的距离不合适 比如我在双栏下插入公式,会发现插入的公式与编号是适用于单栏的 解决办法: 开始->样式->MTDisplayLquation -&g…

AWT常用组件

AWT中常用组件 前言一、基本组件组件名标签(Label类)Label类的构造方法注意要点 按钮(Button)Button的构造方法注意要点 文本框(TextField)TextField类的构造方法注意要点 文本域(TextArea)TextArea 的构造方法参数scrollbars的静态常量值 复选框&#x…

排序-读取数据流并实时返回中位数

目录 一、问题描述 二、解题思路 1.顺序表排序法 2.使用大根堆、小根堆 三、代码实现 1.顺序表排序法实现 2.大根堆、小根堆法实现 四、刷题链接 一、问题描述 二、解题思路 1.顺序表排序法 (1)每次读取一个数就对列表排一次序,对排…

Python异步爬虫批量下载图片-协程

import aiofiles import aiohttp import asyncio import requests from lxml import etree from aiohttp import TCPConnectorclass Spider:def __init__(self, value):# 起始urlself.start_url value# 下载单个图片staticmethodasync def download_one(url):name url[0].spl…

Redis 5种常用数据类型

目录 Redis简介 1.字符串 string 2.哈希 hash 3.列表 list 4.集合 set 5.有序集合 sorted set / zset Redis简介 Redis,全称Remote Dictionary Server,是一个开源的、内存中的数据结构存储系统。它可以用作数据库、缓存和消息中间件,支…

JavaScript前端技术入门教程

引言 在前端开发的广阔天地中,JavaScript无疑是最耀眼的一颗明星。它赋予了网页动态交互的能力,让网页从静态的文本和图片展示,进化为可以与用户进行实时交互的丰富应用。本文将带您走进JavaScript的世界,为您提供一个入门级的教…

SpringBoot3+Mybatis-Plus+h2数据库,入门Mybatis-Plus

SpringBoot3Mybatis-Plush2数据库,入门Mybatis-Plus mybatis-plus官网地址maven依赖数据库脚本配置文件实体类Mapper入门程序启动程序测试单元测试测试结果 Service层接口service层接口单元测试测试结果 项目结构 mybatis-plus官网地址 https://www.baomidou.com/ …

风能远程管理ARMxy嵌入式系统深度解析

智能技术正以前所未有的速度融入传统能源管理体系,而ARMxy工业计算机作为这一变革中的关键技术载体,正以其独特的性能优势,为能源管理的智能化升级铺设道路。本文将聚焦于智能电表、太阳能电站监控、风力发电站远程管理三大应用场景&#xff…

【2023】LitCTF

LitCTF2023&#xff08;复现&#xff09; Web&#xff1a; 1、我Flag呢&#xff1f; ​ ctrlu 读取源码&#xff0c;在最后发现了flag&#xff1a; <!--flag is here flagNSSCTF{3d5218b9-4e24-4d61-9c15-68f8789e8c48} -->2、PHP是世界上最好的语言&#xff01;&…

SQL159 每个创作者每月的涨粉率及截止当前的总粉丝量

描述 用户-视频互动表tb_user_video_log iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id110120012021-09-01 10:00:002021-09-01 10:00:20011NULL210520022021-09-10 11:00:002021-09-10 11:00:30101NULL310120012021-10-01 10:00:002021-10-01 10:00…