历史上的今天
今天是:2024年10月25日(星期五)
2021年10月25日 | stm32专题十八:详细分析SPI FLASH
2021-10-25 来源:eefocus
这里使用的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可以是任意数据)
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 我公司是JM系列IC的一级代理商,下面是JM IC的功能型号简介: JMicron智微科技主要产品研发方向为高速串行式连结(High Speed Serial Link)的相关技术,该技术现已广泛应用于Serial ATA、PCI E ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 08:58 编辑 概述 我们对处理速度的需求日益增长,伴随着这种增长,用来构建单片机的晶体管尺寸则在持续减小。以更低的成本实现更高的集成度,也促进了对更小的几何尺寸的需求。随着尺寸的减小,晶体管击穿电压 ...… 查看全部问答> |
|
请问各位大侠,C++.net能开发硬件程序吗,就是那种控制门口挡车杆升降的程序。 如果不能,那可以用VisualC++开发吗? 多种语言开发的程序可不可以组成一个软件上那? 谢谢各位。… 查看全部问答> |
|
有谁知道PROTEUS的第三方元件库怎么添加啊,我用的是7.5sp3的版本,我把.lib文件加到元件库里面但是还是以前那些元件,这是怎么回事啊?请大家帮帮忙!!!谢谢… 查看全部问答> |
|
【重量级】使用RT-Thread RTOS及附属组件的LM3S8962评估板的例程 Introduction •这是使用RT-Thread RTOS及附属组件的LM3S8962评估板例程,对LM3S系列其他芯片也同样适用。所有例程源码来自开源实时操作系统RT-Thread的官方SVN源码服务器。这儿将例程做成了一个个单独的工程,目的是为了使刚接触RT-Thread的 ...… 查看全部问答> |
|
07.28【每周讨论】相信大家都知道C语言了,那么E(易)语言呢? 第一次听说E语言听过,不了解最近刚刚知道一点点知道,感觉不错 [ 本帖最后由 longxtianya 于 2011-7-30 19:48 编辑 ]… 查看全部问答> |
|
SimpliciTI-IAR-1.2.0>>CC430EM里的程序为何不能用了???? 我用SimpliciTI-IAR-1.2.0里的cc430例程,用cc430F5137模块来测试程序AP_as_Data_Hub,为何AP和ED连接不上了,我的ED发送地址是0xFF,为何发不出去了???望各位老师能够解答我的难题 !在此谢过!… 查看全部问答> |






