2.36 W25Q64

W25Q64简介

W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器,常应用于数据存储、字库存储、固件程序存储等场景。
存储介质:Nor Flash(闪存)
时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI)
存储容量(24位地址):
W25Q40:  4Mbit / 512KByte
W25Q80:  8Mbit / 1MByte
W25Q16:  16Mbit / 2MByte
W25Q32:  32Mbit / 4MByte
W25Q64:  64Mbit / 8MByte
W25Q128:  128Mbit / 16MByte
W25Q256:  256Mbit / 32MByte

W25Q64电路

WP(Write Protect)写保护,配合内部的寄存器配置,可以实现硬件的写保护,写保护低电平有效。
HOLD,数据保持,低电平有效。如果你在正常读写时,突然产生中断,想用SPI通信线去操控其他器件,这时如果把CS置回高电平,那时序就终止了;如果你又不想终止总线,又想操作其他器件,这就可以HOLD置低电平,这样芯片就HOLD住了,芯片释放总线,但是芯片的时序也不会终止,它会记住当前的状态,当你操作完其他的器件时,可以回过来,HOLD置回高电平,然后继续HOLD之前的时序。其实就相当于SPI总线进了一次“中断”。

W25Q64框图

W25Q64容量是8MB,如果不对空间进行划分,直接按照一整块来使用的话,那这一整块的容量就太大了,不利于管理,而且后续涉及到Flash擦除、写入的时候都会有个基本单元,我们要以基本单元为单位进行擦除或者写入。
所以,这里的8MB的存储空间,就有必要进行一些合理的划分。
常见的划分方式是:
一整块存储空间线划分为若干的块(Bolck),其中每一个块(Block)再划分为若干个扇区(Sector),而每一个扇区(Srctor)又会分成很多个页(Page)。
存储器以字节为单位,每个字节都有唯一的地址。W25Q64的地址宽度是24位,就是3个字节,我们可以看到这一整块存储器的地址是从00 00 00h~7F FF FFh。
在这整个空间中,我们以64KB为一个基本单元,把它划分成若干的块(Block)。
我们还要对块(Block)进行更细致的划分,分为很多个扇区(Sector)。
在一个块(Block)里,我们以4KB为一个单元,切成16份扇区(Sector)。
对于地址的划分,到扇区(Sector)就结束了,但是当我们写入数据时,还会有更细的划分,就是页(Page)。
页(Page)是对整个存储空间划分的,当然你也可以把它看作,在扇区里,再进行划分,都是一样的。页(Page)的大小是256个字节,一个扇区(Sector)是4KB,以256个字节划分,可以得到16页(Page)。
我们通过SPI,总共发送3个字节的地址,因为1页是256字节,所以一页内的字节地址,就取决于最低一个字节,而高位的2个字节,就对应的是页地址。所以我们发的3个字节地址,前两个字节会进到页地址锁存计数器中,最后一个字节,会进入到字节地址锁存计数器里。页地址通过写保护和行解码来选择要操作哪一页,字节地址,通过列解码和256字节页缓存来进行指定字节的读写操作。

Flash操作注意事项

写入操作时:
1.写入操作前,必须先进行写使能。
2.每个数据位只能由1改写为0,不能由0改写为1。意思就是Flash并没有像RAM那样的直接完全覆盖改写的能力。比如,在某个字节的存储单元里,存储了0XAA这个数据,对应的二进制就是1010 1010,如果我直接再次在这个存储单元写入一个新的数据0X55,二进制是0101 0101 ,当这个0101 0101要覆盖1010 1010时,就会失败,实际存储的是0000 0000。
3.写入数据前必须先擦除,擦除后,所有数据位变为1。为了弥补第二条的缺陷,Flash引入了“擦除”的概念,擦除会有专门的擦除电路进行,我们只要给他发送擦除的指令就行了,通过擦除电路擦除之后,所有的电路的数据位都变成1。
4.擦除必须按最小擦除单元进行。Flahs擦除有最小单元的限制,你不能指定某个字节的单独擦除,要擦除就需要擦除一大片,这一片具体是多大呢?可以使一整个存储区,也可以是按块(Block)擦除,最小也是按扇区(Sector)进行擦除,也就是最小擦除4KB的空间。
5.连续写入多字节时,最多写入一页的数据,超过页尾位置的数据,会回到页首覆盖写入。意思就是,你在写入的时候,一次性不能写太多,一个写入时序,最多只能写一页的数据,就是256字节。因为有个页缓冲区,它只有256字节。为什么会有页缓存区呢?因为Flash写的太慢,跟不上SPI的时序,所以需要一个RAM里暂存写入的数据。
6.写入操作结束后,芯片进入忙状态,不响应新的读写操作。为什么会忙呢?还是因为Flash写的太慢,页缓存器存的256个字节要慢慢的通过Flash写入。要想知道芯片什么时候结束忙状态了,我们可以使用读取状态寄存器的指令,看一下状态寄存器的BUSY位是否为1,BUSY位为0时,芯片就不忙了,我们再进行操作。
读取操作时:
直接调用读取时序,无需使能,无需额外操作,没有页的限制,读取操作结束后不会进入忙状态,但不能在忙状态时读取。

W25Q64芯片注意事项

W25Q64芯片的状态寄存器有两个,状态寄存器1和状态寄存器2,其中比较重要的是状态寄存器1,状态寄存器1又有两位是比较重要的:
1.第一个是BUSY位,BUSY位就是当芯片进行写入数据、擦除数据和写状态寄存器指令时,BUSY位置1,在这期间设备会忽略进一步的指令。
2.第二个是WEL位,写使能锁存位,在执行完写使能指令后,WEL置1,代表芯片可以进行写入操作了,当设备写失能时,WEL位清0。
什么时候WEL位写失能呢?
(1)、上电后,芯片默认写失能。
(2)、在执行完“写失能指令”、“页编程”和“扇区擦除”等这些写入操作后,WEL会置0。
这表明,当我们先写使能,再执行写入数据操作后,不需要再手动进行写失能了,因为写入操作后会顺便帮我们写失能。同时也表明,当我们在写入任何操作的时候,都需要来一遍写使能。
W25Q64芯片的指令集(Instruction):
写使能,指令码:06h。
读状态寄存器1,指令码:05h。
页编程(写数据),指令码:02h。因为有256字节的限制,所以叫做页编程。
扇区擦除,指令码:20h。
JEDEC ID,指令码:9Fh。读取ID号的指令 , 第一个字节是厂商ID,后面两个字节是设备ID。
读取数据,指令码:03h。