• 【FLASH存储器系列六】SPI NOR FLASH芯片使用指导之二


    👉个人主页: highman110
    👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容

           上一篇分享了W25Q128这款SPINORFlash的芯片简介、引脚定义、功能框图、器件操作相关章节,本篇继续分享芯片寄存器介绍、写保护操作、指令集相关指令介绍。

    1寄存器

    1.1状态寄存器1(SR1)

    S0:1表示正在擦除或编程,0表示擦除或编程完毕;

    S1:1表示写使能,0表示写禁止;

    S2~S4区块保护位可以用写状态寄存器1(WRSR1)指令设置,可以对全部、部分存储区域进行写保护或者全部都不保护。区块保护位在出厂时被置为0,对存储区域不保护;

    S5:控制BP3~0保护范围是顶部(TB=0)或底部(TB=1)。出厂默认为0,可以用写状态寄存器1(WRSR1)指令设置;

    S6:1表示保护4KB的扇区,0表示保护64KB的区块;

    S7:与SRP1一起设置状态寄存器的保护

    1.2状态寄存器2(SR2)

    S8与SRP0一起设置状态寄存器的保护

    SRP1

    SRP0

    WP#

    状态寄存器

    说明

    0

    0

    X

    软件保护

    WP#引脚不控制。状态寄存器可以在写使能指令之后(WEL=1)写入。(出厂默认值)

    0

    1

    0

    硬件保护

    WP#引脚为低时,状态寄存器被保护,不能改写。

    0

    1

    1

    硬件不保护

    WP#引脚为高时,状态寄存器可改写,状态寄存器可以在写使能指令之后(WEL=1)写入。

    1

    0

    X

    电源锁定

    状态寄存器受保护,在下一次掉电、上电或器件复位前不可被改写。(1)

    1

    1

    X

    一次性编程

    状态寄存器被永久保护,不能改写。

    注意:1.SRP1,SRP0=(1,0)时,上电或器件复位后,(SRP1,SRP0)变为(0,0)

    S9:1表示支持QaudSPI或QPI,0表示支持DualSPI或SPI;

    S11~S13安全寄存器的锁定位,默认为0,安全寄存器未锁定,1表示安全寄存器锁定,无法被改写,且一旦设置为1,安全寄存器将被永久锁定;

    S14:互补保护位与TB、BP3~0保护位一起使用,为存储器保护提供了更大的灵活性。当CMP设置为1时,TB、BP3~0之前设置的阵列保护将被反转。例如,当CMP=0时,一个64KB的区块可以被保护,而存储器的其余部分不被保护;当CMP=1时,最上面的64KB扇区将不再受保护,而存储器的其余部分将被保护变为只读。出厂默认设置为CMP=0;

    S15:在执行擦除/编程挂起指令时,该位被设置为1,在执行擦除/编程恢复指令或重新上下电后,该位被设置为0;

    1.3状态寄存器3(SR3)

    S18:WPS位用于选择写保护方案。当WPS=0时,器件将使用CMP、TB、BP3~0的组合来保护存储器阵列的特定区域。当WPS=1时,设备将使用单个区块保护位来保护任意单个扇区或区块,出厂默认设置为WPS=0。;

    S21~S22DRV1和DRV0位用于设置管脚输出驱动能力;

    DRV1,DRV0

    驱动能力

    0,0

    100%

    0,1

    75%

    1,0

    50%

    1,1

    25%

    S23:当HOLD/RST=0(工厂默认值)时,HOLD#引脚作为HOLD功能引脚;当HOLD/RST=1时,HOLD#引脚作为复位功能引脚。

    2写保护

            使用非挥发性存储器时,必须考虑到系统中的噪声或其他意外情况可能会破坏数据的完整性。为避免此类情况,芯片提供了多种方式,以保护数据不受到意外的破坏。

    1、在写操作过程中,当VCC低于阈值时芯片复位。

            当上电或下电时,如果VCC低于阈值VWI,芯片保持为复位状态。在复位状态下,芯片的所有操作被禁止,并且芯片不识别任何指令。

    2、上电后一段时间内芯片禁止操作。

            在上电过程中,在VCC高于VWI之后的一段时间tPUW,所有的编程及擦除指令被禁止,包括写使能,页编程,扇区擦除,全芯片擦除以及写状态寄存器指令。需要注意,在上电过程中,片选管脚CS#必须跟随电源电压VCC,直到达到VCC(min)并经过了tVSL的延迟。如果需要,可以在CS#管脚接上拉电阻。

    3、支持写使能/写禁止指令,当擦除/编程结束后自动进入写禁止状态。

    4、使用状态寄存器进行软件、硬件协同写保护。

            软件控制的写保护可方便使用写状态寄存器指令、设置状态寄存器保护位(SRP0,SRP1)、区块保护(CMP,SEC,TB,BP[2:0])位方便。这些设置允许将小到64KB扇区的部分或整个存储器配置为只读。通过与写保护(WP#)引脚配合使用,允许或禁止对状态寄存器的更改。

            如下表,表里BP3位在寄存器描述里没有,应该是表写错了。

            当WPS=0,CMP=0时,保护的区块如下表:

            当WPS=0,CMP=1时,保护的区块如下表:

            当WPS=1时,第0和511区块中的每个4K-字节扇区或每个64K-字节区块(第1~510区块)都可以设置独立的保护位,包括持久保护(PPB)(W25Q128不支持PPB保护指令,此指令应该是给4字节地址芯片使用的)和动态保护(DYB)2种机制。如果任一机制保护生效,则相应的扇区或区块被写保护。每个扇区或区块的保护包括一个非易失性(PPB)保护位和一个易失性(DYB)保护位。当PPB位为0或DYB位为1时,相应的扇区或区块被写保护。

            36h指令:DYB锁定,为了使用DYB保护模式,状态寄存器2的WPS必须设置为1。如果WPS=0,写保护将由状态寄存器中的CMP、TB、BP3~0位的组合决定。DYB锁定位是易失性的,上电或复位后默认值是1,所以整个内存数组被保护。为了锁定一个扇区或区块,在操作之前需要先执行写使能(WREN),WREN指令将WEL置为1。然后执行“DYB锁定(36h)”指令,先CS#变低,输入指令码(36h),跟随24/32-位地址,之后CS#变高。

            39h指令:DYB解锁,为了解锁一个扇区或区块,在操作之前需要先执行写使能(WREN),WREN指令将WEL置为1。然后执行“DYB解锁(39h)”指令,先CS#变低,输入指令码(39h),跟随24/32-位地址,之后CS#变高。

            3Dh指令:读DYB,为了读出一个扇区或区块的DYB锁定状态,先CS#变低,输入指令码(3Dh),跟随24/32-位地址,之后在时钟下降沿输出数据,最高位在前。如果最低位(LeastSignificantBit-LSB)1,指示相应的区块/扇区被锁定保护;如果最低位为0,指示相应的区块/扇区被解锁,可擦写。

            7Eh指令:全局DYB锁定,可以一次性把所有的DYB位设置为1,也就是全区保护。在操作之前需要先执行写使能(WREN),WREN指令将WEL置为1。然后CS#变低,输入指令码(7Eh),然后CS#变高。

            98h指令:全局DYB解锁,可以一次性把所有的DYB位设置为0。在操作之前需要先执行写使能(WREN)WREN指令将WEL置为1。然后CS#变低,输入指令码(98h),然后CS#变高。

            PPB指令包括(W25Q128不支持):

            E2h指令:读PPB,为了读出一个扇区或区块的PBB锁定状态,先CS#变低,输入指令码(E2h),跟随32-位地址,之后在时钟下降沿输出数据,最高位在前。如果最低位(LeastSignificantBit-LSB)0,指示相应的区块/扇区被锁定保护;如果最低位为1,指示相应的区块/扇区被解锁,可擦写。在3-字节地址模式和4-字节地址模式下,“读PPB指令都需要输入32-位地址。

            E3h指令:PPB编程,可以将所有的PPB设置为1。先执行“写使能(06h)指令把WEL设置为1。接着CS#变低,输入指令码(E3h)和32-位地址,然后CS#立即驱动高执行编程PPB操作。内部PPB编程过程中,用户可以通过读状态寄存器1的WIP判断PPB编程是否结束。编程PPB操作不支持挂起(75h)操作。在3-字节地址模式和4-字节地址模式模式下,“PPB编程(E3h)”指令都需要输入32-位地址。

            E4h指令:PPB擦除,可以将所有的PPB设置为1。先执行“写使能(06h)指令把WEL设置为1。接着CS#变低,输入指令码(E4h)32-位地址,然后CS#立即驱动高执行擦除PPB操作。内部PPB擦除过程中,用户可以通过读状态寄存器1WIP判断PPB擦除是否结束。擦除PPB操作不支持挂起(75h)操作。在3-字节地址模式和4-字节地址模式下,“PPB擦除(E4h)指令都需要输入32-位地址。

            对于大于128Mbit的器件,状态寄存器3还有一个PPB锁定位PPBL。PPB锁定位是保护所有PPB位的易失性寄存器位。当清除为0时,锁定保护所有的PPB不被改写;当设置为1时,允许PPB被改写。在器件上电或复位后,PPB锁定位默认被设置为1,使PPB位不受保护。使用“写PPB锁定寄存器(A6h)指令可将PPB锁位清除为0,以保护PPB。任何指令都不能将PPB锁位直接设置为1,因此PPB锁位将保持为0,直到下一次关机或软件/硬件复位。只有在所有的PPB被配置为所需的设置之后,PPB锁位才能被清除到0。相关指令:读状态寄存器3(15h),写PPB锁定寄存器(A6h)

    5、使用深度下电指令进行写保护。

            执行“深度下电(B9h)指令是把芯片设为最低功耗模式的唯一方法,这一方法也可以作为额外的软件写保护机制,因为在这一模式下,芯片忽略所有操作指令(ABh指令)。把CS#变高可以不选中芯片,并使芯片处于待机模式(如果没有正在进行的内部操作),但这不是深度下电模式。深度下电模式只能通过“深度下电(B9h)指令指令进入,从而减小待机电流。电源掉电时,芯片自动退出深度下电模式,上电时,芯片总是处于待机模式。进入该模式的方法是把CS#变低,在DI上输入“深度下电(B9h)指令。在发送指令的过程中,CS#必须保持为低。在“深度下电(B9H)指令的第8位被锁存后,CS#必须被置高,否则指令不会被执行。在CS#被置高后,芯片需要tDP的延迟才能进入DP模式,电流降为ICC2。在深度下电模式下,芯片只接受从深度下电恢复/读器件ID”指令,并恢复到正常状态。

    6、通过状态寄存器2的LBx来保护安全寄存器。

            安全扇区锁定位是状态寄存器2中的非易失性一次性编程(OneTimeprogram-OTP)位,为安全扇区提供写保护控制。LB的出厂默认状态为0,安全扇区已解锁。LB可以使用写状态寄存器指令设置为1。因为LB具有一次性编程(OTP)特性,一旦它被设置为1时,相应的安全扇区将永久成为只读,不可被改写。

    3指令集

            标准/Dual/QuadSPI指令集由79条基本指令组成,,这些指令完全通过SPI总线控制。指令由片选(CS#)的下降沿启动。第一个字节数据根据时钟同步在DI输入指令码。DI输入的数据在时钟的上升边缘首先以最高有效位(MSB)进行采样。

            QPI指令集由60条基本指令组成,它们完全通过QPI总线控制。指令由芯片片选(CS#)的下降沿启动。第一个字节数据根据时钟同步在DQ3~0输入指令码。在所有四个DQ引脚上的输入的数据首先在时钟的上升边缘首先以最高有效位(MSB)进行采样。所有QPI指令、地址、数据和Dummy字节使用四个DQ管脚,每个字节只需两个串行时钟周期。

            指令的长度从一个字节到若干字节变化,指令码后面可跟随地址字节、数据字节、或dummy字节。指令由CS#的上升沿结束。所有的读指令可以在任何时候结束,而所有写指令必须在字节边界处结束,否则指令被忽略。

            W25Q128FV由于不支持4字节地址和DTR,所以它只支持45种Standard/Dual/QuadSPI基础指令,支持32种QPI指令。

            下面挑选几条典型指令详细描述:

            普通读(03h):

            “普通读”指令允许从存储器中顺序读出一个或多个数据字节,执行该指令时,CS#变低,然后输入指令“03h后,跟随一个24位地址(A23-A0)32位地址(A31-A0)。指令和地址在时钟上升沿被存储器锁存。之后存储器中给定地址上的数据在时钟下降沿上从DO输出,字节数据最高位在前。每个字节的数据输出后,存储器自动增加到下一个地址,这样外部只要持续输入时钟,存储空间的数据将按地址顺序依次输出。这意味着只要持续输入时钟,一次读操作可以访问整个存储空间,CS#变高结束读操作。当读操作访问到存储空间最高地址后,如果持续给时钟,内部地址自动会回绕到存储器的起始地址继续输出数据。“普通读”指令序列如下图所示,在擦除、编程或写执行过程中(WIP=1),读指令被忽略,不影响正在执行的内部操作。“普通读”指令只支持标准SPI模式。

            快速读(0Bh):

            “快速读指令”指令与“普通读”(03h)指令相似相似,差别是需要在指令(0Bh)24/32-位地址之后,输入一定数量的Dummy时钟,且支持更高的工作频率。Dummy时钟数通过配置寄存器设置。

            “快速读指令(0Bh)也支持QPI模式,Dummy时钟数通过配置寄存器设置。

            读命令不一一列举了,我这边总结一下:

        1、普通读(03h):指令和地址都用一根线传;

        2、快速读(0Bh):指令和地址都用一根线传,但是支持更高的时钟速率;

        3、DTR快速读(0Dh):指令和地址都用一根线传,但是地址在时钟上升、下降沿均采样,数据在时钟上升、下降沿均输出;

        4、双口输出快速读(3Bh):指令和地址都用一根线传,但是数据输出用DQ0、DQ1输出;

        5、四口输出快速读(6Bh):指令和地址都用一根线传,但是数据输出用DQ0、DQ1、DQ2、DQ3输出;

        6、双口I/O快速读(BBh):指令用一根线传,但是地址和数据用DQ0、DQ1两根线传;

        7、双口I/ODTR快速读(BDh):指令用一根线传,地址和数据用DQ0、DQ1两根线传,但是双边沿采用;

        8、四口I/O快速读(EBh):指令用一根线传,但是地址和数据用DQ0、DQ1、DQ2、DQ3四根线传;

        9、四口I/ODTR快速读(EDh):指令用一根线传,地址和数据用DQ0、DQ1、DQ2、DQ3四根线传,但是双边沿采用;

        10、QPI模式-快速读(0Bh):指令、地址、数据均用四根线传;

        11、QPI模式-DTR快速读(0Dh):指令、地址、数据均用四根线传,且均双边沿采样。此模式读速度最快。

            页编程(02h):

            “页编程(02h)指令可以将1~256字节数据(一页)写入事先擦除过(FFh)的存储区域。在操作之前,需要先执行写使能。WREN指令将WEL置为1。首先把CS#变低,然后给出PP指令02h,随后是3/4字节的地址和至少一字节的数据。如果最低的8个地址位(A7~A0)不为全0,则所有超过当前页边界的数据将从本页的起始地址开始写入。在整个发送指令过程中,CS#必须保持为低。时序图如下图所示。如果发送给芯片的数据超过256字节,则地址计数回绕到页地址的起始处并覆盖之前发送的数据,因此只有最后的256个字节能保证被写入同一页内。在最后一个字节的第8位被锁存后,CS#必须被置高,否则编程不会开始。一旦CS#变高,芯片会启动自定时的内部编程周期。在内部编程过程中,可以读取状态寄存器以检查WIP位。内部编程过程中,WIP位等于1,编程结束后,WIP位等于0。在周期结束前的某一个时间(该时间未指定)WEL位被复位。如果背景数据位为0,无法被编为1,内部校验通过,不报错。对被保护的区域不能执行页编程指令。“页编程(02h)指令也支持QPI模式。

            四口输入页编程(32h):

            “四口输入页编程(32h)指令类似于“页编程(02h)指令,差别是数据通过DQ3~0四个引脚输入。这使得数据传输速率时标准SPI接口的4倍,可以提高PROM编程器和5MHz频率以下应用的性能。如果系统时钟较快,四口输入页编程指令对于性能改善将不明显,因为内部操作时间比数据输入时间长很多,时序如下图所示。“四口页编程(32h)指令仅支持SPI模式。

            扇区擦除(20h):

            “扇区擦除(20h)指令将选中的扇区(4KB)数据全部置为1。在操作之前,需要先执行写使能(WREN)WREN指令将WEL置为1。首先把CS#变低,然后给出扇区擦除(20h),随后是3/4字节的地址。在整个发送指令过程中,CS#必须保持为低。时序图如下图所示。在最后一个字节的第8位被锁存后,CS#必须被置高,否则扇区擦除不会开始。一旦CS#变高,芯片会启动自定时的扇区擦除周期。在擦除过程中,可以读取状态寄存器以检查WIP位。擦除过程中,WIP位等于1,擦除结束后,擦除结束后,WIP=WEL=0。对被保护的区域不能执行扇区擦除指令。指令支持QPI模式。

            擦除指令还有:32KB区块擦除(52h),64KB区块擦除(D8h),全芯片擦除(C7h/60h),这里不一一赘述。

  • 相关阅读:
    Vue3——区域内无限滚动
    《Head First HTML5 javascript》第10章 自定义对象
    SpringCloud Alibaba —— Nacos 作为注册中心 —— Nacos 的安装与配置 以及安装后启动可能出现的问题
    QT+OSG/osgEarth编译之九十一:osgdb_pnm+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_pnm)
    三种 常用接口
    电脑怎么用U盘重装系统-电脑用U盘重装Win10系统的步骤
    使用 C# / Unity 进行图像处理
    ros系统的安装及小海龟运行
    压缩上传的图片并返回图片路径
    深度优先搜索&广度优先搜索
  • 原文地址:https://blog.csdn.net/highman110/article/details/127675107