【调试记录】nor flash芯片解读 | 25Q64系类芯片

  • 写在前面的话:
    这是最近在调试8MB 的 nor flash芯片时,遇到一些问题后,去翻阅flash英文芯片手册了解到了一些不同于网络上一些高赞文章所了解到的知识,本文会更关心flash内部的工作机制、三种工作模式以及状态寄存器
    这边也给看到这里的你一些建议,也许没遇到问题的时候,调用驱动库的接口可以实现功能,而去了解驱动库的运行逻辑以及flash芯片内部的控制和实现是一件更有意思的事情。
    此文章以现在市售的华邦winboud,GD,XMC等厂商的芯片手册为参考资料,遵循大部分flash通用的协议和规定,但是自己确实有遇到过同一款flash的不同系类,有不一样的状态寄存器的定义,当然是很个别的情况,建议在看完文章后,根据自己的芯片手册,进行查阅。文章是自己去查阅多款英文手册总结的,也许有一些错误,希望各位大佬们可以帮我指出。?

1.简介

  • W25Q64颗粒单位

    • page:256 Bytes :写单位
    • sector: 4k =16 page : 擦除单位
    • block:32k = 128page

    The W25Q64BV array is organized into 32,768 programmable pages of 256-bytes each. Up to 256 bytes can be programmed at a time. Pages can be erased in groups of 16 (sector erase), groups of 128 (32KB block erase), groups of 256 (64KB block erase) or the entire chip (chip erase). The 25Q64BV has 2,048 erasable sectors and 128 erasable blocks respectively.

2.工作模式

  • SPI的三种工作模式:Standard, Dual or Quad SPI

    • Standard SPI:CLK, /CS, DI, DO, /WP, /Hold,

      标准SPI,也就是我们常说的四线模式:片选 (/CS),时钟 (CLK),输入数据 (DI),输出数据 (DO)。另外配有写保护 (/WP) 和维持 (/HOLD) 功能。

    • Dual SPI: CLK, /CS, IO0, IO1, /WP, /Hold

      双线SPI,这种工作模式就是对标准SPI进行了改进,将DODI改成IO1IO2,变成了双向IO口,这样一个时钟周期可以读写2位数据。写保护(/WP)和维持(/HOLD)功能仍然保留。

    • Quad SPI: CLK, /CS, IO0, IO1, IO2, IO3

    四线SPI,这种工作模式是对Dual SPI模式进行改进,就是上面讲的,将写保护 (/WP) 和维持 (/HOLD) 引脚复用为IO口,标记为IO3IO4,这样总共就是四个IO口,数据传送速度更快。

不得不说,很多文章都没有详细的介绍,并且还千篇一律的把这三种模式单纯的介绍为2倍的速率和4倍的速率,这不仅没有消除我的疑惑,还让我更加怀疑了?。这边澄清下,Dual和Quad,并不是单纯的2倍和4倍的关系!!!! ,在两线和四线模式的时候,也要考虑在传输地址还是在传输数据的时候复用,又是以什么为标志开启复用的,这部分的内容会在第六章的时候结合时序图具体介绍

3.引脚图

引脚图

4.引脚功能表格

Pin NameFUNCTION
/CSChip Select
DO (IO1)Data Output (Data Input Output 1)*1
/WP (IO2)Write Protect Input ( Data Input Output 2)*2
DI (IO0)Data Input (Data Input Output 0)*1
CLKSerial Clock Input
/HOLD (IO3)Hold Input (Data Input Output 3)*2

*1 IO0 and IO1 are used for Standard and Dual SPI instructions
*2 IO0 – IO3 are used for Quad SPI instructions

5.三种状态寄存器[SR1-3]

这边插入一下关于“易失“的概念:flash存储器存储数据时具有非易失特性,即掉电数据不丢失。但是flash中也如同普通控制芯片一样,具有许多的寄存器,这些寄存器具有不同的功能,大部分的状态寄存器为非易失寄存器。

Status Register-1

