W25Q60简介--SPI通信(笔记)

一.W25Q64简介

1.简介

xx是一个数字,不同的数字表示了不同的存储容量。同一个系列的芯片,只有容量不同,操作方法是一样的。

低成本:价格便宜,小型化:易集成,使用简单:SPI通信。可以可能到这个是一款非易失性存储器,存储器分为,易失性,非易失性。

易失性:SRAM,DRAM。非易失性存储器:E2PROM,Flash,区别就是存储的数据是否是掉电丢失。

数据存储可以存放采集的数据,字库存储可以把汉字的点阵数据存在里面,固件程序存储,相当于可以把程序直接下载到外挂的芯片里面,需要执行程序时候,直接读取外挂程序来执行。这就是XIP就地执行,比如说电脑里面的bios固件。

存储介质:Flash就是闪存存储器,像STM32的程序存储器,U盘,电脑里面的固态硬盘等等,闪存分为Nor Flash和Nand Flash两者各有优势和劣势,适用领域也不同。

芯片的SCK就是时钟线,这款的频率是80MHz已经很快了。所以我们写程序就不需要延时了,因为我们GPIO全速才50MHz,它是80MHz相当快了。

这个160MHz是双重SPI模式等效频率,320MHz是四重SPI模式等效的频率。那么他们是什么意思呢,就是我们之前说的MOSI用于发送,MISO用于接收,是全双工通信,在只发送或者直接收时候,会有浪费,但是W25Q64的芯片厂商不忍心浪费,所以就对SPI做出了一些改进,就是我在发的时候可以同时用MOSI和MISO进行发送,或者在接收的时候可以同时使用MOSI和MISO进行接收。MISO和MOSI同时具备接收和发送功能,一个SCK时钟,同时接收和发送两位数据。对比单个SPI那么效率就翻了一倍,所以等效的时钟为160MHz。

在我们的芯片里,还有两个引脚,WP写保护,HOLD这两个引脚如果不需要的话,可以拉过来,充当数据引脚。加上MOSI和MISO就可以四个数据同时收发了。这就是四重SPI,起始有点并行传输的意思了。串行是根据时钟,一位一位的发送,并行是一个时钟,八位同时发送。所以四重SPI模式其实就是四位并行的模式。

容量:4Mbit就是4M个二进制位,一个字节对应8个二进制位,所以转化位字节就是512KByte。

所以芯片后面的数值/8就是容量,当然40和80看为04和08就对了。这个芯片使用的是24位地址,就是3字节。我们使用时候,肯定需要把每个字节都分配一个地址,这样才能找到他们。

4字节的话是16Mb,但是W25Q256就比较尴尬了,分为3字节地址模式和4字节地址模式,在3字节地址模式下,只能读取前16Mb的数据要想读取到所有的单元,就需要四字节数据。这样就可以了。

二.硬件电路

1.原理图

这是我们的原理图电路,所有的引脚都通过排针印出来了。

2.引脚定义

vcc和CNG是电源正负极,然后/CS是代表引脚低电平有效,对应我们SPI的名称就是SS意思是SPI的片选引脚。然后CLK就是SPI的时钟线。然后5号的DI对应的是MOSI,是SPI主机输出从机输入。2号DO对应的是MISO,是SPI主机输入,从机输出。这些就是SPI通信的引脚。WP写保护,配合内部寄存器的配置,可以实现硬件的写保护写保护低电平有效,WP接低电平,保护住,不让写,WP接高电平,不保护,可以写。HOLD数据保持低电平有效。如果你在正常读写时,突然进行了中断,然后向通过SPI取控制其他器件,这时如果把CS置回高电平,那么时序就终止了,但如果你又不想终止总线,又想操控其他器件。这就可以使HOLD引脚置高电平,这样芯片就保持住了。芯片释放总线,但是时序不会终止,会记住当前状态,当你操作完其他事件时候,可以回过来。

我们注意到DO,HOLD,WP,DI边上都写了一个IO这就是我们刚才说的,双重SPI和四重SPI。普通不用管,如果是双重SPI那么DI和DO就是IO0和IO1。

3.引脚功能

4.框图

(1)地址分层

右半部分是描述的存储器的规划示意图,我们这个W25Q64容量是8MB。如果不进行划分,那么就会不方便管理,后续我们涉及到Flash擦除和写入的时候,都会有一个基本单元,我们需要以这个基本单元为时序进行。

常见的划分是一整块存储空间,先划分为若干的块Block,其中每一块在划分为若干的扇区Senctor对于每个扇区,又可以分为若干的页Page。

W25Q64的划分是,一整个矩形空间里,是所有的存储器,存储器以字节为单位,每个字节都有唯一的地址,W25Q64的地址宽度是24位,也就是3字节。

