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。