W25Q16_Flash手册总结

本文详细介绍了W25Q16BVFlash存储器的概述、特点、引脚说明、操作指令(如写入、读取和擦除)以及交流特性表,包括擦除时间和/CS有效时间的要求。通过SPI协议进行数据交互,适合初学者理解和实践操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

前面学习了我们的spi协议,下面我们需要对Flash芯片手册进行简单的学习总结,后面通过spi协议对flash进行读写。


一、概述&特点

1、概述W25Q16BV

FLASH 存储器又称闪存,是一种长寿命的非易失性(在断电情况下仍能保持所存储的数据信息)存储器,一般用来保存一些重要的设置信息或者程序等等。通常采用 SPI 协议跟 FLASH 芯片进行数据交互。W25Q16BV是串行闪存为空间,引脚和功耗有限的系统提供存储解决方案。25Q 系列提供的灵活性和性能远远超过普通串行闪存设备。

  • 需要注意的是对于一些概念我们需要清楚:扇区、页、块等:
    对于我们的flash我们可以理解为有两种划分方式(当然可能不止),我的W25Q16型号的flash有2MB即16Mb。

1、我们可以根据页来进行划分,可以分为8192个可编程页,每页可写256字节,(256*8192)1024 = 2MB。一次最多编程256字节,写超的话会对当前页的前面数据进行覆盖。页面可以有16组扇区擦除(4KB)、128组(32KB)、256组(64KB)或整个芯片进行擦除。那么来了,这里的几KB怎么算的呢,组是多大?实际上:4KB = (256 * 16)/1024 、32KB = (256 * 128)/1024
2、根据块进行划分,我们分成了32块,每块64kB,每块又化成了16个扇区,每个扇区4KB,相当于每个扇区有16页,有16个扇区,那么每块有256页。

1、特点

1、低功耗
2、具有 4KB 扇区的灵活架构
3、高效的连续读取模式
4、最高性能串行闪存
5、16Mbit(2MB)

2、引脚说明

在这里插入图片描述
在这里插入图片描述

