STM32学习笔记——SpiFlash

STM32学习笔记——SpiFlashFLASH闪存是属于内存器件的一种,"Flash"。闪存则是一种非易失性( Non-Volatile )内存,在没有电流供应

欢迎大家来到IT世界,在知识的湖畔探索吧!

FLASH闪存是属于内存器件的一种,”Flash”。闪存则是一种非易失性( Non-Volatile )内存,在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,这项特性正是闪存得以成为各类便携型数字设备的存储介质的基础。

各类 DDR 、 SDRAM 或者 RDRAM 都属于挥发性内存,只要停止电流供应内存中的数据便无法保持,因此每次电脑开机都需要把数据重新载入内存。

FLASH芯片介绍——W25Q64

W25Q64 (64M-bit(兆位)==>8MB(兆字节)),W25Q16(16M-bit==>2MB)和 W25Q32(32M-bit==>4MB)是为系统提供一个最小的空间、引脚 和功耗的存储器解决方案的串行 Flash 存储器。25Q 系列比普通的串行 Flash 存储器更灵活,性能 更优越。基于双倍/四倍的 SPI,它们能够可以立即完成提供数据给 RAM,包括存储声音、文本和数据。芯片支持的工作电压 2.7V 到 3.6V,正常工作时电流小于 5mA,掉电时低于 1uA。所有芯片提供 标准的封装。

W25Q64原理框图:

STM32学习笔记——SpiFlash

内存空间分配:

W25Q64/16/32 由每页 256 字节组成。每页的 256 字节用一次页编程指令即可完成。每次可以擦 除 16 页(1 个扇区)、128 页(32KB 块)、256 页(64KB 块)和全片擦除。

W25Q64 的内存空间结构:一页 256 字节,4K(4096 字节)为一个扇区,16 个扇区为 1 块,容量 为 8M 字节,共有 128 个块,2048 个扇区。

W25Q16内存空间结构:容量2M字节,32个块,对应的扇区32*16=512个扇区。

内存之间各种单位之间的关系:256字节=1页,16页=1扇区,16扇区=1块。

在我们操作flash地址时,格式一般为一个6位16进制数,换算成二进制数每位对应的含义分别对应了他的块地址(前两位),扇区地址(第三位),页地址(第四位)和业内地址(后两位)。具体关系如下:

STM32学习笔记——SpiFlash

相关寄存器:

对W25Q64芯片的操作,同样是由相应的控制寄存器和状态寄存器完成的

STM32学习笔记——SpiFlash

总线忙标志位(BUSY)

BUSY位是一个只读位,在状态寄存器中的S0位。当W25Q64在执行“页编程”、“扇区擦除”、“块区擦除”、“芯片擦除”以及“写状态寄存器”指令时,该位被硬件自动置1。这时候,除了“读状态寄存器”指令外的所有操作指令将会被芯片忽略。当芯片执行完这些指令后,硬件会自动将该位清零,表示芯片器件可以接收其他的指令。

写保护位(WEL)

WEL位是一个只读位,在状态寄存器的S1位。在执行完“写使能”指令后,该位会被硬件自动置1。当芯片掉电后和执行“写禁能”、“页编程”、“扇区擦除”、“块区擦除”以及“芯片擦除”指令都会进入“写保护状态”。

块区保护位(BP2、BP1、BP0)

BP2、BP1、BP0这3位为可读可写位,分别在状态寄存器的S4、S3以及S2位。这3个位默认状态为0,即块区处于未保护状态。可以利用“写状态寄存器”指令对这几个位进行置1来达到块区保护的目的。块区保护状态为:没有保护、部分保护和全部保护状态。

注:当状态寄存器的SRP位为1或读写保护管脚(/WP)为低电平时,这3个位不可被更改。

底部和顶部块保护位(TB)

TB位是一个可读可写位,在状态寄存器的S5位,默认值为0。可以利用“写状态寄存器”指令对这个位进行置1或清零。当TB = 0时,表示保护位从顶部开始,当TB = 1时,表示保护位从底部开始。

注:当状态寄存器的SRP位为1或读写保护管脚(/WP)为低电平时,这个位不可被更改。

扇区/块保护(SEC)

SEC位为一个可读可写位,在状态寄存器的S6位,默认值为0。可以利用“写状态寄存器”指令对这个位进行置1或清零。当SEC = 0时,表示每次保护的区域大小为4K;当SEC = 1时,表示每次保护的区域大小为8K。

状态寄存器保护位(SRP0、SRP1)

SRP0和SRP1这2位为可读可写位,分别在状态寄存器的S7和S8(状态寄存器2)位。这两个位的默认值为0,可以利用“写状态寄存器”指令对这个位进行置1或清零。这2个位和读写保护管脚(/WP)决定了状态寄存器写保护的方式。状态寄存器写保护的方式有:软件保护,硬件保护、电源锁定或一次性可编程(OTP)保护。

快速SPI通讯使能(QE)

QE位为一个可读可写位,在状态寄存器的S9(状态寄存器2)位,默认值为0。以利用“写状态寄存器”指令对这个位进行置1或清零。当QE = 0时,W25Q54设置为标准速度模式或快速模式,保持管脚(/HOLE)和读写保护管脚(/WP)启用;当QE = 1时,W25Q54设置为高速模式,保存管脚(/HOLE)和读写保护管脚(/WP)被设置为IO2和IO3功能使用。

