stm32专题十八:详细分析SPI FLASH

这里使用的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。

stm32专题十八:详细分析SPI FLASH_第1张图片

基本特性:

stm32专题十八:详细分析SPI FLASH_第2张图片

引脚定义:

stm32专题十八:详细分析SPI FLASH_第3张图片

 

stm32专题十八:详细分析SPI FLASH_第4张图片

常用的电路接法:

stm32专题十八:详细分析SPI FLASH_第5张图片

存储框图(把内部存储空间分为了扇区(4KB)和块(64KB)):

stm32专题十八:详细分析SPI FLASH_第6张图片

Flash的存储特性:

在写入数据之前,必须先擦除(全部擦除为1);

写入数据时,只能把1改成0;

擦除时必须按最小单位(扇区)来擦除,W25Q64的扇区为4KB,因此最小要以4KB擦除;

NOR FLASH可以一个字节一个字节的读写(所以能支持XIP);

NAND FLASH必须以块或扇区为单位进行读写;

 

状态寄存器

stm32专题十八:详细分析SPI FLASH_第7张图片

BUSY

BUSY是状态寄存器(S0)中的只读位,当器件执行页编程、扇区擦除、块擦除,芯片擦除或写状态寄存器指令时,该位被设置为1状态。 在此期间,器件将忽略除读取状态寄存器和擦除暂停指令之外的其他指令。 当编程、擦除或写入状态寄存器指令完成时,BUSY位将被清除为0状态,表示器件已做好进一步指令的准备。

WEL

写使能锁存器(WEL)是状态寄存器(S1)中的一个只读位,在执行写启用指令后设置为1。当设备被写禁用时,WEL状态位被清除为0。一个写禁用状态发生在通电时或以下任何指令之后:写禁用、页编程、扇区擦除、块擦除、芯片擦除和写状态寄存器。

BP2 BP1 BP0

块保护位(BP2,BP1,BP0)是状态寄存器(S4,S3和S2)中的非易失性读/写位,提供写保护控制和状态。 可以使用写状态寄存器指令设置块保护位。 可以保护存储器阵列的全部,无或部分不受编程和擦除指令的影响。该块保护位的出厂默认设置为0,没有任何阵列受保护。

stm32专题十八:详细分析SPI FLASH_第8张图片

其他的状态位使用的不多,那么就有一个问题,FLASH有一个内部状态寄存器,而stm32如何知道flash的寄存器值?

W25Q64指令集:

stm32专题十八:详细分析SPI FLASH_第9张图片

W25Q64BV的指令集由27条基本指令组成,这些指令通过SPI总线完全控制(参见指令集表)。 通过片选(/ CS)的下降沿启动指令。 时钟输入DI输入的第一个数据字节提供指令代码。 DI输入的数据在时钟的上升沿采样,最高有效位(MSB)优先。

指令的长度从单个字节到几个字节不等,可能后跟地址字节,数据字节,虚拟字节(不关心),在某些情况下,可能是组合。 使用 / CS的上升沿完成指令。 每条指令的时钟相对时序图包含在图4到图30中。所有读指令都可以在任何时钟位之后完成。 但是,所有写入、编程或擦除的指令都必须在字节边界上完成(在完成8位时钟后,CS驱动为高电平)否则指令将被终止。 此功能进一步保护设备免受无意写入。 此外,在编程或擦除存储器时,或者在写入状态寄存器时,除读取状态寄存器外的所有指令都将被忽略,直到编程或擦除周期完成。

指令集表

stm32专题十八:详细分析SPI FLASH_第10张图片

下面以读取状态寄存器1为例,分析时序图:

读状态寄存器指令允许读取8位状态寄存器。 通过驱动/ CS低电平输入指令,并将状态寄存器-1的指令代码“05h”和状态寄存器-2的“35h”在CLK的上升沿移入DI引脚。 然后状态寄存器位在CLK的下降沿从DO引脚移出,最高有效位(MSB)优先,如图6所示。即使在编程,擦除或写状态寄存器周期正在进行时,也可以随时使用读状态寄存器指令。 这允许检查BUSY状态位以确定何时循环完成,如果设备可以接受另一条指令。 可以连续读取状态寄存器,通过驱动/ CS高电平完成指令。

