文章目录
- 前言
- 一、概述&特点
- 1、概述W25Q16BV
- 1、特点
- 2、引脚说明
- 3、内部结构示意图
- 4、操作指令
- 5、操作示例时序图
- 1、写入启用指令:Write Enable(06h)
- 2、读取状态寄存器指令:Read Status Register-1(05h)
- 3、写数据指令:Page Program(02h)
- 4、区块擦除指令:Sector Erase-4KB(20h)
- 5、全擦除指令:Chip Erase(c7h)
- 6、读取数据指令:Read Data(03h)
- 6、交流特性表
- 1、擦除时间要求
- 2、/CS有效与时钟有效的时间要求
- 3、两个指令操作的时间/CS需要保持的高电平时间
- 二、总结
- 三、参考资料
前言
前面学习了我们的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
- 表2
- 表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