非易失性存储器·W25Q64使用手册解读

目录
1. 简介
2. 引脚定义
3. 设计框图
3.1 控制逻辑
3.2 存储逻辑
4. 指令集
4.1 写使能指令(06h)
4.2 写禁止指令(04h)
4.3 读状态寄存器指令(05h)
4.4 写状态寄存器指令(01h)
4.5 读数据指令(03h)
1. 简介
W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器,常应用于数据存储、字库存储、固件程序存储等场景。

存储介质:Nor Flash(闪存)
时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI)

| 芯片型号 | 存储容量(24位地址) |
| W25Q40 | 4Mbit / 512KByte |
| W25Q80 | 8Mbit / 1MByte |
| W25Q16 | 16Mbit / 2MByte |
| W25Q32 | 32Mbit / 4MByte |
| W25Q64 | 64Mbit / 8MByte |
| W25Q128 | 128Mbit / 16MByte |
| W25Q256 | 256Mbit / 32MByte |
对于上述数据怎么来的呢?我们可以参考数据手册,对于W25Q64其是 64Mbit 的容量,而1数据位是8字节,那么 64Mbit 就是 8MByte:

2. 引脚定义
芯片手册的引脚图如下:

| 引脚 | 功能 | 补充 |
| VCC、GND | 电源(2.7~3.6V) | |
| CS(SS) | SPI片选,低电平有效 | 当 /CS 为高电平时,设备处于未选中状态,串行数据输出(DO 或 IO0、IO1、IO2、IO3)引脚处于高阻态。当设备未选中时,除非正在进行内部擦除、编程或状态寄存器操作,否则设备功耗将处于待机水平。 当 /CS 为低电平时,设备将被选中,功耗将增加到活动水平,并且可以向设备写入指令和从设备读取数据。 上电后,在接受新指令之前,/CS 必须从高电平变为低电平。/CS 输入在上电时必须跟踪 VCC 电源电平,如有需要,可在 /CS 上使用上拉电阻来实现这一点。 |
| CLK(SCK) | SPI时钟 | 串行时钟(CLK)SPI 串行时钟输入(CLK)引脚为串行输入和输出操作提供时序。 |
| DI(MOSI) | SPI主机输出从机输入 | W25Q64BV 支持标准 SPI、双 SPI 和四 SPI 操作。标准 SPI 指令使用单向 DI(输入)引脚,在串行时钟(CLK)输入引脚的上升沿将指令、地址或数据串行写入设备。标准 SPI 还使用单向 DO(输出)引脚在时钟(CLK)下降沿从设备读取数据或状态。双线和四线 SPI 指令使用双向 IO 引脚在时钟(CLK)上升沿向设备串行写入指令、地址或数据,并在时钟(CLK)下降沿从设备读取数据或状态。四线 SPI 指令要求状态寄存器 2 中的非易失性四线使能位(QE)被设置。当 QE=1 时,WP 引脚变为 IO2,/HOLD 引脚变为 IO3。 |
| DO(MISO) | SPI主机输入从机输出 | |
| WP | 写保护,低电平有效 | 写保护(/WP)引脚可用于防止状态寄存器被写入。与状态寄存器的块保护(SEC、TB、BP2、BP1 和 BPO)位以及状态寄存器保护(SRP)位配合使用时,可以对部分或整个存储阵列进行硬件保护。/WP 引脚为低电平有效。当状态寄存器 2 的 QE 位设置为四线 IO 时,/WP 引脚(硬件写保护)功能不可用,因为此引脚用于 IO2。 |
| HOLD | 数据保持 | /HOLD 引脚允许在设备被选中时将其暂停。当 /HOLD 被拉低时。当 /CS 为低电平时,DO 引脚将处于高阻态,DI 和 CLK 引脚上的信号将被忽略(无关紧要)。当 /HOLD 被置为高电平时,设备操作可以恢复。当多个设备共享相同的 SPI 信号时,HOLD 功能可能很有用。/HOLD 引脚为低电平有效。当状态寄存器 2 的 QE 位设置为四线 I/O 时,HOLD 引脚功能不可用,因为此引脚用于 IO3。 |

