当前位置:网站首页 > 技术博客 > 正文

w25q64(STM32通过SPI软件读写W25Q64)



目录

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

这个电路图没啥好说的

引脚 功能 VCC、GND 电源(2.7~3.6V) CS(SS) SPI片选 CLK(SCK) SPI时钟 DI(MOSI) SPI主机输出从机输入 DO(MISO) SPI主机输入从机输出 WP 写保护 HOLD 数据保持

先看右边:存储部分

  • 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 状态寄存器

  1. BUSY位
    • 忙碌(BUSY)是状态寄存器(S0)中的一个只读位,
    • 当设备正在执行页编程、扇区擦除、块擦除、芯片擦除或写状态寄存器指令时,该位被设置为 1 状态。
    • 在此期间,设备将忽略其他指令,除了读状态寄存器和擦除暂停指令(请参阅交流特性中的 tW、tPP、tSE、tBE 和 tCE)。
    • 当编程、擦除或写状态寄存器指令完成时,BUSY位将被清除为 0 状态,表示设备已准备好接受进一步的指令。
  2. 写使能锁存器(WEL)
    • 写使能锁存器(WEL)是状态寄存器(S1)中的一个只读位,
    • 在执行写使能指令后被设置为 1。
    • 当设备被写禁止时,WEL 状态位被清除为 0。
    • 在上电或执行以下任何指令后会出现写禁止状态:写禁止、页编程、扇区擦除、块擦除、芯片擦除和写状态寄存器。 这表明我们在每次写入操作时都要写使能一下
  3. 这两位在寄存器中是这样的。我们要掌握的在最低的两位

(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

当前地址存储为

不擦除直接写入

 
   
  1. 直接写入

    结果。字节中0并未改变

  2. 直接写入

    结果。字节中1全部改变为0

4.多写入一页的数据,超过页尾位置的数据会回到页首覆盖写入

一页的范围是xxxx00到xxxxFF。因此他能存放(0-255)256个字节

现在指定写入的地址为。写入

那么按照规则来说,就会在页尾写入0xAA、页首写入 0xBB 0xCC 0xDD

而另一页并不会写入数据。而读取可以跨页

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

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

版权声明


相关文章:

  • monkey测试常用的命令2025-10-13 17:01:05
  • c++线程之间同步2025-10-13 17:01:05
  • maven中clean和install2025-10-13 17:01:05
  • java迭代器的原理2025-10-13 17:01:05
  • qt下拉框设置下拉列表2025-10-13 17:01:05
  • pc端电子书阅读软件推荐2025-10-13 17:01:05
  • 一句话木马php原理2025-10-13 17:01:05
  • redis16个数据库2025-10-13 17:01:05
  • 黑客工具包v2.1.4安卓中文版2025-10-13 17:01:05
  • okhttp二次封装2025-10-13 17:01:05