• 【FLASH存储器系列十二】Nand Flash芯片使用指导之二


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

      

    目录

    1.1 芯片指令集

    1.2 READ PAGE(00h–30h)

    1.3 READ PAGE CACHE SEQUENTIAL (31h)

    1.4 READ PAGE CACHE RANDOM (00h-31h)

    1.5 PROGRAM PAGE(80h-10h)

    1.6 PROGRAM PAGE CACHE (80h-15h)

    1.7 ERASE BLOCK (60h-D0h)


            上一篇分享了MT29F8G08AJADAWP芯片的功能特性,今天继续分享此芯片的相关操作指令。

    1.1 芯片指令集

            芯片支持ONFI 1.0的相关指令,如下图所示。

            下面挑选几项常用指令进行分析。

    1.2 READ PAGE(00h–30h)

            READ PAGE(00h–30h):读page命令将页面从NAND闪存阵列复制到其各自的缓存寄存器,并启用数据输出(注意没有经过数据寄存器)。当裸片(LUN)准备就绪(RDY=1,ARDY=1)时,才能接受读命令。要从NAND闪存阵列读取页面,先将00h命令写入命令寄存器,然后将n个地址周期写入地址寄存器,并以30h命令结束。当数据从存储阵列传输到缓存寄存器时,选定的裸片(LUN)将在tR内为busy状态(RDY=0,ARDY=0)。主机判断数据传输是否准备好有两种办法,一是通过监控R/B#,二是可以通过读状态命令(70h,78h)判断,当读到RDY = 1, ARDY= 1时,主机需要再发送READ MODE(00h)命令禁用状态输出并启用数据输出,当主机请求数据输出时,输出从指定的列地址开始。

            数据输出时RANDOM DATA READ (05h-E0h)命令可以被执行。

            当内部ECC使能时,在数据传输完成时要使用READ STATUS (70h)命令来判断是否发生了传输错误。

            当芯片有多个裸片(LUN)时,在执行die间交错操作之时,在在发出READ MODE(00h)命令之前,必须使用READ STATUS ENHANCED(78h)命令来选中其中一个die,以避免总线冲突。

           如下为读page操作时序图:

            如下为带内部ECC的读操作时序图

    1.3 READ PAGE CACHE SEQUENTIAL (31h)

            READ PAGE CACHE SEQUENTIAL (31h):此命令在当前页从缓存寄存器输出时,将block内的下一页数据读取到数据寄存器中(注意这里有数据寄存器,数据寄存器和缓存寄存器不是一个东西)。当裸片(LUN)准备就绪(RDY=1,ARDY=1)时,该命令可以被接受。在读取页面缓存(31h,00h-31h)操作(RDY=1和ARDY=0)期间,该命令也可以被接受。

            将31h写入命令寄存器,发出此命令后,R/B#变为低电平,裸片(LUN)在tRCBSY时间内处于繁忙状态(RDY=0,ARDY=0)。tRCBSY之后,R/B#变为高,裸片(LUN)忙于缓存操作(RDY=1,ARDY=0),这表明缓存寄存器可用,并且指定的页正在从NAND闪存阵列复制到数据寄存器。此时,数据可以从缓存寄存器的列地址0开始输出。随机数据读取(05h-E0h)命令可以用于更改从缓存寄存器输出的数据的列地址。

            READ PAGE CACHE SEQUENTIAL(31h)命令可用于跨越block边界。如果在当前block的最后一页读入数据寄存器之后发出读取页缓存序列(31h)命令,则读取的下一页将是下一个逻辑block中的page。如果是跨die读取,则此命令无法实现,应使用READ PAGE CACHE LAST(3Fh)命令。

            如下为顺序读缓存页时序图:

    1.4 READ PAGE CACHE RANDOM (00h-31h)

            READ PAGE CACHE RANDOM (00h-31h):此命令将指定的块中的页读入数据寄存器,同时从缓存寄存器输出前一页。当die(LUN)准备就绪(RDY=1,ARDY=1)时,该命令被接受。在读取页面缓存(31h,00h-31h)操作(RDY=1和ARDY=0)期间,它也可以被(LUN)接受。

            要发出此命令,需将00h写入命令寄存器,然后将n个地址周期写入地址寄存器,最后将31h写入指令寄存器。指定地址中的列地址将被忽略。裸片(LUN)地址必须与先前的READ PAGE(00h-30h)命令或先前的READPAGE CACHE RANDOM(00h-31h)命令(如果适用)匹配。

            发出此命令后,R/B#变为低电平,在tRCBSY时间段内,die(LUN)处于繁忙状态(RDY=0,ARDY=0)。tRCBSY之后,R/B#变为高,die(LUN)忙于缓存操作(RDY=1,ARDY=0),这表明缓存寄存器可用,并且指定的页正在从NAND闪存阵列复制到数据寄存器。此时,数据可以从缓存寄存器的列地址0开始输出。随机数据读取(05h-E0h)命令可以用于更改从缓存寄存器输出的数据的列地址。

            如下为随机读缓存页时序图:

    1.5 PROGRAM PAGE(80h-10h)

            PROGRAM PAGE(80h-10h):此命令使主机能够向缓存寄存器输入数据,并将数据从缓存寄存器移动到选定die(LUN)阵列中的指定块和页地址。当裸片(LUN)准备就绪(RDY=1,ARDY=1)时,该命令可以被接受。当裸片(LUN)忙于编程页面缓存(80h-15h)操作(RDY=1,ARDY=0)时,它也可以被接受。

            要将页数据输入缓存寄存器并将其移动到指定块和页面地址的NAND阵列,需将80h写入命令寄存器。除非此命令前面有PROGRAM PAGE TWO-PLANE(80h-11h)命令,否则向命令寄存器发出80h将清除选定目标上的所有缓存寄存器内容。然后写入包含列地址和行地址的n个地址循环。随后是数据输入周期。串行数据从指定的列地址开始输入。在数据输入周期的任何时间,可以发出随机数据输入(85h)和内部数据输入程序(85h)命令。数据输入完成后,将10h写入命令寄存器。传输数据时,选定LUN将变忙(RDY=0,ARDY=0)tPROG的时间。

            为了确定数据传输的进度,主机可以监视目标的R/B#信号,也可以使用状态操作(70h、78h)。当裸片(LUN)就绪(RDY=1,ARDY=1)时,主机应检查FAIL位的状态。

            在具有多个裸片(LUN)的芯片中,在交错裸片(多LUN)操作期间和之后,必须使用READ STATUS ENHANCED(78h)命令仅选择一个裸片进行状态输出。使用READ STATUS(70h)命令可能会导致多个裸片(LUN)响应,从而导致总线争用。

            PROGRAM PAGE(80h-10h)命令为双平面编程操作的最终命令。前面是一个或多个PROGRAM PAGE TWO-PLANE(80h-11h)命令。数据从所有寻址平面的高速缓存寄存器传输到NAND阵列。主机应使用状态操作(70h、78h)检查操作状态。启用内部ECC时,阵列编程时间的持续时间为tPROG_ECC。在tPROG_ECC期间,当错误检测完成时,内部ECC生成奇偶校验位。

            如下为页编程时序图:

    1.6 PROGRAM PAGE CACHE (80h-15h)

            PROGRAM PAGE CACHE (80h-15h):此命令下主机将输入数据到缓存寄存器,芯片将缓存寄存器的中的数据复制到数据寄存器,然后将数据寄存器的数据移动到选中的存储阵列page中。在数据复制到数据寄存器中后,缓存寄存器可以支持下一个PROGRAM PAGE(80h-10h)和PROGRAM PAGE CACHE (80h-15h)命令,当裸片(LUN)准备就绪(RDY=1,ARDY=1)时,它可以接受PROGRAM PAGE CACHE(80h-15h)命令。当PROGRAM PAGE CACHE(80h-15h)命令操作执行期间,裸片(LUN)也可以接受此命令(就是指数据复制到数据寄存器中后,可以再发此命令往缓存寄存器写数据,这个操作不受上一页数据从数据寄存器移动到存储阵列的影响)。

            要将数据输入到缓存寄存器并将其移动到指定块和页面地址的NAND阵列,需将80h写入命令寄存器。除非此命令前面有PROGRAM PAGE TWO-PLANE(80h-11h)命令,否则向命令寄存器发出80h将清除选定目标上的所有缓存寄存器内容。

            然后写入包含列地址和行地址的n个地址循环。随后是数据输入周期。数据将从指定的列地址开始输入。在数据输入周期的任何时间,可以发出随机数据输入(85h)和内部数据输入程序(85h)命令。当数据输入完成时(指的是输入到缓存寄存器完成,这段时间为tCBSY),此时将15h写入命令寄存器,在tCBSY这段时间内,所选LUN将处于繁忙状态(RDY=0,ARDY=0),以允许数据寄存器被上一个页缓存编程命令所用,将数据从缓存寄存器复制到数据寄存器,然后开始将数据寄存器内容移动到指定的页和块地址。

            如下为页缓存编程时序图:

    1.7 ERASE BLOCK (60h-D0h)

            ERASE BLOCK (60h-D0h):此命令可以擦除指定的block。在die准备好(RDY = 1, ARDY = 1)时命令可以被接受。

            要擦除块,先将60h写入命令寄存器。然后写入包含行地址的三个地址周期,列地址忽略。最后将D0h写入命令寄存器。擦除块时,选定的裸片(LUN)将在tBERS时间段内处于忙(RDY=0,ARDY=0)状态。

            如下为块擦除时序图:

            指令太多就不一一列举了,大家可以到数据手册上进行查看,今天的分享就到这里,谢谢。

  • 相关阅读:
    HarmonyOS开发:走进静态共享包的依赖与使用
    Serialiable接口和serialVersionUID的作用及其在redisson中的应用
    onnx和pytorch,tensorrt 推理速度对比GPU CPU
    卡奥斯低代码平台新版本体验活动
    使用Tmux的基本操作与后台运行命令
    Pandas+ SLS SQL:融合灵活性和高性能的数据透视
    SCI一区 | Matlab实现PSO-TCN-LSTM-Attention粒子群算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测
    Kafka客户端Java代码使用
    Authing 入选 Gartner《2022 中国网络安全技术成熟度曲线》报告
    R语言计算两个向量成对元素的最大值:计算两个向量的平行最大值(parallel maximum)
  • 原文地址:https://blog.csdn.net/highman110/article/details/128039906