stm32专题十八:详细分析SPI FLASH_第11张图片

写使能:

stm32专题十八:详细分析SPI FLASH_第12张图片

读数据指令:

stm32专题十八:详细分析SPI FLASH_第13张图片

读数据指令允许从存储器中顺序读取一个以上的数据字节。 通过将/ CS引脚驱动为低电平然后将指令代码“03h”后跟24位地址(A23-A0)移入DI引脚来启动该指令。 代码和地址位在CLK引脚的上升沿锁存。 接收到地址后,寻址存储单元的数据字节将在CLK的下降沿从DO引脚移出,最高有效位(MSB)优先。 在每个数据字节移出后,地址自动递增到下一个更高的地址,从而允许连续的数据流。 这意味着只要时钟继续,就可以使用单个指令访问整个存储器。 通过驱动/ CS高电平完成指令。

读数据指令序列如图8所示。如果在擦除,编程或写周期正在进行时发出读数据指令(BUSY = 1),指令将被忽略,并且不会有任何指令对当前周期的影响。

stm32专题十八:详细分析SPI FLASH_第14张图片

页编程:

stm32专题十八:详细分析SPI FLASH_第15张图片

页面编程指令允许从一个字节到256个字节(一页)的数据在上一个擦除(FFh)存储器位置进行编程。 必须在执行之前执行写使能指令设备将接受页面编程指令(状态寄存器位WEL = 1)。 通过将/ CS引脚驱动为低电平然后将指令代码“02h”后跟24位地址(A23-A0)和至少一个数据字节移入DI引脚来启动该指令。 在将数据发送到器件时,/ CS引脚必须在指令的整个长度内保持低电平。 页面程序指令序列如图15所示。

如果要编程整个256字节页,则应将最后一个地址字节(8个最低有效地址位)设置为0。这是因为,一个字节8位,可寻址的大小为2^8 = 256,正好是一页。所以,最后一个字节为0,前面字节递增,正好可以定位到一个页的起始字节。

如果最后一个地址字节不为零,并且时钟数超过剩余页长,则 寻址将包装到页面的开头(类似于EEPROM中的页面翻转)。 在某些情况下,可以编程少于256个字节(部分页面)而不会对同一页面内的其他字节产生任何影响。 执行部分页面编程的一个条件是时钟数不能超过剩余页面长度。 如果向设备发送超过256个字节,则寻址将换行到页面的开头并覆盖先前发送的数据。

时序图分析:

stm32专题十八:详细分析SPI FLASH_第16张图片

扇区擦除(很常用):

扇区擦除指令将指定扇区(4K字节)内的所有存储器设置为全1(FFh)的擦除状态。 必须先执行写使能指令,然后器件才能接受扇区擦除指令(状态寄存器位WEL必须等于1)。 通过将/ CS引脚驱动为低电平并将指令代码“20h”移至24位扇区地址(A23-A0)(参见图2)来启动该指令。 扇区擦除指令序列如图17所示。

stm32专题十八:详细分析SPI FLASH_第17张图片

读取设备ID:

实际上,在进行开机自检的时候,很多时候不知道FLASH是否被正确连接。我们可以利用设备ID号,通过读取ID号,是否与固定的EF或4017h相等,来确定Flash是否正常工作。

stm32专题十八:详细分析SPI FLASH_第18张图片

这里的24位全部给0就好

stm32专题十八:详细分析SPI FLASH_第19张图片

读取唯一ID:

读取唯一ID号指令访问出厂设置的只读64位数字,该数字对每个W25Q64BV器件都是唯一的。 ID号可与用户软件方法结合使用,以帮助防止复制或克隆系统。 通过将/ CS引脚驱动为低电平并移位指令代码“4Bh”,然后移位四个字节的虚拟时钟来启动读取唯一ID指令。 之后,64位ID在CLK的下降沿移出,如图28所示。(Dummy可以是任意数据

stm32专题十八:详细分析SPI FLASH_第20张图片

 

你可能感兴趣的:(stm32专栏)