具体操作步骤

相关指令表:

STM32学习笔记——SpiFlash

工作时序图

1,写使能

Write Enable指令将状态寄存器中的Write Enable Latch (WEL)位设置为1,在每个页面程序,扇区擦除,块擦除,芯片擦除和写状态寄存器指令执行前,都需要设置写使能为1。写使能指令先将CS引脚拉低,发送指令代码“06h”进入数据输入(DI)引脚上,在CLK的上升沿进行采集,然后将CS引脚拉高。

STM32学习笔记——SpiFlash

2,写失能

Write Disable指令操作顺序和使能一样,只不过是将发送的指令改为“04h”

STM32学习笔记——SpiFlash

3,读状态寄存器指令

当/CS 拉低之后,开始把 05h 从 DI0 引脚送到芯片,在CLK 的上升沿数据被芯片采集,当芯片认出采集到的数据时 05h 时,芯片就会把“状态奇存器〞的值从 DO引脚输出,数据在CLK 的下降沿输出,高位在前。“读状态奇存器”指令在任何时候都可以用,甚至在编程、擦除和写状态奇存器的过程中也可以用,这样,就可以从状态奇存器的 BUSY 位判断编程、擦除和写状态奇存器周期有没有结束,从而让我们知道芯片是否可以接收下一条指令了。如果/CS 不被拉高,状态寄存器的值将一直从 DO 引脚输出。/CS 拉高之后,读指令结束。

STM32学习笔记——SpiFlash

4,写状态寄存器

在执行“写状态寄存器”指令之前,需要先执行“写使能”指令。先拉低/CS引脚,然后把01h从DIO引脚送到芯片,然后再把你想要设置的状态寄存器值通过DIO引脚送到芯片,拉高/CS引脚,指令结束,如果此时没有把/CS引脚拉高,或者是拉的晚了,值将不会被写入,指令无效。

只有“状态寄存器”当中的“SRP, TB、BP2,BP1、BPO位”可以被写入,其它“只读位”值不会变。在该指令执行的过程中,状态寄存器中的BUSY位为1,这时候可以用“读状态寄存器”指令读出状态寄存器的值判断,当指令执行完毕, BUSY位将自动变为0,WEL位也自动变为0

通过对“TB” “BP2”“BP1” “BPO”位写1,就可以实现将芯片的部分或全部存储区域设置为只读。通过对“SRP位”写1,再把/P引脚拉低,就可以实现禁止写入状态寄存器的功能。

STM32学习笔记——SpiFlash

5,读取数据

“读数据”指令允许读出一个字节或一个以上的字节被读出。先把/CS引脚拉低,然后把03h通过DIO引脚送到芯片,之后再送入24位的地址,这些数据在CLK的上升沿被芯片采集。芯片接收完24位地址之后,就会把相应地址的数据在CIK引脚的下降沿从DO引脚送出去,高位在前。当读完这个地址的数据之后,地址自动增加,然后通过DO引脚把下一个地址的数据送出去,形成一个数据流。也就是说,只要时钟在工作,通过一条读指令,就可以把整个芯片存储区的数据读出来。把/cS引脚拉高, “读数据”指令结束。当芯片在执行编程、擦除和读状态寄存器指令的周期内, “读数据”指令不起作用。

STM32学习笔记——SpiFlash

6,按页写入数据

执行“页编程”指令之前,需要先执行“写使能”指令,而且要求待写入的区域都为1,也就是需要先把待写入的区域擦除。先把/CS引脚拉低,然后把代码02h通过DIO引脚送到芯片,然后再把24位地址送到芯片,然后接着送要写的字节到芯片。在写完数据之后,把/CS引脚拉高。

写完一页(256个字节)之后,必须把地址改为0,不然的话,如果时钟还在继续,地址将自动变为页的开始地址。在某些时候,需要写入的字节不足256个字节的话,其它写入的字节都是无意义的。如果写入的字节大于了256个字节,多余的字节将会加上无用的字节覆盖刚刚写入的的256个字节。所以需要保证写入的字节小于等于256个字节。

在指令执行过程中,用“读状态寄存器”可以发现BUSY位为1,当指令执行完毕, BUSY位自动变为0。如果需要写入的地址处于“写保护”状态, “页编程”指令无效。

STM32学习笔记——SpiFlash

7,获取设备信息

出于兼容性原因,W25Q64BV提供了几个指令以电子方式确定设备的身份。Read JEDEC ID指令与用于SPI的JEDEC标准兼容兼容串行存储器在2003年被采用。指令通过驱动/CS引脚启动降低并移动指令代码“9Fh”。JEDEC分配给Winbond (EFh)的制造商ID字节然后将两个设备ID字节,内存类型(ID15-ID8)和容量(ID7-ID0)移出以最有效位(MSB)为首的CLK下降沿,如图29所示。用于存储类型和

容量值参见厂商和设备标识表。

STM32学习笔记——SpiFlash

STM32模块编程思路

  1. 配置SPI模块功能管脚相应的GPIO管脚。
  2. 配置SPI模块工作方式。
  3. 使能SPI模块时钟。
  4. 根据SPI SPI主模式设置步骤设置SPI工作方式。
  5. 编写SPI读写字节函数。
  6. 根据目前器件的指令操作器件。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/33521.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信