所以可以看到,第一个字节的大小是00 00 00h,h代表16进制。之后的空间,地址依次自增,直到最后一个字节,地址是7F FF FFh。

为什么最后一个字节是7F开头不是FF开头呢,因为24位地址,最大寻址范围是16MB,我们这个芯片只有8MB,所以地址空间我们只用一半。8MB的空间拍到最后一个字节就是7F。

在整个空间里,我们以64KB作为一个基本单元,把它划分为若干的块Block。整个空间是8MB以64KB进行划分,最后划分的个数就是,8MB/64KB=128,所以可以分为128块。那么序列号就是0~127。

块0的起始地址是00 00 00h结束地址是00 FF FFh。

之后块31起始地址就是1F 00 00h到1F FF FFh。

可以观察到,每个块的起始地址是xx 00 00,结束地址是xx FF FF。

我们还要对每一个块划分位Sector,这里的虚线指向了右边的各个块,也就是告诉你,这里的每一块,都是这个样子。

我们可以看到每个块里,起始地址是xx 00 00,结束地址是xx FF FF。在一块里我们在以4KB为一个单元进行切分。一块是64KB,4KB一块就是64KB/4KB=16。所以在每一块里都可以分为扇区0~扇区15。

观察地址可以发现,每个扇区内部地址范围是:xx x0 00~xx xF FF。地址划分就结束了。

但是当我们写入数据的时候,还会有一个更细的划分。就是页Page,页是对整个存储空间划分的,也可以看作在扇区里,在进行划分,也是一样的。

页的大小是256个字节。一个扇区是4KB,以256个字节划分能分的多少份呢,我们算一下,4KB*1024=4096字节,4096字节/256字节=16页。所以一个扇区里可以分为16页。

这是我们页的起始地址和结束地址,可以看到在一夜中,地址变化的范围是xx xx 00~xx xx FF。一页内的地址变化,仅限于地址的最低一个字节。

(2)SPI执行逻辑

这时SPI的控制逻辑,相当于芯片的管理员,我们有什么事,告诉这个管理员就可以了。控制逻辑左边,就是SPI的通信引脚。这些引脚和我们的主控芯片相连,主控芯片通过SPI协议,把指令和数据发给控制逻辑。控制逻辑就会自动执行我们的电路,来完成我们想要的功能。

控制逻辑上面有个状态寄存器,这个状态寄存器比较重要,比如芯片是否处于忙状态,是否写使能,是否写保护。都可以在这个状态寄存器里提现。

然后是写控制逻辑和外面的WP引脚相连。显然这个是配合WP引脚来实现硬件写保护的。

右边这里是一个高电压生成器。这个是配合Flash来进行编程的。因为Flash是掉电不丢失的,要想产生掉电不丢失,我们就需要在存储器里产生一些刻骨铭心的变化,我们给这个位置进行大干预,所以不管有电没电,这个位置都不会发送变化了。所以它就是掉电不丢失的。所以我们就是用一个较高的电压刺激他,所以这种掉电不丢失的存储器,一般都需要一个高电压源。那么这里芯片内部集成了高电压发生器,就不需要我们在外接电压了。

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

页地址通过这个写保护和行解码,来选择我要操纵那一页。

字节地址通过列解码和256字节页缓存来进行指定字节读/写操作,又因为我们这个地址锁存有一个计数器,所以这个地址指针在读写之后会自动加1。这样就可以实现从指定字节开始,连续读写多个字节的目的了。

右边这里有个256字节的页缓存区。他其实是一个256字节的RAM存储器,然后我们数据的读写,就是通过这个RAM缓存区来进行的。我们写入数据,会先放到缓存区里,在时序结束之后芯片将缓存区的数据,复制到对应的Flash里。进行永久保存。

为什么要做一个缓冲区呢,直接写在Flahs里面不可以吗,这是因为我们SPI写入的频率是非常高的,而Flash的写入,由于要掉电不丢失,留下深刻的痕迹,它就会比较慢,所以这个芯片的设计思路就是,写入的数据先放在页缓存器里存折,因为缓存区是RAM所以他的速度会非常快,可以跟得上SPI总线的速度,但是有个小问题,因为这个缓存区只有256个字节,所以写入的时序有个限制条件,就是写入的一个时序,连续写入的数据量,不得超过256字节。然后等你写完了,我芯片在慢慢的把数据从缓冲区,转移到Flash存储器里面。

那么数据从缓冲区转移到Flash里面需要一定的时间,所以在写入时序结束后,芯片会进入一段忙的状态,在这里会有一条线,通往状态寄存器给状态寄存器的BUSY位,置1,表示芯片当前正在板砖,很忙,那么在忙的时候,芯片就不会响应新的读写时序了。这就是写入的时序流程