1号引脚:这是我们的片选信号,并且是低电平有效,一般引脚名前加/表示低电平有效。
2、5号引脚:FLASH芯片的数据输入输出引脚((Standard and Dual SPI 模式下)
3号引脚:写保护引脚(Quad SPI 模式下被用作数据输出引脚,低电平有效,用来防止状态寄存器被写入。
4、8号引脚:GND和电源
6号引脚:FLASH的时钟驱动时钟
7号引脚:HOLD引脚,也是低电平有效,在 Standard and Dual SPI 模式下相当于 FLASH 暂停信号,当 HOLD 引脚和 CS引脚同时拉低时,虽然此时 FLASH 芯片是被选中的,但是 DO 引脚会处于高阻抗状态,DI 和 CLK 这两个引脚会忽略输入的数据和时钟,相当于 DI 和 CLK 处于无效状态。(在多从机的情况下有用)

3、内部结构示意图

在这里插入图片描述

4、操作指令

  1. 表1

在这里插入图片描述

  1. 表2

在这里插入图片描述

  1. 表3

在这里插入图片描述

5、操作示例时序图

1、写入启用指令:Write Enable(06h)

Write Enable(06h):使能指令,Write Enable 指令将状态寄存器中的 Write Enable Latch (WEL)位设置为高电平,在执行页编辑、扇区擦除、块擦除、芯片擦除和写状态寄存器指令前必须先执行 Write Enable指令

在这里插入图片描述

2、读取状态寄存器指令:Read Status Register-1(05h)

Read Status Register-1(05h):读取状态寄存器 1 指令,这条指令的作用就是读取状态寄存器 1 的值。在 W25Q16BV 中存在两个状态寄存器可以用来指示 FLASH 芯片的可用性状态或者配置 SPI 的相关设置。后面我们主要是读取状态寄存器 1 的值,并且检测它的第零位也就是 BUSY 位是零还是一。当FLASH 处于擦除或者写入数据时,状态寄存器 1 的 BUSY 位会拉高,当 BUSY 位重新恢复成低电平时代表 FLASH 擦除或者写入数据完成。

在这里插入图片描述

3、写数据指令:Page Program(02h)

页编辑指令,可以理解成写数据指令,在上文中我们已经介绍过 W25Q16BV 的
存储空间是分为扇区和页的,每一页又有 256 个字节的存储空间。当执行页编辑指令时就可以往对应的扇区对应的页中写入数据,一次性最多写入 256 个字节数据。这里尤其要注意一点,当整页写数据时你可以不必写满 256 个字节,小于 256 个字节也是可以正常写入的,但是千万不能超过 256 个字节数据,因为一旦超过 256 个字节,多余的数据就会返回这一页的开头重新写入,这样就会覆盖之前已经写入的数据。举个例子我们一次性写入 260 个数据,这样就多了 4 个数据出来,那么这 4 个数据就会回到这一页的开头把第 0、1、2 和 3 这四个数据覆盖掉。

在这里插入图片描述

4、区块擦除指令:Sector Erase-4KB(20h)

在上文中我们已经提到过芯片内部的存储空间是被划分成一个一个小块的,我们可以直接对这些小块执行擦除指令。Sector Erase 指令就是对 4KB 的小块执行擦除操作。除此之外还有 Block Erase -32KB(52h)和 Block Erase -64KB(D8h)指令,用于擦除更大的存储块。

在这里插入图片描述

5、全擦除指令:Chip Erase(c7h)

有的时候我们想直接将 FLASH 芯片进行格式化那怎么办呢?这个时候我们就可以执行全擦除指令了。全擦除指令会擦除整个 FLASH 芯片的所有存储数据。需要注意的是全擦除指令执行的比较慢,通常需要几秒钟才能完成全擦除。在芯片处于全擦除期间我们只能对它执行访问状态寄存器指令操作,不能执行其他例如读写等操作。在擦除期间,状态寄存器1 的最低位(BUSY 位)始终处于高电平(不仅仅是全擦除指令,区块擦除指令、写数据指令执行时BUSY 位也会拉高),当完成全擦除后 BUSY 位拉低,此时可以执行其他指令了

在这里插入图片描述

6、读取数据指令:Read Data(03h)

读取数据指令,当 FLASH 中被写入数据后我们可以使用 Read Data 指令将数据读取出来。

在这里插入图片描述

还要很多的指令,这里只对我们后面使用得到的指令进行了介绍,具体可以看结尾的手册资料。

6、交流特性表

1、擦除时间要求

在这里插入图片描述

2、/CS有效与时钟有效的时间要求

在这里插入图片描述

  • 也就是我们下面这两个前后时间各需要5ns:
    在这里插入图片描述
3、两个指令操作的时间/CS需要保持的高电平时间

我们可以看到这里的串行通信这里/CS的英文为tSHSL:

在这里插入图片描述

  • 查找发现其要求我们的时间为7/40ns,我们可以设置100ns稳妥一点:

在这里插入图片描述

这里就介绍到这里,还有更多的要求,请自行查阅手册。还有一个点就是我们在页编程的情况下之后我们并不能马上写入,需要一个时间,手册给出的是3s,但是我们我们可以通过轮询的方式,读我们的状态寄存器 1 的最低位(BUSY 位)在 FLASH 处于写数据或者擦除数据期间是拉高的,当它拉低代表 FLASH 写入数据或者擦除数据完成。


二、总结

这里我根据手册以及原子哥的资料进行了一个大致的整理,大家仅供参考,英文版的手册看着可能理解错误,大家评论区斧正。

三、参考资料

1、Flash页、扇区、块的区别
2、W25Q16BV手册:提取码:hzwj

<think>好的,我现在需要解决用户关于SPI Flash扇区擦除命令0x20和0xD8的使用与实现的问题。首先,我应该回顾一下SPI Flash的基本知识,尤其是擦除操作的相关内容。 根据引用[3],Nand Flash和Nor Flash的块大小不同,SPI Flash通常属于Nor Flash的一种,所以块大小可能在64KB或32KB左右。不过,擦除命令可能针对更小的扇区(sector)。SPI Flash的擦除命令通常有三种:扇区擦除(Sector Erase)、块擦除(Block Erase)和整片擦除(Chip Erase)。用户提到的0x20和0xD8应该对应其中两种擦除命令。 接下来,我需要确认这两个操作码的具体用途。通常,0x20是扇区擦除命令,而0xD8可能是块擦除命令。例如,某些SPI Flash芯片中,扇区大小为4KB,块大小为64KB。因此,0x20用于擦除4KB的扇区,而0xD8用于擦除更大的块,比如64KB。用户需要明确这两个命令的使用场景和参数。 然后,实现这些命令的步骤大致相同:首先发送写使能命令(0x06),然后发送擦除命令(0x20或0xD8)及目标地址。需要注意的是,地址必须对齐到相应的扇区或块大小。例如,使用0x20命令时,地址必须是4KB的倍数;使用0xD8时,地址需对齐到64KB。擦除操作完成后,需要检查状态寄存器确保操作完成。 另外,用户可能需要参考具体芯片的数据手册,因为不同厂商的SPI Flash可能有不同的命令集和地址要求。例如,Winbond和Micron的芯片可能在命令码或地址长度上存在差异。因此,实现时需要根据具体型号调整命令和地址发送方式。 最后,还要注意SPI Flash的写入前必须擦除,且擦除操作耗时较长,需等待状态寄存器的忙位清零。在代码实现中,通常会轮询状态寄存器直到操作完成,避免后续操作出错。</think>### SPI Flash扇区擦除命令0x20与0xD8详解 #### 1. 命令定义与区别 - **0x20 (Sector Erase)**:用于擦除较小的存储单元(通常为**4KB**),地址需按扇区对齐。例如,地址必须是$0x0000, 0x1000, 0x2000$等[^3]。 - **0xD8 (Block Erase)**:用于擦除较大的块(如**64KB**),地址需按块对齐。例如,地址必须是$0x00000, 0x10000, 0x20000$等。 #### 2. 操作流程 1. **写使能(Write Enable)** 发送命令`0x06`,使能Flash写入/擦除操作。 2. **发送擦除命令** - 对于`0x20`:发送`0x20`后紧跟**3字节地址**(例如`0x00 00 00`)。 - 对于`0xD8`:发送`0xD8`后紧跟**3字节地址**(例如`0x00 00 00`)。 3. **等待操作完成** 通过读取状态寄存器(命令`0x05`),检查`BUSY`位是否为0。 #### 3. 代码实现示例(基于SPI协议) ```c // 扇区擦除函数示例(0x20) void spi_flash_sector_erase(uint32_t address) { spi_write(0x06); // 写使能 spi_write(0x20); // Sector Erase命令 spi_write((address >> 16) & 0xFF); // 地址高位 spi_write((address >> 8) & 0xFF); spi_write(address & 0xFF); while (spi_read_status() & 0x01); // 等待BUSY位清零 } // 块擦除函数示例(0xD8) void spi_flash_block_erase(uint32_t address) { spi_write(0x06); spi_write(0xD8); // Block Erase命令 spi_write((address >> 16) & 0xFF); spi_write((address >> 8) & 0xFF); spi_write(address & 0xFF); while (spi_read_status() & 0x01); } ``` #### 4. 注意事项 - **地址对齐**:未对齐地址可能导致擦除错误或数据损坏。 - **功耗与时间**:擦除操作功耗较高,且耗时较长(通常几毫秒到几百毫秒)。 - **状态检查**:必须等待擦除完成后再执行后续操作,否则会触发错误[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

混子王江江

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值