这里使用的SPI FLASH型号为W25Q64,是一种NOR FLASH。容量为64M bit = 8M Byte(8M 字节),而AT24C02 EEPROM才只有256字节,存储容量简直不是一个量级,这个FLASH和stm32内部的FLASH性质一样,适合存储语音、文本和数据。
W25Q64BV阵列分为32,768个可编程页面,每页256字节。 一次最多可编程256个字节。 可以以16个组(4KB扇区擦除),128个组(32KB块擦除),256个组(64KB块擦除)或整个芯片(芯片擦除)的组擦除页面。 W25Q64BV分别具有2,048个可擦除扇区和128个可擦除块。 小的4KB扇区允许在需要数据和参数存储的应用中具有更大的灵活性。
支持高达80MHz的时钟频率,可以真正的支持XIP。
基本特性:
引脚定义:
常用的电路接法:
存储框图(把内部存储空间分为了扇区(4KB)和块(64KB)):
Flash的存储特性:
在写入数据之前,必须先擦除(全部擦除为1);
写入数据时,只能把1改成0;
擦除时必须按最小单位(扇区)来擦除,W25Q64的扇区为4KB,因此最小要以4KB擦除;
NOR FLASH可以一个字节一个字节的读写(所以能支持XIP);
NAND FLASH必须以块或扇区为单位进行读写;
状态寄存器
BUSY
BUSY是状态寄存器(S0)中的只读位,当器件执行页编程、扇区擦除、块擦除,芯片擦除或写状态寄存器指令时,该位被设置为1状态。 在此期间,器件将忽略除读取状态寄存器和擦除暂停指令之外的其他指令。 当编程、擦除或写入状态寄存器指令完成时,BUSY位将被清除为0状态,表示器件已做好进一步指令的准备。
WEL
写使能锁存器(WEL)是状态寄存器(S1)中的一个只读位,在执行写启用指令后设置为1。当设备被写禁用时,WEL状态位被清除为0。一个写禁用状态发生在通电时或以下任何指令之后:写禁用、页编程、扇区擦除、块擦除、芯片擦除和写状态寄存器。
BP2 BP1 BP0
块保护位(BP2,BP1,BP0)是状态寄存器(S4,S3和S2)中的非易失性读/写位,提供写保护控制和状态。 可以使用写状态寄存器指令设置块保护位。 可以保护存储器阵列的全部,无或部分不受编程和擦除指令的影响。该块保护位的出厂默认设置为0,没有任何阵列受保护。
其他的状态位使用的不多,那么就有一个问题,FLASH有一个内部状态寄存器,而stm32如何知道flash的寄存器值?
W25Q64指令集:
W25Q64BV的指令集由27条基本指令组成,这些指令通过SPI总线完全控制(参见指令集表)。 通过片选(/ CS)的下降沿启动指令。 时钟输入DI输入的第一个数据字节提供指令代码。 DI输入的数据在时钟的上升沿采样,最高有效位(MSB)优先。
指令的长度从单个字节到几个字节不等,可能后跟地址字节,数据字节,虚拟字节(不关心),在某些情况下,可能是组合。 使用 / CS的上升沿完成指令。 每条指令的时钟相对时序图包含在图4到图30中。所有读指令都可以在任何时钟位之后完成。 但是,所有写入、编程或擦除的指令都必须在字节边界上完成(在完成8位时钟后,CS驱动为高电平)否则指令将被终止。 此功能进一步保护设备免受无意写入。 此外,在编程或擦除存储器时,或者在写入状态寄存器时,除读取状态寄存器外的所有指令都将被忽略,直到编程或擦除周期完成。
指令集表
下面以读取状态寄存器1为例,分析时序图:
读状态寄存器指令允许读取8位状态寄存器。 通过驱动/ CS低电平输入指令,并将状态寄存器-1的指令代码“05h”和状态寄存器-2的“35h”在CLK的上升沿移入DI引脚。 然后状态寄存器位在CLK的下降沿从DO引脚移出,最高有效位(MSB)优先,如图6所示。即使在编程,擦除或写状态寄存器周期正在进行时,也可以随时使用读状态寄存器指令。 这允许检查BUSY状态位以确定何时循环完成,如果设备可以接受另一条指令。 可以连续读取状态寄存器,通过驱动/ CS高电平完成指令。
写使能:
读数据指令:
读数据指令允许从存储器中顺序读取一个以上的数据字节。 通过将/ CS引脚驱动为低电平然后将指令代码“03h”后跟24位地址(A23-A0)移入DI引脚来启动该指令。 代码和地址位在CLK引脚的上升沿锁存。 接收到地址后,寻址存储单元的数据字节将在CLK的下降沿从DO引脚移出,最高有效位(MSB)优先。 在每个数据字节移出后,地址自动递增到下一个更高的地址,从而允许连续的数据流。 这意味着只要时钟继续,就可以使用单个指令访问整个存储器。 通过驱动/ CS高电平完成指令。
读数据指令序列如图8所示。如果在擦除,编程或写周期正在进行时发出读数据指令(BUSY = 1),指令将被忽略,并且不会有任何指令对当前周期的影响。
页编程:
页面编程指令允许从一个字节到256个字节(一页)的数据在上一个擦除(FFh)存储器位置进行编程。 必须在执行之前执行写使能指令设备将接受页面编程指令(状态寄存器位WEL = 1)。 通过将/ CS引脚驱动为低电平然后将指令代码“02h”后跟24位地址(A23-A0)和至少一个数据字节移入DI引脚来启动该指令。 在将数据发送到器件时,/ CS引脚必须在指令的整个长度内保持低电平。 页面程序指令序列如图15所示。
如果要编程整个256字节页,则应将最后一个地址字节(8个最低有效地址位)设置为0。这是因为,一个字节8位,可寻址的大小为2^8 = 256,正好是一页。所以,最后一个字节为0,前面字节递增,正好可以定位到一个页的起始字节。
如果最后一个地址字节不为零,并且时钟数超过剩余页长,则 寻址将包装到页面的开头(类似于EEPROM中的页面翻转)。 在某些情况下,可以编程少于256个字节(部分页面)而不会对同一页面内的其他字节产生任何影响。 执行部分页面编程的一个条件是时钟数不能超过剩余页面长度。 如果向设备发送超过256个字节,则寻址将换行到页面的开头并覆盖先前发送的数据。
时序图分析:
扇区擦除(很常用):
扇区擦除指令将指定扇区(4K字节)内的所有存储器设置为全1(FFh)的擦除状态。 必须先执行写使能指令,然后器件才能接受扇区擦除指令(状态寄存器位WEL必须等于1)。 通过将/ CS引脚驱动为低电平并将指令代码“20h”移至24位扇区地址(A23-A0)(参见图2)来启动该指令。 扇区擦除指令序列如图17所示。
读取设备ID:
实际上,在进行开机自检的时候,很多时候不知道FLASH是否被正确连接。我们可以利用设备ID号,通过读取ID号,是否与固定的EF或4017h相等,来确定Flash是否正常工作。
这里的24位全部给0就好
读取唯一ID:
读取唯一ID号指令访问出厂设置的只读64位数字,该数字对每个W25Q64BV器件都是唯一的。 ID号可与用户软件方法结合使用,以帮助防止复制或克隆系统。 通过将/ CS引脚驱动为低电平并移位指令代码“4Bh”,然后移位四个字节的虚拟时钟来启动读取唯一ID指令。 之后,64位ID在CLK的下降沿移出,如图28所示。(Dummy可以是任意数据)
上一篇:stm32专题十八:SPI框图及通讯过程
下一篇:stm32专题十八:stm32读写SPI FLASH
推荐阅读最新更新时间:2024-11-13 12:53