常规外围电路设计:

3. 设计框图
我们分上下两部分介绍,完整的设计框图:

3.1 控制逻辑
先说一下控制逻辑部分:

首先左侧框住部分和芯片引脚相连,可以参考上方电路图,然后 Write Control Logic 配合 WP 引脚进行写保护的操作,其状态会被状态寄存器记录下来:

- BUSY位:忙位,是只读位,位于状态寄存器中的S0。当执行页编程、扇区擦除、块擦除、芯片擦除、写状态寄存器等指令时,该位将自动置 1。此时,除了读状态寄存器指令,其他指令都忽略;当页编程、扇区擦除、块擦除、芯片擦除和写状态寄存器等指令执行完毕之后,该位将自动清 0,表示芯片可以接收其他指令了。
- WEL位:写保护位,是只读位,位于状态寄存器中的S1。执行完写使能指令后,该位将置 1。当芯片处于写保护状态下,该位为 0。
- BP2、BP1、 BP0位:块保护位,是可读可写位,分别位于状态寄存器的S4、S3、S2,可以用 写状态寄存器指令置位 这些块保护位。在默认状态下,这些位都为 0,即 块处于 未保护状态下。可以设置块为没有保护、部分保护或者全部保护等状态。
- TB位:底部和顶部块的保护位,是可读可写位,位于状态寄存器的 S5。该位默认为 0,表明顶部和底部块 处于未被保护状态下,可以用 写状态寄存器指令置位该位。当 SPR位为 1 或 /WP引脚 为低电平时,这些位不可以被更改。
- 保留位:位于状态寄存器的 S6,读取状态寄存器值时,该位为 0。
- SRP位:状态寄存器保护位,是可读可写位,位于状态寄存器的 S7。该位结合 /P引脚 可以禁止写状态寄存器功能。该位默认值为0。当SRP=0时,/WP引脚 不能控制状态寄存器的写禁止;当 SRP=1 且 /P=0时,写状态寄存器指令失效;当SRP=1 且 /P=1 时,可以执行写状态寄存器指令。
实现掉电不丢失部分,W25Q64 的每一个存储单元(存储一个比特 0 或 1)在物理上都是一个 “浮栅MOSFET晶体管”。
- 浮栅:这是一个被绝缘体(二氧化硅)完全包围、与外界物理隔离的导电栅极。电荷一旦被注入,就无法轻易逃逸。
- 电荷的囚笼:你可以把浮栅想象成一个“电子陷阱”。在无外力作用下,被困在里面的电子可以稳定地保存很多年(通常超过20年)。
状态如何定义?
- 状态 ‘1’ (已擦除):浮栅内没有电子。此时晶体管的阈值电压较低,容易导通。
- 状态 ‘0’ (已编程):通过高压,将电子注入到浮栅中。这些电子的存在会改变晶体管的特性,使其阈值电压变高,不易导通。
接着页地址锁存计数器和字节地址锁存计数器。
- 页地址锁存计数器:它锁存的是 “页”的编号。对于 8MB 的芯片,总页数为 8,388,608 / 256 = 32,768 页。所以这个计数器可以理解为一个从 0 到 32767 的计数器。这个计数器保存的是地址的 高16位(A23-A8)。它决定了当前读取操作位于 哪一页。
- 字节地址锁存计数器:它锁存的是在一个页内部的 “字节”位置。由于一页只有 256 字节,所以这个计数器是一个 8 位计数器,范围是 0 到 255。这个计数器保存的是地址的 低8位(A7-A0)。它决定了当前读取操作从该页的 哪个字节 开始。
简单来说,页地址锁存计数器,管理 “在哪一页”,在字节计数器溢出时递增。字节地址锁存计数器,管理 “在页内的哪个字节”,每读取一个字节就递增一次。
3.2 存储逻辑
首先我们先看一些这个介绍:

