1.W25Q64
W25Q64是一种低成本,小型化,非易失存储器(掉电不丢失)。
常用于数据存储,字库存储,固件库程序存储。
存储器分为易失存储器(SRAM,DRAM)与非易失存储器 (Flash,E2PROM)。
W25Q64的存储介质:Flash;时钟频率高:80MHz以上;存储容量大:W25Q64为64Mbit。
2.引脚定义
3.芯片框图
(1)Flash的空间划分
24位地址空间,最大寻址范围为16MB,第一个地址为0x0000h(h代表16进制),而W25Q64只有8MB,只用了一半,排到最后一个地址就是0x7FFFFF。最后的空间,地址依次增加。
- 8Mbit的存储单元"蛋糕"分为块(Block),每块为64KB, 那就是分成 8*1024/64=127块;
块内地址的变化规律:每块的起始地址是xx 00 00,结束地址是xx FF FF;
- 每块又分为扇区(sector),每个扇区占4KB,那就分成64KB/4KB=16个扇区;
扇内地址的变化规律:每扇的起始地址是xx x0 00,结束地址是xx xF FF;
- 每个扇区又分为页(Page), 每页的占256字节Byte,那就分成4*1024/256Byte=16页;
页地址的变化规律:每页的起始地址是xx xx 00,结束地址是xx xx FF;
(2)SPI控制逻辑——芯片管理员,执行指令,读写数据
左边是SPI通信引脚,与主控芯片的SPI通信引脚连接,主控芯片通过SPI通信协议,把指令和数据发给控制逻辑;右边是页地址锁存器与字节地址锁存器,用来指定地址的;
- SPI发送3个字节的地址,高位的两个字节对应页地址,进入页地址锁存器;最后一个字节会进入字节地址锁存器;
- 页地址通过写保护和行解码来选择操作哪一页,字节地址通过256字节缓存和列解码来进行指定字节的读取操作。
- 地址锁存器都有计数器的,地址指针读写后自动加1,实现从指定地址开始连续读写多个字节的目的。
(3)256字节的页缓存——会对一次性写入的数据量进行限制
右下角的256字节页缓存区是一个256字节的RAM存储器,数据的读写就是通过这个RAM缓存区来进行的,写入数据先放到缓存区里面,时序结束后芯片再将缓存区的数据复制到Flash里进行永久保存。为什么弄这个缓存区而不是直接往Flash写数据?简单说是因为SPI传输频率高,而Flash的写入需要掉电不丢失,它比较慢,所以弄这个页缓存区来缓存数据,缓存区是RAM,它的速度非常快,可以跟上SPI总线的速度。但这个缓冲区只有256字节,写入的字节数据不能超过256个字节。
(4)状态寄存器——忙状态,写使能,写保护等
读写执行流程:时序写完后,芯片慢慢把数据从缓存区转移到flash存储器,所以在写入时序结束后,芯片会进入忙的状态,会有一条线通往状态寄存器,BUSY=1,表示芯片忙于“搬砖”,此时芯片不会响应新的时序了。BUSY=0,芯片空闲了,等待响应下个时序;读取数据也通过页缓存区进行,看一下电路的状态即可,限制少,响应快。
4.Flash的读写要求
(1)写的注意事项
写入先发送写使能的指令,数据不能覆盖,要先发送擦除指令;擦除按最小单元扇区进行,这样有缺点就是不方便改某个字节,只能通过RAM备份或者一个字节的数据占一个扇区,所以只能通过软件来弥补;然后写入的字节不能超过256字节,不能跨页,跨页的地址会回到首地址,导致地址错乱 。
(2)读的注意事项
读比较简单,直接调用读的时序,没有其它注意操作;
但不能在芯片忙状态的时候读,读完也不会进入忙状态;
Flash的确有点麻烦,但它容量大价格低,速度相比RAM慢,但在非易失存储器中是非常快的,就像它很酷的名字一样“Flash闪存”,闪电侠哈哈。
5.芯片手册
(1)状态寄存器——重点掌握前两位
- BUSY位 :忙状态时置1,否则=0;
- WEL位:芯片上电时写使能,WEL=0;或者写使能,再页编程,扇区擦除,写入数据结束后,自动写失能WEL=0,不用手动复位;
(2)指令集
- 写使能:起始+交换字节指令码0x06h
- 写失能:起始+交换字节指令码0x04h
- 读ID号:起始+交换字节指令码0X9F+交换3个字节(厂商ID+2个设备ID)
- 读状态寄存器:起始+交换字节指令码0x05h+状态寄存器7-0位数据
- 扇区擦除:起始+交换字节指令0x20+3个字节地址A23-A16,A15-A8,A7-A0
一般3个字节地址对齐到扇区的首地址,表示擦除整个扇区。
- 页编程(写数据):起始+字节指令0x02h+3个字节地址A23-A16,A15-A8,A7-A0+数据D7-D0
- 读取数据:起始+字节指令码0x03h+3个字节地址A23-A16,A15-A8,A7-A0+数据D7-D0
读取没有页的限制,写数据页编程有页即256字节的限制。