一、W25Q64简介

-
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
二、硬件电路
-
注意
1、带斜杠的CS(SS)——代表低电平有效
2、WP(Write Protect)——配合内部的寄存器配置,可以实现硬件的写保护(保护时不可写)——低电平有效
3、 HOLD——数据保持——低电平有效
-
额外
DI、DO、WP、HOLD在引脚定义图中分别各自有括号写了IO0、IO1、IO2、IO3——对应【双重SPI】和【四重SPI】
//如果是【普通SPI】模式,括号不起作用
//如果是【双重SPI】模式,DI和DO将作为IO0和IO1,是数据同时收和同时发的两个数据位
//如果是【四重SPI】模式,四个引脚都将作为新的IO口,都作为数据收发引脚
三、W25Q64框图

-
划分方式
-
一整块存储空间划分为若干的块Block
-
每一个块Block再划分为若干的扇区Sector
-
每个扇区Sector再划分为若干页Page
-
右边的矩形代表【所有的存储器】
存储器以字节为单位,每个字节都有唯一的地址(W25Q64)的地址宽度是24位,3个字节,寻址空间为8MB
-
从整体来看
左下角第一个字节地址为【00 00 00h】,之后的空间地址依次自增,直到最后一个字节地址为【7F FF FFh】
-
从块Block之间来看
其中以64KB为一个基本单元,将所有的存储器划分成若干的块Block,从前往后(从下往上)依次是块0、块1、块2……
//存储器地址空间为8MB,以64KB为一块进行划分,可以分得128块Block(块序号0~127)
-
从块Block内部来看
比如:块0的起始地址为【00 00 00】,结束地址为【00 FF FF】
块31的起始地址为【1F 00 00】,结束地址为【1F FF FF】
变化规律:每个块的起始为【XX 00 00】,结束地址为【XX FF FF】——每一块内地址变化范围为低位的2个字节
左边的矩形代表由块Block更细划分的【扇区Sector】
-
从整体来看
左下角第一个字节地址为【XX 00 00h】,之后的空间地址依次自增,直到最后一个字节地址为【XX FF FFh】
-
从扇区Sector之间来看
其中以4KB为一个基本单元,将每一块Block划分成若干的扇区Sector,从前往后(从下往上)依次是扇区0、扇区1、扇区2……
//块Block地址空间为64KB,以4KB为一块进行划分,可以分得16块扇区(Sector序号0~15)
-
从扇区Sector内部来看
变化规律:每个扇区的起始为【XX X0 00】,结束地址为【XX XF FF】——每一块内地址变化范围为12位低位
写入数据时进行更细的划分【页Page】
-
从整体来看
页的大小为【256字节】——存储器整个空间会划分为很多页
-
从页Page之间来看
其中以一个扇区Sector=4KB为基本单元,将其划分成若干的扇区Sector
//扇区Sector地址空间为4KB,以256字节为一块进行划分,可以分得16页(Page序号0~15)
-
从页Page内部来看
变化规律:每页的起始为【XX XX 00】,结束地址为【XX XX FF】——每一块内地址变化范围为8位低位
/*************************************************************************************************************/
左下角为【SPI控制逻辑】(地址锁存、数据读写等)
-
控制逻辑左边为【SPI通信引脚】(DI、DO、CLK、CS、WP、HOLD)
主控芯片通过SPI协议把指令和数据发给【控制逻辑】,控制逻辑就会自动去操作内部电路
-
控制逻辑上边为【状态寄存器】
体现芯片当前状态(是否处于忙状态、是否写使能、是否写保护)
-
状态寄存器上边为【写控制逻辑】——和外部WP引脚相连实现硬件写保护
-
控制逻辑右边为【页地址锁存/计数器】、【字节地址锁存/计数器】——用于指定地址
EX:通过SPI总共发过来3字节的地址,因为一页是256字节,所以一页内的【字节地址】就取决于最低一个字节,高位的两个字节对应【页地址】
//前两个字节会进到【页地址锁存/计数器】,最后一个字节会进到【字节地址锁存/计数器】
1、【页地址】通过【写保护和行解码】来选择操作哪一页
2、【字节地址】通过【列解码和256字节页缓存】来进行指定字节的读写操作
/*************************************************************************************************************/
-
【页缓存区】是一个256字节的RAM存储器——辅助读写功能
1、写入数据
数据放到缓存区,在时序结束后,芯片再将缓存区的数据复制到对应的Flash中进行永久保存
-
设立【缓存区】原因:SPI写入频率非常高,而Flash写入较慢
由SPI写入的数据先放在【页缓存区】(RAM存储器,速度非常快),SPI写完后,芯片再把数据从【缓存区】转移到【Flash】
-
数据从【缓存区】转移到【Flash】里需要一定时间,因此在写入时序结束后芯片会进入【忙状态】
-
【状态寄存器】的【BUSY】位置1——表示芯片当前正在转移数据,不会响应新的读写时序
-
需要注意的是:【缓存区】只有256字节,因此写入的一个时序连续写入的数据量不能超过256字节
2、读取数据
读取只看电路的状态就行,速度很快,基本不花时间,所以很少对读取的限制
另外:其中地址锁存带有计数器,所以地址指针在读写之后可以自动+1,进而实现从指定地址开始连续读写多个字节
四、Flash操作注意事项
-
写入操作时
1、写入操作前,必须先进行写使能
//一个【写使能】只能保证后续的一条写指令执行
//写指令执行后会自动【写使能】,因此
在进行任何写入操作前需要先【写使能】
2、每个数据位只能由
1
改写为
0
,不能由
0
改写为
1
//RAM可以直接完全覆盖改写——Flash不行
3、写入数据前必须先擦除,擦除后,所有数据位变为
1
//发出擦除指令后芯片也会进入【忙状态】
4、擦除必须按最小擦除单元进行
//不能指定某一个字节擦除,要擦就要一部分(最小擦除单元)一起擦——本芯片中最小擦书单元是【扇区】
因此擦除最少得将一个扇区4096个字节(4KB)一起擦
5、连续写入多字节时,最多写入一页的数据;若写多了,超过页尾位置的数据,会回到页首覆盖写入
//写入时一次性不能写太多,一个写入时序最多只能写【一页】的数据(256字节)
原因:【页缓存区】只有256字节,写太多缓存区存不下
注意:从【页起始位置】开始写才能最大写入256字节
//如果从【页中间地址】开始写,那么写到【页尾】时地址就会跳回【页首】——导致地址错乱
6、写入操作结束后,芯片进入忙状态(芯片将数据从【缓存区】转移到【Flash】
),不响应新的读写操作
//读取【状态寄存器】的【BUSY】位为0时芯片不忙,再进行操作
-
读取操作时
直接调用读取时序,无需使能,无需额外操作,没有页的限制,读取操作结束后不会进入忙状态,【但不能在忙状态时读取】