简单翻译一下,W25Q64BV 阵列由 32,768 个可编程页组成,每页 256 字节。每次最多可编程 256 字节。页可以以 16 页为一组(扇区擦除)、128 页为一组(32KB 块擦除)、256 页为一组(64KB 块擦除)或整个芯片(芯片擦除)的方式进行擦除。W25Q64BV 分别具有 2048 个可擦除扇区和 128 个可擦除块。较小的 4KB 扇区在需要数据和参数存储的应用中提供了更大的灵活性:

每块,每扇区都有自己的地址空间

4. 指令集
这些是我们想要操作W25Q64是需要的一些指令集,下面对常用的一些进行讲述:

4.1 写使能指令(06h)
功能:将状态寄存器中的 WEL (Write Enable Latch) 位置 '1'。
前置条件:在执行页编程、擦除(扇区/块/芯片)或写状态寄存器指令前,必须先执行此指令。
时序:
- 将 /CS 引脚拉至低电平。
- 通过 DI 引脚发送 1 字节指令码 06h。数据在 CLK 的上升沿被锁存。
- 将 /CS 引脚拉至高电平,完成指令。

4.2 写禁止指令(04h)
功能:将状态寄存器中的 WEL 位清零 ('0')。
时序:
- 将 /CS 引脚拉至低电平。
- 通过 DI 引脚发送 1 字节指令码 04h。
- 将 /CS 引脚拉至高电平,完成指令。
在写状态寄存器、页编程、擦除指令执行完成后,WEL 位会自动清零。

4.3 读状态寄存器指令(05h)
功能:读取状态寄存器的当前值。
时序:
- 将 /CS 引脚拉至低电平。
- 通过 DI 引脚发送 1 字节指令码 05h(在 CLK 上升沿锁存)。
- 芯片随即通过 DO 引脚输出状态寄存器的值(在 CLK 下降沿输出,MSB first)。
需要注意的是:
- 此指令可在任何时候执行,包括芯片忙于编程或擦除操作时。
- 通过读取 BUSY 位,可判断内部操作是否完成,从而确定芯片是否能接收下一条指令。
- 只要 /CS 保持为低,状态寄存器数据将持续输出。指令在 /CS 拉高后结束。

4.4 写状态寄存器指令(01h)
功能:读取状态寄存器的当前值。
时序:
- 将 /CS 引脚拉至低电平。
- 通过 DI 引脚发送 1 字节指令码 05h(在 CLK 上升沿锁存)。
- 芯片随即通过 DO 引脚输出状态寄存器的值(在 CLK 下降沿输出,MSB first)。
需要注意的是:
- 此指令可在任何时候执行,包括芯片忙于编程或擦除操作时。
- 通过读取 BUSY 位,可判断内部操作是否完成,从而确定芯片是否能接收下一条指令。
- 只要 /CS 保持为低,状态寄存器数据将持续输出。指令在 /CS 拉高后结束。

4.5 读数据指令(03h)
功能:从指定地址开始读取一个或多个字节的数据。
时序:
- 将 /CS 引脚拉至低电平。
- 通过 DI 引脚依次发送:指令码 03h、24 位地址(A23-A0)。
- 芯片从该地址开始,在 CLK 的下降沿通过 DO 引脚输出数据(MSB first)。
需要注意的是:
- 地址自动递增:输出当前地址数据后,地址计数器自动加1,并连续输出下一地址的数据,形成数据流。只要时钟持续且 /CS 为低,即可连续读取整个存储器。
- 指令在 /CS 拉高后结束。
- 当芯片正在执行编程、擦除或写状态寄存器操作时,此指令无效。


【STM32】SPI通讯协议入门解析-CSDN博客
STM32学习笔记_时光の尘的博客-CSDN博客

