一、目的
前段时间淘了一个STM32H750XBH6_ArtPi开发板,板载两颗华邦的Flash芯片,一颗为W25Q64JV(8Mbytes),通过STM32H750XBH6的QUASDSPI控制用于XIP;一颗为W25Q128JV(16Mbytes)用于数据存储。
那么本篇的目的就是给大家介绍介绍W25Q64JV这块颗粒。
参考官网的资料
二、介绍
W25Q64JV存储容量为8Mbytes,每页256bytes,总共有32768个可编程页,最大一次可编程大小为256bytes。一次擦除大小可以为4K、32K、64K字节(K=1024)或者全擦除。
支持标准SPI、Dual SPI、Quad SPI,最大操作时钟为133MHz。
超过10万次的擦除编程。
编程即写数据,由于Flash的特性,只能从1编程0,所以写数据之前Flash里面的数据不是0xFF就必须先擦除,然后才能写数据。
擦除即将Flash里面的数据恢复为0xFF的过程。
标准SPI使用CS、CLK、DO、DI。
Dual SPI使用CS、CLK、IO0、IO1。
Quad SPI使用CS、CLK、IO0、IO1、IO2、IO3。
无论哪种SPI都是使用半双工方式。
CS拉低则代表设备被选择,即可以读写寄存器或者数据。
注意8bit的指令无论使用什么SPI都是通过DI(IO0)写入设备,也就是说,即使你是Dual、Quad SPI发送8bit指令时,都是通过单线DI写入设备。
从上图可以到一个Sector为4KBytes,一个Block为64KBytes。
SPI支持4中模式(时钟的相位/极性),此Flash支持Mode0和Mode3。
标准SPI指令DI用于输入指令,DO主机从设备读取数据和状态。
当使用指令如Fast Read Dual Output (3Bh)和Fast Read Dual I/O (BBh)时必须使用Dual SPI指令方式。
当使用指令如Fast Read Quad Output (6Bh)和Fast Read Quad I/O (EBh)时必须使用Quad SPI指令方式。需要特别注意Quad SPI指令需要状态寄存器2的QE位设置为1才可以使用(默认就是1),并且该位时非易失的,也就是或如果你改了这个位的状态,断电就会一直保存其值。
软复位需要依次执行两条指令Enable Reset (66h) & Reset (99h)(复位使能指令和复位指令)。在复位期间不处理任何新指令。
写保护说明
上电后设备自动进行写禁止状态(WEL为0,WEL是只读位)。在Page Program, Sector Erase, Block Erase, Chip Erase or Write Status Register instruction(页编程、区擦除、块擦除、芯片擦除或者写状态寄存器指令)之前必须先进行写使能指令。在编程、擦除、写状态寄存器指令完成后,WEL自动变成0。
BUSY位是状态寄存器0的第0位,并且是只读位,当执行页编程、区擦除、块擦除、芯片擦除、写状态寄存器、擦除/编程安全寄存器指令时,其值位1;并且在此期间不再接收新的指令,但是可以接收读状态寄存器指令和擦除编程挂起指令。
QE位出厂时被设置为1,并且不能被设置为0。有些型号的Flash QE是设置为0的。
在时钟的上升沿采样数据,并且是MSB,即第一个bit为最高bit位。
三、寄存器说明
写使能寄存器
读状态寄存器
可以一次读指令连续读出多次状态值,一般情况下,我们会一次读一个值,然后延时一段时间再重新读取。
标准SPI读取数据指令
可以一次读取多个数据,内部地址自增,这样我们就可以一次读取指定字节的数据。
单线快速读取数据指令
该指令与指令03h的区别就是,可以用最大时钟频率去读取,但是需要添加一个dummy byte(虚拟字节),不关系其具体值。一般可以设置位0xFF。
双线快速读取数据指令
四线快速读取数据指令
注意上面的读取操作,指令、地址、虚拟字节都是DI(IO0)上传递,其他IO1-IO3都是高阻状态
下面这条读取指令地址阶段也是两条数据线进行传递。
下面这条指令地址阶段、交替字节(0xFxh)、虚拟字节、数据阶段都是四条线传递
页编程
一次页编程的最大大小为256个字节,如果是满页写,要注意地址一定要被256整除;
当然也可以进行部分写,比如说写10字节。
在进行部分写的时候如果超过当前页的地址范围,就会回到该页开头覆盖写。
在写的过程中可以检查BUSY位,以确定是否已经写完成。
四线页编程
跟一线页编程行为基本一样。
区擦除
一次擦除4KBytes,擦除之前必须发送写使能指令,然后发送擦除指令,擦除完毕BUSY会自动变为0。
块擦除指令
和区擦除指令一样,区别只是一次擦除32Kbytes。
块擦除指令
和区擦除指令一样,区别只是一次擦除64Kbytes。
芯片擦除指令
一次全擦除指令,不建议经常使用,耗时并且会损耗Flash。
读取厂商/设备编号
至此,对于芯片手册的学习基本完成。后面我会基于STM32XBH6_ArtPi开发板分别介绍如何使用STM32的QSPI和SPI分别实现对Flash的读写。