目录
一、Flash存储芯片W25Q128FW
1、W25Q128硬件接口和连接
2、存储空间划分
3、数据读写的原则
4、操作指令
(1)“写使能”指令
(2)“读数据”指令
(3)“写数据”指令
5、状态寄存器SR1
二、Flash存储芯片W25Q16JV
一、Flash存储芯片W25Q128FW
1、W25Q128硬件接口和连接
W25Q128FWFIG是一个Flash存储芯片,容量为128Mbit,也就是16MB。W25Q128支持标准SPI,除标准SPI外还支持Dual/Quad SPI。若W25Q128工作于Dual/Quad SPI通信模式,需要连接的MCU也支持Dual/QuadSPI通信。具有QUADSPI接口的MCU才支持Dual/Quad SPI通信,如STM32F214、STM32G474等。STM32F407只有标准SPI接口,不支持Dual/Quad SPI通信。
W25Q128的各个引脚的功能描述如下(以普中PZ6808L或T300开发板原理图为例):
- DO、DI、CLK这3个SPI引脚与MCU的SPI1接口的相应引脚连接,占用PB4、PB5、PB3引脚。
- 片选信号CS与MCU的PB14连接,由MCU通过GPIO引脚PB14的输出控制W25Q128的片选状态。
- WP是写保护设置引脚,WP为低电平时,禁止修改内部的状态寄存器,与状态寄存器的一些位配合使用,可以对内部的一些存储区域进行写保护。电路中将WP接高电平,也就是不使用此写保护信号。
- HOLD是硬件保持信号引脚。当器件被选中时,如果HOLD输入为低电平,那么DO引脚变为高阻态,DI和CLK的输入被忽略。当HOLD输入为高电平时,SPI的操作又继续。这里将HOLD引脚接电源,就是不使用保持功能。
W25Q128支持SPI模式0和模式3。在MCU与W25Q128通信时,设置使用SPI模式3,即设置CPOL=1,CPHA=1。
2、存储空间划分
W25Q128总容量为16MB,使用24位地址线,地址范围是0x000000~0xFFFFFF。16MB分为256个块(Block),每个块的大小为64KB,16位偏移地址,块内偏移地址范围是0x0000~0xFFFF。
每个块又分为16个扇区(Sector),共4096个扇区,每个扇区的大小为4KB,12位偏移地址,扇区内偏移地址范围是0x000~0xFFF。
每个扇区又分为16个页(Page),共65536个页,每个页的大小为256字节,8位偏移地址,页内偏移地址范围是0x00~0xFF。
3、数据读写的原则
从W25Q128读取数据时,用户可以从任意地址开始读取任意长度的数据。
向W25Q128写入数据时,用户可以从任何地址开始写数据,但是一次SPI通信写入的数据范围不能超过一个页的边界。所以,如果从页的起始地址开始写数据,一次最多可写入一个页的数据,即256字节。如果一次写入的数据超过页的边界,会再从页的起始位置开始写。向存储区域写入数据时,存储区域必须是被擦除过的,也就是存储内容是0xFF,否则写入数据操作无效。用户可以对整个器件、某个块、某个扇区进行擦除操作,但是不能对单个页进行擦除。
4、操作指令
SPI的硬件层和传输协议只是规定了传输一个数据帧的方法,对具体的SPI器件的操作由器件规定的操作指令实现。W25Q128制定了很多的操作指令,用以实现各种功能。W25Q128的操作指令由1字节或多字节组成,指令的第1个字节是指令码,其后跟随的是指令的参数或返回的数据。W25Q128常用的几个指令如表。表中用括号表示返回的数据,A23~A0是24位的全局地址,dummy表示必须发送的无效字节数据,一般发送0x00。
指令名称 | BYTE1指令码 | BYTE2 | BYTE3 | BYTE4 | BYTE5 | BYTE6 |
写使能 | 0x06 | —— | —— | —— | —— | —— |
读状态寄存器1 | 0x05 | (S7~S0) | —— | —— | —— | —— |
读状态寄存器2 | 0x35 | (S15~S8) | —— | —— | —— | —— |
读厂家和设备ID | 0x90 | dummy | dummy | 0x00 | (MF7~MF0) | (ID7~ID0) |
读64位序列号 | 0x4B | dummy | dummy | dummy | dummy | (ID63~ID0) |
器件擦除 | 0xC7/0x60 | —— | —— | —— | —— | —— |
块擦除(64KB) | 0xD8 | A23~A16 | A15~A8 | A7~A0 | —— | —— |
扇区擦除(4KB) | 0x20 | A23~A16 | A15~A8 | A7~A0 | —— | —— |
写数据(页编程) | 0x02 | A23~A16 | A15~A8 | A7~A0 | D7~D0 | —— |
读数据 | 0x03 | A23~A16 | A15~A8 | A7~A0 | (D7~D0) | —— |
快速读数据 | 0x0B | A23~A16 | A15~A8 | A7~A0 | dummy | (D7~D0) |
以几个指令为例,说明指令传输的过程,以及返回数据的读取等原理。
(1)“写使能”指令
“写使能”指令(指令码0x06)只有一个指令码,其传输过程如图所示。一个指令总是从片选信号CS由高到低的跳变开始,片选信号CS由低到高的跳变结束。
CS变为低电平后,MCU向W25Q128传输1字节数据0x06,然后结束SPI传输即可。W25Q128接收数据后,根据指令码判断指令类型,并进行相应的处理。“写使能”指令是将状态寄存器1的WEL位设置为1,在擦除芯片、擦除扇区等操作之前必须执行“写使能”指令。无返回数据的指令的操作都与此类似,就是连续将指令码、指令参数发送给W25Q128即可。
(2)“读数据”指令
“读数据”指令(指令码0x03)用于从某个地址开始读取一定个数的字节数据,其时序如图16-6所示。地址A23~A0是24位全局地址,分解为3字节,在发送指令码0x03后,再发送3字节的地址数据。然后MCU开始从DO线上读取数据,一次读取1字节,可以连续读取,W25Q128会自动返回下一地址的数据。
(3)“写数据”指令
“写数据”指令(指令码0x02)就是数据手册上的“页编程”指令,用于向任意地址写入一定长度的数据。“写数据”指令的时序如图所示,图中是向一个页一次写入256字节的数据。一个页的容量是256字节,写数据操作一次最多写入256字节。如果数据长度超过256字节,会从页的起始位置开始继续写。所以,如果要一次写入256字节的数据,写入的起始地址必须是页的起始地址。
"写数据"指令的起始地址可以是任意地址,数据长度也可以小于256,但如果写的过程中地址超过页的边界,就会从页的起始地址开始继续写。
写数据操作的存储单元必须是被擦除过的,也就是内容是0xFF。如果存储单元的内容不是0xFF,那么重新写入数据无效。所以,已经写过的存储区域是不能重复写入的,需要擦除后才能再次写入。
5、状态寄存器SR1
W25Q128有3个状态寄存器(status register),用于对器件的一些参数进行配置,或返回器件的当前状态信息。对W25Q128的编程最常到状态寄存器SR1,其各个位的定义见表。
位编号 | 位名称 | 功能说明 | 存储特性 | 读/写特性 |
S7 | SRP0 | 状态寄存器保护位0 | 非易失 | 可写 |
S6 | SEC | 扇区保护 | 非易失 | 可写 |
S5 | TB | 顶/底保护 | 非易失 | 可写 |
S4 | BP2 | 块保护位2 | 非易失 | 可写 |
S3 | BP1 | 块保护位1 | 非易失 | 可写 |
S2 | BP0 | 块保护位0 | 非易失 | 可写 |
S1 | WEL | 写使能锁存 | 易失 | 只读 |
S0 | BUSY | 有正在进行的擦除或写操作 | 易失 | 只读 |
通过读状态寄存器SR1的指令(指令码0x05),我们可以读取SR1的内容。状态寄存器中某些位是可写的,是指可以通过写状态寄存器的指令修改这些位的内容;某些位是非易失的,是指修改的内容可永久保存,掉电也不会丢失。
SR1中有2个位在编程中经常用到:WEL位和BUSY位。
写使能锁存(Write Enable Latch,WEL)位是只读的。器件上电后,WEL位是0。只有当WEL位是1时,才能进行擦除芯片、擦除扇区、页编程等操作。这些操作执行完成后,WEL位自动变为0。只有执行“写使能”指令(指令码0x06)后,WEL位才变为1。所以,在进行擦除芯片、擦除扇区、页编程等操作之前,"写使能"指令是必须先执行的。
BUSY位是只读的,表示器件是否处于忙的状态。如果BUSY位是1,表示器件正在执行页编程、扇区擦除、器件擦除等操作。此时,除了“读状态寄存器”指令和“擦除/编程挂起”指令,器件会忽略其他任何指令。当正在执行的页编程、擦除等指令执行完之后,BUSY位自动变为0,这意味着可以继续执行其他指令了。
其他位以及状态寄存器SR2和SR3的具体定义,可以查阅W25Q128的数据手册。一定要注意,在没有完全搞清楚状态寄存器各个位的意义和用法之前,请勿随便修改状态寄存器的内容,因为有些位是非易失的,有些位还是一次性编程的,修改状态寄存器的内容可能改变器件的特性,甚至造成器件无法再使用。