(3)读取数据

如果是读出数据呢。

通过这里猜一下,可能是通过缓存区来读取,但是由于读取,只看一下电路的状态就可以了。基本不花时间,所以读取的限制就很小了。速度也非常块,到这里我们的芯片框图就看完了。

第一部分,整个Flash的空间划分,划分为,块,扇区,页。

第二部分,SPI控制逻辑,就是整个芯片的管理员,执行指令读,写都靠它。

第三部分,状态寄存器,他和忙状态,写使能,写保护等功能有关。

第四部分,是256字节的页缓存,他会对一次性写入的数据量,产生限制。

5.Flash操作注意事项

因为Flash是掉电不丢失的存储器,为了保证掉电不丢失的特性,同时还要保证存储量足够大,成本足够低。所以,Flash存储器会在别的地方比如操作的便捷性等,做出一些妥协和让步。

所以Flash的读写,并不像RAM那样简单直接。RAM是指哪打哪,向写多少就写多少。并且RAM是可以覆盖写入的。比如原来RAM里有个数据0xAA,之后直接写入一个新的数据0x55,那么RAM的数据就变为了0x55。但是Flash没用这个特性。

可以看到Flash写入的要求还是比较多的,但是读取的要求就少了,因为读取只是看一下电路的状态,不对电路做出实质性的改变,所以读取一般都比较快。而且没用什么限制。

(1)写入操作

我们一一对应解释一下:

(1)写入之前的写使能是进行保护的,根手机一样,先解锁在操作。我们使用SPI发送一个写使能的指令就可以完成。

(2)flash没用向ram那样的覆盖能力。这解释了前面SPI通信时为什么有一条数据线空闲时传输的数据是0xFF,比如要写入0xaa,变为二进制是1010 1010,再次写入0x55变为二进制,0101 0101这样子写入之后前四位就会变为0,因为1可以变为0,0不可以变为1。

(3)可以弥补这个缺陷,先擦除,然后写入1。擦除会有专门的擦除电路。我们只需要发送擦除指令就可以了。擦除之后,所有数据位变为1。就是0xFF,所以有时候读取flash数据就会发现是这个数据。就说明这一块是擦除之后,还没有写入数据的空间,在falsh中FF表示空白而不是00。

(4)你不能指定某一个字节是擦除,要擦除就需要一大片一起擦除,在我们这个芯片里,可以选择整个芯片擦除,也可以按快擦除,按扇区擦除。最小的擦除单元就是一个扇区

一个扇区最小就是4KB也就是4096个字节。所以擦除最少就得4096个字节一起擦除。如果你想擦出的字节这个扇区还有别的数据,只能先把数据读出来,然后对整个扇区进行擦除,改写完读出来的数据后,再把4096个字节全都写会去。

为了弥补擦除最小单元的 缺点,我们需要对程序进行一些设计。

(5)写入时候一次性不能写太多。一个写入时序最多只能写一页的数据也就是256字节。

因为这里有一个页缓存区,它只有256字节。为什么又缓存区,因为flash写入太慢了跟不上SPI频率。所以写入的数据会先放在,RAM里面暂存等时序结束后,芯片在慢慢的把数据写入到flash里面。所以会有限制,每次最多写一页的数据,写的过多会覆盖首个数据。而且页缓存器和Flash的页对应,只有在页起始位置开始,才可以最大写入256字节,从中间开始写256字节到页尾之后,就会跳回页首造成地址混乱。

(6)写入是对缓存区进行等时序结束后芯片还要搬砖,所以每次写入之后,芯片都要进入一段忙时间。在这个状态下,我们不要进行新的读写操作否则芯片是不会响应我们的。

要想知道芯片什么时候结束忙状态,我们可以使用读取状态寄存器指令看一下状态寄存器的BUSY位是否为1,BUSY位为0时,芯片就不忙了。我们在进行操作。写入指令包括上面的擦除,在发出擦除指令后,芯片也会忙,也得等忙状态结束后才可以进行下一步操作。

(2)读取操作

无需使能,无需额外操作(擦除,等待)没用字节限制,想读取多少就读取多少,读取之后不会进入忙状态,但是不能在芯片忙的时候读取。

所以读取之前也要看一下芯片是否处于忙状态,等不忙的时候在进行读取就可以了。在非易失的存储器中flash还是很热门的,容量大,价格便宜,速度快(仅限非易失存储器)。

三.手册查询

1.状态寄存器

这个状态寄存器应该叫控制及状态寄存器。

这里状态寄存器又两个,一个时状态寄存器1,一个是状态寄存器2,重要的是状态寄存器1,这里可以看到,状态寄存器1里面有两个位比较重要,第一个是BUSY,当设备正在进行,页编程(写入数据),扇区擦除,块擦除,整区擦除,整片擦除,或者写状态寄存器指令时BUSY位置1,这期间设备将会忽略进一步的指令。

