W25Q64简介

  • W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器,常应用于数据存储、字库存储、固件程序存储等场景。
    数据存储比如STM32有一些参数或者采集的数据想要掉电不丢失的保存,那就可以写入这个芯片里面。
    字库存储,这个可以应用到一些显示屏上,比如OLED显示屏或者LCD液晶屏,如果想要在屏幕上显示汉字,就需要把汉字的点阵数据存起来,所以可以利用这个芯片来存储汉字字库的点阵数据。在显示某个汉字前,先读取芯片查询字库,再在显示屏上显示对应的点阵数据,这样就可以让显示屏任意显示中文。
    固件程序存储,这个就相当于直接把程序文件下载到外挂芯片里面,需要执行程序的时候,直接读取外挂芯片的程序文件来执行。
  • 存储介质: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
    在这里插入图片描述

    硬件电路

在这里插入图片描述

WP是写保护,可以实现硬件的写保护,低电平有效,WP低电平就保护住不让写了。
HOLD是数据保持,低电平有效,就是如果在在正常的读写的时候突然产生中断然后想用SPI通信线去操控其他的器件的时候,这个时候可以用HOLD引脚置低电平,芯片时序会记住当前的状态不会终止,当操作完其他的器件时,回过来继续HOLD之前的时序。
这两个功能都是低电平有效,都接VCC就是这两个功能都不用。
C1这个电容直接接的VCC和GND是一个电源滤波,可以改善电源的质量,使电源输出稳定,这个灯也接的VCC和GND ,上电后就亮了。
在这里插入图片描述
在这里插入图片描述

W25Q64框图

在这里插入图片描述
首先,右上角的这一大块描述的是存储器的规划示意图,我们这个W25Q64容量是8MB,如果不进行划分而按照一整块来使用的话,那么这一整块的容量就太大了,不利于管理,而且后续涉及到Flash擦除或者写入的时候都会有一个基本单元,我们需要以基本单元为单位进行,所以这一整块8MB的存储空间就需要进行一些合理的划分。
存储器以字节为单位,每个字节都有唯一的地址,W25Q64的地址宽度是24位3个字节,所以是从000000h到7FFFFFh,h代表16进制,24位地址最大寻址范围是16MB,2^24次方=16777216/(1024*1024)=16MB,我们的这个芯片只有8MB所以地址空间只用了一半,整个空间以64KB位单元划分成128块,8MB/64KB=128块
接着对块进行更细的划分,分为多个扇区Sector,以4KB为一个单元进行划分成16个扇区,16KB/4KB=16份,最后再将扇区划分为页Page,页的大小是256个字节,4KB/256字节=16页
简单来说,就是把8MB的存储器先分成128块(Block),再把每一块分成16扇(Sector),再把每一扇分成大小为256Byte的16页(Page)。
左下角这是SPI控制逻辑,也就是芯片内部进行地址锁存、数据读写等操作,都可以由控制逻辑来自动完成、控制逻辑的左边就是SPI的通信引脚,这些引脚就和我们的主控芯片相连,主控芯片通过SPI协议把指令和数据发给控制逻辑,控制逻辑就会自动操作内部电路来完成我们想要的功能
控制逻辑上面有一个状态寄存器,比如芯片是否处于忙状态、是否写使能、是否写保护都可以在这个状态寄存器里体现,再上面是写控制寄存器和外部的WP引脚相连,配合WP引脚实现硬件写保护,右边第一个是一个高电压生成器,配合Flash进行编程的, 第二个是页地址锁存/计数器,然后下面还有字节地址锁存/计数器,这两个地址锁存和计数器是用来指定地址的,我们通过SPI总共发来3个字节的地址,一页内的字节地址取决于发来的最低一个字节,而高位的两个字节就对应的是页地址,所以这里我们发的3个字节地址,前两个字节会进到这个页地址锁存/计数器里面,最后一个字节会进入到字节地址锁存/计数器里,然后页地址通过这个写保护和行编码来确定具体操作哪一页,字节地址通过这个列编码和256字节页缓存来指定字节的读写操作。因为地址锁存都是有一个计数器的,所以这个地址指针在读写之后就可以自动加1,这样就可以实现从指定地址开始连续读写多个地址的目的了。256字节页缓存区是一个256字节的RAM存储器,写入数据会先放到缓存区里面,然后在时序结束后,芯片再将缓存区里的数据复制到对应的Flash里,进行永久保存。

  • 状态寄存器
    BUSY位,当设备正在执行页面编程(写数据)、扇区擦除、块擦除、芯片擦除或写入状态寄存器指令时,该位会被设置为1状态。在这段时间内,设备将忽略其他指令,除了读取状态寄存器和擦除暂停指令(参见AC特性中的tW、tPP、tSE、tBE和tCE)。当编程、擦除或写入状态寄存器指令完成后,BUSY位将被清除为0状态,表示设备已准备好接收进一步的指令。
    WEL写使能锁存位,在执行写使能指令后被设置为1。当设备被写失能时,WEL状态位会被清除为0。写失能状态会在上电或执行写失能、页编程、扇区擦除、块擦除、芯片擦除和写状态寄存器指令后发生。这表明在进行任何写操作前都得进行一遍写使能,因为在进行完写操作会自动失能。

Flash操作注意事项

写入操作时:

  • 写入操作前,必须先进行写使能
  • 每个数据位只能由1改写为0,不能由0改写为1
  • 写入数据前必须先擦除,擦除后,所有数据位变为1
  • 擦除必须按最小擦除单元进行
  • 连续写入多字节时,最多写入一页的数据,超过页尾位置的数据,会回到页首覆盖写入
  • 写入操作结束后,芯片进入忙状态,不响应新的读写操作
    读取操作时:
  • 直接调用读取时序,无需使能,无需额外操作,没有页的限制,读取操作结束后不会进入忙状态,但不能在忙状态时读取

指令集

  • Write Enable,写使能,指令码0x06;
  • Write Disable,写失能,指令码0x04;
  • Read Status Register-1,读状态寄存器1,指令码0x05,这个指令是读指令,后面有数据,我们要继续交换字节,这条指令主要是用来查看忙状态的。
  • Page Program,页编程,指令码0x02,这个页编程就是写数据,操作流程:起始,交换字节发送指令0x02,然后继续交换发送地址的23-16位,15-8位,7-0位,这三个字节是用来指定地址的,再后面我们就可以写入数据了,这个数据写入到刚才指定的地址下,如果继续写入的话后续的数据就会从起始地址依次存储了,但是要注意页的范围限制。
  • Sector Erase (4KB),扇区擦除,指令码0x20。
  • JEDEC ID,读取ID号,指令码0x9F。
  • Read Data,读取数据,指令码0x03,操作流程:起始,交换字节发送指令0x03,然后继续交换发送地址的23-16位,15-8位,7-0位,这三个字节是用来指定地址的,再后面我们就可以读取数据了,这个数据读取的就是刚才指定的地址下的数据,如果继续读取的话后续的数据就会从起始地址依次读取了,没有页的范围限制。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