在这里插入图片描述

  • Busy:只读位

    当 SPI FLASH 在执行 页编程, 扇区擦除,块擦除, 整片擦除, 写状态寄存器指令 等操作时, BUSY位被置1这些操作完成之后, BUSY位自动清0。当BUSY位为1时, 除了"读状态寄存器"操作和"擦除暂停"操作之外, 不接受任何其他操作。一般在程序中,用busy位是否为0,判断上一个操作[读写、擦除]是否完成。

  • WEL:只读位

    【Write Enable Latch】:当执行了一个"写使能"指令后, WEL置1, 表示可以写入了。

    "写禁止"时, WEL为0。“写禁止”,“页编程”, “扇区擦除”, “块擦除”,“整片擦除”, “写状态寄存器”, 执行完这些操作之后,WEL 自动被清0, 回到禁止写入状态。

  • BP0、BP1、BP2、 : 非易失的、可读可写

    【Block Protect bits】:他提供写保护控制和状态,即通过这三个bit,确定写保护的区域

    出厂默认这三个bit都是0,即任何区域都没有被保护。

  • TB:非易失、可读可写

    【Top/Bottom Block Protect】:搭配BP0-2一起使用,确定保护的区域是从top(TB=0)开始或者从bottom(TB=1)开始计算,在写状态寄存器的时候就可以使用,但是还取决于SRP, SRL 和 WEL bits.

    出厂默认为0。

  • SEC:非易失、可读可写

    【Sector/Block Protect】这个bit决定了BP保护的区域是以4KB或者64KB的区域为单位。

Status Register-2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VrVTzGPQ-1604484124484)(C:%5CUsers%5Chuangyifen%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20201104151754595.png)]

  • SRL:

    【Status Register Protect】当SRL=0时,保护状态寄存器不被改写。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dGxX10yV-1604484124492)(C:%5CUsers%5Chuangyifen%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20201104154331093.png)]

  • QE:非易失、可读可写

    【Quad Enable】:即四线使能,当这个bit被置成1时,SPI flash可以使用三种工作状态中的任意一种,当这个bit为0时,只能使用Standard 和 Dual 模式。

    PS:有的flash这个bit在出厂的时候,这个QE bit默认为1,且不可更改。

  • LB3, LB2, LB1:非易失、可读可写

    【Security Register Lock Bits】:flash中有3个256Byte的 Security Registers,这三个bit可以用来写保护和控制Security Registers的状态。当LB3-1为0,Security Registers没有被锁定。当它被置成1,Security Registers只能是只读。

  • CMP:非易失、可读可写

    【Complement Protect】:这个bit结合SEC, TB, BP2, BP1 and BP0 bits,来提供更加灵活的区域保护,当这个bit被设置为1时,SEC, TB, BP2, BP1 and BP0保护的区域将会反转。

  • SUS:只读

    当执行Erase/Program Suspend (75h) 指令之后,bit被设置为1。

    当执行Erase/Program Resume(7Ah) 和上下电时,bit被置为0。

Status Register-3

123

  • WPS:

    【Write Protect Selection】:用于选择应该使用的写保护方案。当WPS=0时,设备将使用CMP、SEC、TB、BP[2:0]位的组合来保护内存数组的特定区域。当WPS=1,设备将利用单个块锁来保护任何单个扇区或块。

  • DRV0-1:

    【Output Driver Strength】:用来决定输出的驱动强度

    DRV1, DRV0Driver Strength
    0, 0100%
    0, 175%
    1, 050%
    1, 125% (default)

以上有许多bit关系到了写保护的区域,具体的可以查看芯片手册中的表格。

  • 上面有许多关于flash写保护的寄存器,比如CMP、WEL、BP0-2、TB等,这么多的写保护功能并不重复,他们结合起来,是为了更加灵活的定义写保护的区域。而具体的用法在每个flash的芯片手册中,都有具体的表格一一对应

6.三种工作模式的详细介绍

数据手册中有基本的指令. DI 输入的第一个字节就是指令代码. DI在CLK上升沿采样, MSB .

指令有一个或多个字节, 可能后面还有 地址, 数据, dummy。

大体格式为:指令 + 地址/Adress + 数据/date dummy

cmdmeaningmodeexplain也就是
03hRead DataStandard正常读取数据标准读取数据
0BhFast ReadStandard参考表格[AC Electrical Characteristics],以更高的时钟频率进行读取数据快速标准读取数据
3BhFast Read Dual OutputDual输出date的时候,使用复用IO 0 - IO1两线输出
BBhFast Read Dual Input/OutputDualdate和address的时候,使用复用IO 0 - IO1两线输入输出
6BhFast Read Quad OutputQuad输出date的时候,使用复用IO 0 - IO4四线输出
EBhFast Read Quad Input/OutputQuaddate和address的时候,使用复用IO 0 - IO4四线出入输出

