W25Qxx简介
存储器:存储器分为了易失性存储器和非易失性存储器,易失性存储器一般就SRAM,DRAM;非易失性存储器一般为E2PROM、Flash。这两种存储器的区别就是易失性存储器会掉电丢失,非易失性存储器不会掉电丢失
字库存储:就是我们让我们的文字都存到该芯片当中,当我们需要进行显示某个汉字的时候,先读取芯片查询字库,再在显示屏上显示对应的点阵数据,这样就可以让显示屏,任意显示中文了。
固件程序存储:直接将我们的程序文件下载到外挂芯片当中,当要执行程序的时候直接读取外挂芯片的程序文件来执行。即XIP(execute in place)就地执行。
存储介质:Nor Flash,即闪存。闪存分为了Nor Flash和Nand Flash。
时钟频率:SCL时钟线的最大频率是80MHz,比STM32要快,所以后面写时序的时候我们就不需要进行延迟的操作了。后面的160MHz是双重SPI(双重SPI的意思就是我的MISO和MOSI都可以进行输出和输入的操作,这样我的一个时钟就会读取或者发送两位数据,那么相比于普通的SPI我的速率就是进行了翻倍),而320MHz是4重SPI(四重SPI是通过MISO、MOSI、WP(写保护)、HOLD(数据保持,也就是当我们主机需要执行别的操作时,可以通过该引脚来暂停SPI的时序,执行完操作之后我们可以接着之前的时序继续,相当于SPI总线进入了一次中断,并且在中断里面还可以i使用SPI干其他的事情,与CS变为高电平停止了整个SPI时序不同)都为数据引脚实现的)
需要注意的是对于W25Q256来说24位的地址是远远不够的,所以该芯片分为了两种模式也就是3字节地址模式和4字节地址模式,在3字节模式下,只能读写前16MB的数据,4字节地址就可以进入该芯片的所有地址单元了。
硬件电路
引脚定义+引脚的功能得出现需要注意的地方:
VCC和GND知道该设备是3.3V的设备,因此不能够直接接入5V的电压
/CS:SPI的片选引脚。CS左边一个“/”表示低电平有效或者原理图当中的CS上面画了一条横线都表示低电平有效。
DO、WP、HOLD、DI都有一个括号:如果是双重SPI那么DO和DI变成对应括号内的引脚,这样这两个引脚可以同时进行收发数据,如果是四重SPI,那么WP和Hold就会变为括号内的引脚,那么CS、CLK、DI、DO都会作为数据收发引脚,从而能够完成一个时钟四个数据位。
原理图
U1是W25Q64的芯片,J1是该芯片的排针。芯片上的VCC通过8号接到了排针的VCC,芯片GND(电源负极)通过GND编号接到排针3号脚,芯片SPI的四个脚就直接通过排引出来接到对应的排针的引脚上。HOLD和WP低电平有效,直接接到了电源的正极说明我们不需要这两个引脚。C1电容接到了VCC和GND说明我们的电容式滤波电容。
W25Q64框图
上图虚线所有涉及到的地方都是存储器的规划示意图,我们的地址是从0x000000~0x7FFFFF,之所以是到0x7FFFFF不是到0xFFFFFF是因为我们的芯片是8MB的存储空间。我们将我们的8MB以64kb位一个Block进行分组,总共可以分配8*1024/64=128个Block单元。在每一个Block内部,它的地址变化范围只有最低的2个字节都是从xx0000~xxFFFF。左边虚框内部就是我们还要对每一块进行更细的划分,以4kb分为16个扇区Sector,因此在每一个Block内部都可以分为Sector0 ~ Sector15,每个扇区内部的地址变化规律为xxx000~xxxFFF。在每一个扇区的内部又可以划分为4kb * 1024 / 256 = 16页,页的地址变化范围是xxxx00~xxxxFF。
左下角的是SPI控制逻辑:即芯片内部进行地址锁存、数据读写等操作都可以由控制逻辑来自动完成。在控制逻辑的左边就是SPI的通信引脚。
状态寄存器:芯片是否Busy、是否能写使能、是否写保护,都可以在状态寄存器内部体现。
写控制逻辑(Write Control Logic):和外部的WP相连,是用来配合WP引脚来实现硬件写保护的。
高压生成器(High Voltage Generators):是配合Flash来进行编程的,因为Flash是掉电不丢失的,所以需要高压来形成一个通电,断电都不会改变的状态。
页地址锁存/计数器(Page Address Latch / Counter),字节地址所存/计数器(Byte Address Latch / Counter)是用来指定地址的,通过SPI总共发送过来3个字节的地址,我们发送的3个字节的地址,前两个字节的地址会进入到页地址锁存计数器当中,最后一个字节会会进入到字节地址锁存计数器当中。然后页地址通过写保护和行解码来选择我要操作哪一页,字节地址会通过列解码和256字节页缓存来进行指定字节的读写操作。地址锁存都有一个计数器,所以,我们的地址指针在读写之后可以进行自增,这样就可以实现从指定地址开始,连续读写多个字节的目的了。
页缓存区(Column Decode And 256-Byte Page Buffer):256字节的RAM存储器,数据的读写就是通过该缓存区来进行的,我们写数据会先将数据放入到缓存区当中,当我们的时序结束之后我们的缓存区会将数据存入到我们指定的地址当中。由于SPI的写发送和存储速度不一样,所以需要一个缓存,又因为RAM是256字节的,所以就规定了我们一个时序最多不能发送超过256字节的数据。当我们写完数据之后,数据会从该缓存区进入到存储器内部,此时SPI会进入到忙的状态,这时就会给状态寄存器的Busy位置1,当芯片忙的时候就不会再响应新的时序了。读取也是从缓存区读取的,读取基本不花时间
Flash操作注意事项 ![](https://img-blog.csdnimg.cn/c3eb1615c4bc4031a336b11ee0275dab.png)
写入规范:
1.写入写使能(使用SPI发送一个写使能的指令就可以完成了)
2.客1到0,不可0到1(Flash没有像RAN那样直接完全覆盖写的能力)
3.先擦再写,擦除都为1,咋Flash当中FF表示空白而不是00
4.只擦最小单元,即按照块、扇区进行擦除
5.每个时序最多可写256字节数据,必须从页的起始地址开始写才可以最多写256个字节的数据。如果从页的中间开始写的话当指针指到了第256个字节的数据,那么写到页尾时就会回到页首。在进行多字节写入时,地址的范围,不能跨越页的边沿,否则会地址错乱。
6.写入操作(包括擦除)结束之后芯片会进入忙的状态,不响应新的读写操作。
读取规范:
1.不用使能
2.无页限制
3.读取操作后不会忙状态,但不能够再忙状态进行读取
手册
状态寄存器1:
该寄存器有两个重要的位,分别是Busy和Write Enable Latch(WEL)。
Busy:
当我们处于写入、擦除、写状态寄存器的指令时(除读状态寄存器和擦除挂起指令)Busy位置1,当写入、擦除、写状态寄存器结束之后Busy置0。
WEL:
执行完写使能指令后,WEL置1,代表芯片可以进行写入操作了,当写失能时(上电后芯片默认写失能,执行了写使能、页编程、擦除、写状态寄存器时转变为失能,这就说明了每次写的时候都要进行写使能),WEL置0
指令集(INSTRUCTIONS)
Manufacturer and Device Identification(生产商和设备ID号)
Manufacturer ID :EFh
Device ID:16h(ABh,90h指令来读) or 4017h(9Fh指令)
Write Enable(写使能) :06h
Write Disable : 04h
Read Status Register-1:05h,可以用来查看忙状态
Page Program : 02h,页编程,即写数据
Sector Erase : 20h,擦除某个地址所在的扇区,一般会将地址对齐到扇区的首地址
JEDEC ID:9Fh,读取ID号,读取三个字节,第一个字节时厂商ID ,后两个字节是设备ID
Read Data:03h,读取数据