• Nandflash K9F1208U0B学习


    注:

    Row也就是page

    1. 引脚描述

    I/O0 ~ I/O7-----data inputs/outputs

    通过这8个I/O引脚,可以输入命令,地址和数据,也可以在读操作时输出数据。

    CLE-----command latch enable

    CLE输入控制了发送到命令寄存器的命令。CLE为高电平时激活,在nWE的上升沿,命令通过I/O端口被锁存到命令寄存器中,结合datasheet的相关时序图来理解更为深刻。

    ALE-----address latch enable

    ALE输入控制了地址发送到内部地址寄存器中,在nWE的上升沿和ALE为高电平时,地址被锁存到地址寄存器中。

    nCE-----chip enable

    nCE是设备选择控制引脚。

    nWE-----write enable

    写使能,在nWE的上升沿,命令,地址和数据被锁存。

    nWP -----write protect

    写保护,当此引脚为低电平激活,也即内部高压发生器复位。

    R/B-----ready/busy output

    就绪/忙输出引脚,通过这个引脚可以知道设备操作的状态。低电平时,表示编程或擦除或随机读操作在进行,并且根据完成情况来返回高状态。

    1. K9F1208U0B的存储结构和存储特点

    2.1  K9F1208U0B的存储结构

     

     

    一片K9F1208U0B总共有4096blocks,每个block包含32pages,每个page包含528bytes,关系如下:

    1 device = 4096 blocks

    1 block = 32 pages

    1 page = 512 Bytes data field + 16 bytes spare field

    所以一片K9F1208U0B的容量为4096*32*528=66MB,但是事实上每个page上的最后16bytes是用于存储校验码用的,并不能存放实际的数据,所以实际上我们可以操作的芯片容量为4096*32*512=64MB

    由上图可知,1个page总共由528 bytes组成,这528 bytes安顺序由上到下以列为单位进行排列(1列代表一个byte,第0行为第0 byte,第1行为第1 byte)。这528 bytes按功能分为两大部分,分别是data field和spare field,其中spre field占528 bytes里的16 bytes,这16 bytes是用于在读写操作的时候存放校验码用的,一般不用做普通数据的存储区,除去16 bytes,剩下的512 bytes便是我们用于存放数据用的data field,所以一个page上虽然有528 bytes,但我们只按512 bytes进行容量的计算。

    Data field安装位置有分为两部分,分别成为1st half和2nd half,每个half各占256 bytes,至于为什么要把data field分为两部分,后面将做进一步分析。

    2.2   K9F1208U0B存储操作特点

    ⑴K9F1208U0B是以页为单位进行读写,以block为单位进行擦除。

    ⑵K9F1208U0B芯片每一位只能从1变为0,而不能从0变为1,所以在对其进行写操作之前一定要将相应块擦除(擦除即是将相应块的位全部变为1)

    ⑶最后16 bytes(OOB),OOB的第六个字节(即第517个byte)标志是否是坏块,如果不是坏块该值为FF,否则为坏块!

    ⑷除OOB第六字节外,通常至少把OOB的前3个字节存放nandflash硬件ECC码。

    2.3    

    1. K9F1208U0B的地址空间

     

    64M byte物理空间需要26位地址,所以需要4个周期来发送地址,见上图

    Column address

    列地址,columm address其实就是指定page上的某个byte,指定这个byte,其实也就是指定此页的读写起始地址。512byte需要8bit来表示,对于528byte系列的NANDFLASH,这512byte被分成1st half和2nd half,各自的访问由不同的命令(00h/01h)来选择

    因为我们的地址,命令和数据都只能通过I/O0~I/O7这8个引脚发送到nandflash,对应于A0~A7,这也就是为什么A8不出现在我们传递的地址位中,也就是说我们能够指定的column address范围为0~255,但是,1个page的datafield是有512个byte组成的,假设现在我要指定读命令从第256个byte处开始开始读取此页,那么将会发生什么情景呢?我必须把column address设置为256,但column address最大只能是255,这就造成数据溢出,正是这个原因才把data field分成2个半区。当腰读取的其实地址(column address)在0~255内时我们用00h命令,当读取的其实地址是256~511时,则使用01h命令

    Page address

    页地址,由于页地址总是以512byte对齐的,所以它的低9位总是0,确定读写操作时在flash上的哪个页进行的。一个block有32个page,所以需要5bit来表示,即A9~A13,即该页在blcok内的相对地址

    Block address

    一个K9F1208U0B flash有4096个block,所以需要12bit来表示,及A14~A25。

    地址传送顺序是column address,page address,block address,但由于地址只能在I/O[7:0]上传送,因此,必须采用移位的方式进行,下面以NandAddr为例

    ⑴第一步是传递column address,就是NandAddr[7:0],不需要移位即可传递到I/O[7:0]上,而halfpage pointer即bit8是有操作指令(00h/01h)决定的,即指令决定是在哪个halfpage上进行读写,而真正的bit8的值是don’t care的。

    ⑵第2步就是将NandAddr右移9bit,将NandAddr[16:9]传到I/O[7:0]上。

    ⑶第3步就将NandAddr[24:17]放到I/O[7:0]上。

    ⑷第4步需要将NandAddr[25]放到I/O[0]上,因此,整个地址传递过程需要4步才能完成,即4-step addressing。

    1. K9F1208U0B的操作命令集

     

    ⑴ Read 1

    命令是00h/01h,这两个命令用于读取datafield的数据,其中00h表示将要读取K9F1208U0B存储空间中一个页的前半部分,并且将内置指针定位到前半部分的第一个字节;01h表示将要读取K9F1208U0B存储空间中一个页的后半部分,并且将内置指针定位到后半部分的第一个字节。

    ⑵ Read 2

    命令是50h,用于读取sparefield的数据。

    ⑶ Read ID

    命令是90h,读取nandflash芯片的ID号

    ⑷ Reset

    命令是FFh,重启nandflash芯片。

    ⑸ Page Program

    对页进行编程命令,由于写操作,首先写入00h(A区)/01h(B区)/50h,表示写入那个区;再写入80h开始编程模式(写入模式),接下来写入地址和数据,最后写入10h表示编程结束。

    ⑹ Block Erase

    块擦除命令,首先写入60h进入擦写模式,然后输入块地址;接下来写入D0h,表示擦写结束。

    ⑺ Read Status

    读取内部状态寄存器值命令,命令式70h。

  • 相关阅读:
    HDU1166:敌兵布阵(树状数组)
    elasticsearch 7.4.0依赖
    IntelliJ IDEA手工安装插件方法
    Guava入门
    Maven添加Oracle驱动及依赖
    springboot整合netty(二)
    MyBatis-Plus
    「Chris Richardson 微服务系列」服务发现的可行方案以及实践案例
    spring initializr
    String.Format( )用法
  • 原文地址:https://www.cnblogs.com/LoongEmbedded/p/1880379.html
Copyright © 2020-2023  润新知