dz网站设置了关键词但是不显示扬中网站定制
目录
一、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的数据手册。一定要注意,在没有完全搞清楚状态寄存器各个位的意义和用法之前,请勿随便修改状态寄存器的内容,因为有些位是非易失的,有些位还是一次性编程的,修改状态寄存器的内容可能改变器件的特性,甚至造成器件无法再使用。