6.1 Read Data(03h)

这个指令读取数据为**Standard模式**,这个指令可以从存储器中读出一个或者多个数据,这个指令在/cs拉低后,DI引脚在时钟的上升沿 接收8位的命令和24位的地址,DO引脚在时钟的下降沿输出数据

在这里插入图片描述

6.2 Fast Read (0Bh)

快速读取数据,并不是模式的切换,此处还是**Standard模式**,只是以一个更高的时钟频率去读取数据,具体的频率支持参考数据手册中的参考表格[AC Electrical Characteristics]。除了指令部分,其他部分的时序同上。

在这里插入图片描述

6.3 Fast Read Dual Output (3Bh)

在输出[output]时使用==Dual模式== ,为二线输出模式,这个模式下在输出数据的时候复用两个IO,从时序图中可以看出,指令开始之前先把/CS拉低,随后DI发送8bit的指令和24bit的地址,之后空出虚空的8个clk,并在此期间,将DI的引脚模式从输入改为输出,DI复用位IO 0 ,8个虚空的clk之后两个IO一起输出数据。

在这里插入图片描述

6.4 Fast Read Dual I/O (BBh)

这里的I/O表示Input/Output,这里虽然还是==Dual模式== ,但是为二线输入输出模式,与上面的dual模式不同的是,原本在利用DI传输地址的时候,变成了DI 和DO 一起读取地址。在读取地址之后,要输出数据的时候,两个IO同时变成输出模式,共同输出数据。

在这里插入图片描述

6.5 Fast Read Quad Output (6Bh)

这里的模式是==Quad 模式== ,可以类比Dual模式下的output 与 intput/output 的读取数据模式,此处为四线输出模式。/CS拉低后,IO 0 传输8bit的指令和24bit的地址之后,IO0-3同时作为数据输出

在这里插入图片描述

6.6 Fast Read Quad I/O (EBh)

这里的模式是==Quad 模式,为四线输入输出==,即在/CS拉低之后,除了指令,地址和数据都是复用四线模式

在这里插入图片描述

7.软复位

对于nor flash而言,复位意味着,擦除flash内部易失的bit,让flash易失的bit恢复到出厂默认的状态,以排除一些复杂情况。复位分为两种,硬件复位软件复位

  • 硬件复位

flash一上电的瞬间,flash内部自己会进行复位操作。这个操作叫Power-up Reset
在这里插入图片描述

  • 软件复位

软复位是flash中的一个命令[准确的说,是两个命令结合在一起的],大部分用在flash初始化和cpu的shutdowm上。软复位的命令,通常由一个66h[使能复位]命令 和一个99h命令[复位]组成中间不能加入任何其他指令,并且在99h命令之后,要进行一段时间的延时[20-100us],以确保flash内部复位完成。


其他

这边可以小小的科普一下,为什么flash掉电不丢失。
首先记住一个知识点:flash中每一个地址数据都是由一个个MOSFET构成的,当flash中某个地址的数据为1时,此地址的MOSFET电压接近0;当flash中某个地址的数据为0时,此地址的MOSFET电压接近3.3V/5V;
首先,先回想起三极管/MOS管的结构,源级、漏极和栅级,当GS之间的电压大于阈值时,就会导通,否则就不导通,这是三极管和MOS管的开关特性,那么想要在电子沟道中存储数据,就需要在其中加入两个绝缘体,把电子锁在沟道中,这就是市面上大部分nor flash所使用的Floating Gate技术
MOSFET结构如下图
在这里插入图片描述
数据就存放在==floating gate(悬浮门)==之中,一个门可以存放1bit数据。
数据的写入和擦除,都通过control gate来完成。

7. 3/4 Byte寻址

其实Q64系类的nor flash 芯片并没有3/4byte的寻址模式的切换,好像是只有大于16Mb的nor flash芯片才需要,这个知识点后面补充一下再写。


后记:这篇文章是自己查阅英文数据手册总结的一份”读书笔记“吧,如果后续有新的我觉得有意思的知识点,还会继续记录下来。因为个人水平也不是很高,欢迎大家指出错误和缺点。如果这篇文章帮到你get到新的奇奇怪怪的知识点了,能不能给我点个赞呢?哈哈哈。


版权声明:本文为weixin_42881419原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。