第二位写使能锁存位WEL,在执行完写使能指令后,WEL置1代表芯片可以进行写入操作了,当设备写使能时WEL位清零。什么时候存在写失能状态呢,1.上电后芯片默认写失能,2.在执行写失能,页编程,扇区擦除,块擦除这些写入指令等等WEL会置0。这表明当我们写使能,在执行写入操作后,就不需要再手动进行写失能了。因为写入操作后,会顺便写失能。同时这样表明,我们在任何写操作之前,都需要写使能,一个写使能只能保证后续的一条写指令或擦除指令可以执行。

2.指令集

instruction:指令

第一行厂商ID;EF,第三行设备ID;如果使用AB和90指令来读就是16,如果使用9F来读就是4017。

标黄色的是我们重点掌握的。

(1)写使能

指令码06。要是想用SPI的话,先起始然后交换一个字节,第一个字节时发送方向,发送0x06就可以了,这个指令后续不用根数据。

(2)写失能

发送04就可以。

(3)读状态寄存器1

需要起始,交换字节,发送指令码05这是读指令,后面有数据,我们需要继续交换字节,通过交换读取一个字节。这个字节就是状态寄存器的S7-S0。S0是BUSY位,S1是WEL位。

(4)页编程

也就是我们写数据的指令。只是有一个256字节页大小的限制。起始交换字节,发送指令02,然后继续交换发送地址的23-16,15-8,0-7位这三个字节用来指定地址。在之后我们就可以写入数据,D7-D0了。这个数据写入到刚才指定的地址下,如果继续写入的话,后续的字节,就从前一个字节的起始地址开始依次储存。但是要注意页的限制。

(5)擦除指令

按64K块进行擦除,按32K扇区进行擦除,按4K块进行擦除。整片擦除。我们用扇区擦除即可,起始,发送指令20,之后再交换发送三个字节的地址,发送后这个指定的地址所在的扇区,会一整个擦除。当然这个地址是精确到某个字节的额,我们一般把字节的首地址对齐扇区首地址。

(6)读取ID号

我们主要用标黄的,起始,交换发送9F,随后连续交换读取3个字节,终止。其中第一个字节是厂商ID,后两个字节是设备ID。

(7)读取数据指令

操作流程是,起始,交换发送字节03,之后交换发送3个字节地址,在之后,就可以读取交换了。D7-D0的数据,就是前面三个地址的数据。如果继续交换读取,后面的数据就是从指定地址开始依次读取。这个读取没有页的限制。

(8)指令时序图

这里和我们SPI指令很像,但是有几个不一样的地方,比如说DO,按理说从机应该通过DO把它回传的数据发过来,但这是一个写入的指令,确实不用回传数据,所以这里DO始终保持高阻态,这里有个mode0又画了一个虚线,写着mode3。这个意思是这个芯片可以兼容SPI的模式0和模式3。为什么可以兼容呢,可以对比一下,发现他们都是下降沿移出,上升沿移入,只是相位不一样。

我们可以规定,再SS下降沿,或者SCK第一个下降沿,都输出B7,然后后续移入数据都是再SCK上升沿,这样就可以兼容模式0和模式3了。

(9)执行编程和擦除的时间

这里的一些参数肯会用到。比如页编程时间,典型时间是0.7ms,最大时间是3ms。

比如扇区擦除时间,典型时间是30ms。

比如块擦除时间,典型时间是120ms,最大时间是150ms。

比如整片擦除时间,典型时间是15s,最大时间是30s。

可以看出Flash芯片写入时间一般再ms级别。

相关推荐
石像鬼₧魂石4 小时前
如何配置Fail2Ban的Jail?
linux·学习·ubuntu
Syntech_Wuz4 小时前
从 STM32 到 SAM D21(一):MPLAB开发环境搭建与图形化配置初探
stm32·mcc·sam d21·mplab x ide·harmony v3
hetao17338374 小时前
2025-12-12~14 hetao1733837的刷题笔记
数据结构·c++·笔记·算法
国科安芯4 小时前
AS32S601型MCU芯片电源管理(PMU)模块详解
单片机·嵌入式硬件·性能优化·架构·risc-v
Nan_Shu_6146 小时前
学习:VueUse (1)
学习
Li.CQ6 小时前
SQL学习笔记(二)
笔记·sql·学习
Huangxy__6 小时前
指针的补充学习
学习
Smartdaili China7 小时前
掌握Java网页抓取:技术与示例完整指南
java·网络·学习·指南·网页·住宅ip·爬虫api
雾削木7 小时前
k230 Pyhton三角形识别
运维·服务器·网络·stm32·智能路由器