目录
STM32通过SPI软件读写W25Q64
1. W25Q64简介
2. W25Q64硬件电路图
3. W25Q64芯片框图
先看右边:存储部分
SPI控制逻辑部分:SPICommand &Control Logic
SPI状态寄存器 StatusRegister
SPI写控制逻辑 Write Control Logic
SPI高电压生成器High Voltage Generators
SPI页地址锁存/计数器、字节地址锁存/计数器
4. Flash操作注意事项
5. W25Q64手册精简
(11.1 )STATUS REGISTER 状态寄存器
(11.2.1)Manufacturer and Device Identification 制造商和设备标识
(11.2.2) Instruction Set Table SPI 指令集 (常用标记)
6. W25Q64读写存储器编写
7.1编写时需要注意的点
7.2程序文件简要说明:
W25Q64.c
W25Q64.h
W25Q64_Ins.h
main.c
7. 验证Flash注意事项
1. Flash操作注意事项
2. 验证Flash擦除之后变为全1
3. 验证每个数据位只能由1改写为0,不能由0改写为1
4.最多写入一页的数据,超过页尾位置的数据会回到页首覆盖写入
SPI通信详解可以看我的这篇博客:SPI通信详解-CSDN博客
STM32硬件SPI通信详解可以看我的这篇博客:STM32通过SPI硬件读写W25Q64-CSDN博客
- W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器,常应用于数据存储、字库存储、固件程序存储等场景
- 存储介质:Nor Flash(闪存)
- 时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI) 可以在只发或者只收的时候,把不用的引脚(比如写保护、或者不用的发送、接收引脚)暂时当做数据传输用的。(这里只做了解)
- 支持SPI模式0和模式3
- 存储容量(24位地址):
- W25Q40: 4Mbit / 512KByte
- W25Q80: 8Mbit / 1MByte
- W25Q16: 16Mbit / 2MByte
- W25Q32: 32Mbit / 4MByte
- W25Q64: 64Mbit / 8MByte
- W25Q128: 128Mbit / 16MByte
- W25Q256: 256Mbit / 32MByte



这里的小括号IO1、2、3、4就是介绍时所说的双重SPI和四重SPI
这个电路图没啥好说的

先看右边:存储部分
- W25Q64的地址宽度是24位。也就是三个字节。
- 右边这一整块是所有的存储器。存储器以字节为单位。每个字节都有一个对应的地址,左下角为起始地址,右上角为结束地址
- 右上角的最大地址为7FFFFFh(因为W25Q64的芯片最大容量为8M,只用了一半的地址空间)
- 整个存储器分为128块(块0~块7F),以64KB为一块。
- 两个例子↓
- 块0 起始地址:000000 结束地址:00FFFF
- 块15 起始地址:0F0000 结束地址:0FFFFF
- 一个块又分为16个扇区(扇区0~扇区F),以4KB为一扇区。
- 两个例子↓
- 块0 ,扇区2 起始地址:002000 结束地址:002FFF
- 块15 , 扇区14 起始地址:0FE000 结束地址:0FEFFF
- 一个扇区又分为16页(页0~页F),以256字节为一页
- 两个例子↓
- 块0 ,扇区2 ,页12 起始地址:002C00 结束地址:002CFF
- 块15 , 扇区14 ,页3 起始地址:0FE300 结束地址:0FE3FF
SPI控制逻辑部分:SPICommand &Control Logic
芯片内部可以进行地址锁存、数据读写等操作。引出的引脚是我们用来操作的。
SPI状态寄存器 StatusRegister
检测芯片是否处于忙状态、是否写使能、是否写保护等等。都是在状态寄存器中体现
SPI写控制逻辑 Write Control Logic
与外部WP引脚相连。可以用来进行写保护
SPI高电压生成器High Voltage Generators
配合Flash进行编程用的。为了使芯片掉电不丢失
SPI页地址锁存/计数器、字节地址锁存/计数器
这两个寄存器就是用来指定地址的。
我们发的前两个字节会进入页地址锁存计数器中。最后一个字节会进入字节锁存计数器中。
- 页地址通过写保护和行解码决定操作那一页。
- 字节地址通过列解码和256页缓存决定指定地址的读写操作
- 页缓存区是一个256字节的RAM存储器
- 数据写入就是通过这个RAM缓存区来进行的。
- 因为Flash存储信息较慢,而RAM读写信息很快。
- 所以需要RAM先临时保存,Flash根据RAM存储器来进行存储操作。
- 所以也有一个规定:一次写的字节数不能超过256字节
- 在在写入时序之后,芯片会进入一段忙的状态(忙着把RAM中的信息存储到Flash中)这个忙的状态会通过一条线,连接SPI状态寄存器。给状态寄存器的BUSY位置1。
- 因为读取只是看一眼状态,不需要改变,所以读取时很快的。基本不会受到限制
- 并且因为这两个寄存器都有计数器,所以在读写之后会指针+1
写入操作时:
- 写入操作前,必须先进行写使能
- 每个数据位只能由1改写为0,不能由0改写为1
所以写入数据前必须先擦除,擦除后,所有数据位变为1
- 擦除必须按最小擦除单元进行(整个芯片、按块、按扇区)
- 连续写入多字节时,最多写入一页的数据,超过页尾位置的数据,会回到页首覆盖写入 写入操作结束后,芯片进入忙状态,不响应新的读写操作
读取操作时:
- 直接调用读取时序,无需使能,无需额外操作,没有页的限制,读取操作结束后不会进入忙状态,但不能在忙状态时读取
这里只精简出一般需要的。其他位请详看手册。括号内是对应手册的章节
(11.1 )STATUS REGISTER 状态寄存器
- BUSY位
- 忙碌(BUSY)是状态寄存器(S0)中的一个只读位,
- 当设备正在执行页编程、扇区擦除、块擦除、芯片擦除或写状态寄存器指令时,该位被设置为 1 状态。
- 在此期间,设备将忽略其他指令,除了读状态寄存器和擦除暂停指令(请参阅交流特性中的 tW、tPP、tSE、tBE 和 tCE)。
- 当编程、擦除或写状态寄存器指令完成时,BUSY位将被清除为 0 状态,表示设备已准备好接受进一步的指令。
- 写使能锁存器(WEL)
- 写使能锁存器(WEL)是状态寄存器(S1)中的一个只读位,
- 在执行写使能指令后被设置为 1。
- 当设备被写禁止时,WEL 状态位被清除为 0。
- 在上电或执行以下任何指令后会出现写禁止状态:写禁止、页编程、扇区擦除、块擦除、芯片擦除和写状态寄存器。 这表明我们在每次写入操作时都要写使能一下
- 这两位在寄存器中是这样的。我们要掌握的在最低的两位

