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配置类…

深度探索Copilot插件

Copilot是一个由GitHub开发的程序代码生成助手,它使用人工智能模型训练来生成代码提示和建议。深度探索Copilot插件意味着探索如何使用和最大限度地利用Copilot来加快和改善编程流程。 首先,你可以在编辑器中安装Copilot插件。它可以与多种编辑器和IDE集…

红黑树/红黑树迭代器封装(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…

37python数据分析numpy基础之save以二进制保存数组数据到文件

1 python数据分析numpy基础之save以二进制保存数组数据到文件 python的numpy库的save(file,arr)函数,将数组以二进制格式保存到一个npy后缀的文件中。 用法 numpy.save(file, arr, allow_pickleTrue, fix_importsTrue)描述 numpy.save(file,arr),可以…

AWT常用组件

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

【Spring Boot】Spring Boot 的世界之旅1

目录 1 Spring Boot 的诞生背景 2 Spring Boot 的核心价值 3 为什么选择Spring Boot 4 Spring Boot 与传统Spring应用的对比 5 踏上Spring Boot之旅 1 Spring Boot 的诞生背景 在软件开发的历史长河中,随着技术的不断演进,开发者们面临着越来越多的…

Java基础知识:为面试做好准备

基本概念 Java的特性:Java是一门面向对象的编程语言,具有跨平台性、自动内存管理等特点。Java平台的组成:Java平台主要分为Java SE(Standard Edition)、Java EE(Enterprise Edition)和Java ME&…

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

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

如何使用Python中的枚举类型(enum)

在Python中,枚举类型可以通过内置的enum模块来实现。枚举类型是一种特殊的类,它用于定义一组命名的常量。这些常量通常用于表示固定的、有限的集合的值,比如一周的几天、颜色的名称等。 下面是如何使用Python中的enum模块来定义和使用枚举类…

AQS实现原理

AQS(AbstractQueuedSynchronizer)是一个用于构建锁和同步器的框架,许多同步器都可以通过AQS很容易并且高效地构造出来。 不仅 ReentrantLock 和 Semaphore 是基于AQS构建的,还包括 CountDownLatch、ReentrantReadWriteLock、Synch…