(11.2.1)Manufacturer and Device Identification 制造商和设备标识

(11.2.2) Instruction Set Table SPI 指令集 (常用标记)

7.1编写时需要注意的点
一定要先看懂时序图再去编写存储器 的 读写时序
需要注意Flash的操作注意事项
写入操作时:
- 写入操作前,必须先进行写使能
- 每个数据位只能由1改写为0,不能由0改写为1
所以写入数据前必须先擦除,擦除后,所有数据位变为1
- 擦除必须按最小擦除单元进行(整个芯片、按块、按扇区)
- 连续写入多字节时,最多写入一页的数据,超过页尾位置的数据,会回到页首覆盖写入 写入操作结束后,芯片进入忙状态,不响应新的读写操作
读取操作时:
- 直接调用读取时序,无需使能,无需额外操作,没有页的限制,读取操作结束后不会进入忙状态,但不能在忙状态时读取
7.2程序文件简要说明:
- MySPI:为了防止与stm32函数重名,所以添加了My前缀。 主要是为了完成SPI的三个基本时序
- MySPI.h:函数声明
- W25Q64.c:初始化W25Q64存储寄存器。完成读写、擦除存储器的时序
- W25Q64.h:函数声明、数据结构体声明
- W25Q64_Ins.h:控制存储器时需要用到的指令集
- main.c:测试SPI读取存储器结果。
MySPI.c
MySPI.h
W25Q64.c
W25Q64.h
W25Q64_Ins.h
main.c
1. Flash操作注意事项
写入操作时:
- 写入操作前,必须先进行写使能
- 每个数据位只能由1改写为0,不能由0改写为1
所以写入数据前必须先擦除,擦除后,所有数据位变为1
- 擦除必须按最小擦除单元进行(整个芯片、按块、按扇区)
- 连续写入多字节时,最多写入一页的数据,超过页尾位置的数据,会回到页首覆盖写入 写入操作结束后,芯片进入忙状态,不响应新的读写操作
读取操作时:
- 直接调用读取时序,无需使能,无需额外操作,没有页的限制,读取操作结束后不会进入忙状态,但不能在忙状态时读取
2. 验证Flash擦除之后变为全1
只擦除,不写入,直接读取

3. 验证每个数据位只能由1改写为0,不能由0改写为1
当前地址存储为
不擦除直接写入
- 直接写入
结果。字节中0并未改变

- 直接写入
结果。字节中1全部改变为0

4.最多写入一页的数据,超过页尾位置的数据会回到页首覆盖写入
一页的范围是xxxx00到xxxxFF。因此他能存放(0-255)256个字节
现在指定写入的地址为。写入
那么按照规则来说,就会在页尾写入0xAA、页首写入 0xBB 0xCC 0xDD
而另一页并不会写入数据。而读取可以跨页
从页尾开始读取结果如下:

从页首开始读取结果如下:

版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/1254.html