zoukankan      html  css  js  c++  java
  • K9F2G08U0A(256M)

    K9F2G08U0A没有地址或数据总线,只有8个IO口,这8个IO口用于传输命令、地址和数据。NandFlash的存储单元是由Block组成的,Block又是由Page组成的,数据就是存储在Page上。K9F2G08U0A的总容量是256M,由图可以看出,它一共有2048块,每一块有64页,每一页有(2K+64)Bytes。每一页又分为main区和spare区,2K就是指main区,64就是指spare区。

    2K是指每一页上存放数据的有效空间,64是指每一页附加的空间,它不能用来存放我们写入的数据,它主要是用来存放ECC校验和坏块标记的信息数据。NandFlash是以页(Page)为最小单位进行读写的,以块(Block)为最小单位进行擦除的,也就是说当我们给定了读取的起始位置后,读操作将从该位置开始,连续读取到本Page的最后一个 Byte为止。

    K9F2G08U0A是用5个周期来实现,由于NAND flash以页为单位读写数据,而以块为单位擦除数据。按照这样的组织方式可以形成所谓的三类地址:
    Column Address:Starting Address of the Register. 翻成中文为列地址,地址的低8位 ,即页内偏移地址
    Page Address :页地址
    Block Address :块地址

    K9F2G08U0A的每一页有(2K+64)=2112Byte,2112byte 需要12bit来表示,对于2112byte系列的NAND,这2112byte被分成1st half Page Register和2nd half Page Register,各自的访问由地址指针命令来选择,A[11:0]就是所谓的column address(列地址),在进行擦除操作时不需要它,因为以块为单位擦除。64个page需要6bit来表示,占用A[17:12],即该page在块 内的相对地址,也就是确定位于哪一页。A11这一位地址被用来设置2048byte的1st half page还是2nd half page,0表示1st,1表示2nd。Block的地址是由A18以上的bit来表示,也就是确定位于哪一块。用A[0:28]这29位,就可以将 K9F2G08U0A这256M的数据存储空间全部访问到。2的29次方是2GBit,256MByte=2GBit。NAND Flash 的地址表示为: Block Address|Page Address in block|Column Address 地址传送顺序是Column Address,Page Address,Block Address。 由于地址只能在I/O[7:0]上传递,因此,必须采用移位的方式进行。 以K9F2G08U0A 为例: 第1 步是传递column address,就是NAND_ADDR[7:0],不需移位即可传递到I/O[7:0]上。 第2 步就是将NAND_ADDR 右移8位,将NAND_ADDR[11:8]传到I/O[7:0]上; 第3 步将NAND_ADDR[19:12]放到I/O上; 第4步需要将NAND_ADDR[27:20]放到I/O上;第5步需要将 NAND_ADDR[28]放到I/O上;,整个地址传递过程需要5步才能完成。

    举例:

    我们要访问其中的第1500个块中的第25页中的1208字节处的地址,此时,我们就要先把具体的地址算出来:物理地址=块大小×块号+页大小×页号+页内地址=1500×128K+25×2K+1208=0xBB8CCB8(196660408)

    0xBB8CCB8 = 0000 1011  1011 1000  1100 1100  1011 1000

                                  B         B        8       C       C        B       8    

    第一个周期:A[0:7]  也就是B8

    第二个周期:A[8:11]  取四位 1100, 再添4位0,也就是0000 1100   即0C

    第三个周期:A[12:19]  取八位 1000 1100  即8C

    第四个周期:A[20:27]  取八位 1011 1011  即BB

    第五个周期:A[28]     取一位 0,补齐八位 即 0000 0000 也就是00

    再往回分析,NandFlash收到前两个周期的地址A[0:11] 也就是0CB8,即 1100 1011 1000,分析:A[10:0]= 100 1011 1000=1208, 表示第1208个Byte

    收到后三个周期后,即 0000 0000 1011 1011 1000 1100,A[16:11]=011001=25,表示第25页

          0000 0000 1011 1011 100 处理后为    0101 1101 1100 =1500,表示第1500块

    为了方便使用,我们宏定义了K9F2G08U0A的常用命令

    #define CMD_READ1                0x00              //页读命令周期1

    #define CMD_READ2                0x30              //页读命令周期2

    #define CMD_READID               0x90              //读ID命令

    #define CMD_WRITE1               0x80              //页写命令周期1

    #define CMD_WRITE2               0x10              //页写命令周期2

    #define CMD_ERASE1               0x60              //块擦除命令周期1

    #define CMD_ERASE2               0xd0              //块擦除命令周期2

    #define CMD_STATUS               0x70              //读状态命令

    #define CMD_RESET                0xff               //复位

    #define CMD_RANDOMREAD1          0x05       //随意读命令周期1

    #define CMD_RANDOMREAD2          0xE0       //随意读命令周期2

    #define CMD_RANDOMWRITE          0x85       //随意写命令

    Nand Flash控制器的寄存器主要有NFCONF(Nand Flash配置寄存器),NFCONT(Nand Flash控制寄存器),NFCMMD(Nand Flash命令集寄存器),NFADDR(Nand Flash地址集寄存器),NFDATA(Nand Flash数据寄存器),NFMECCD0/1(Nand Flash的main区ECC寄存器),NFSECCD(Nand Flash的spare区ECC寄存器),NFSTAT(Nand Flash操作状态寄存器),NFESTAT0/1(Nand Flash的ECC状态寄存器),NFMECC0/1(Nand Flash用于数据的ECC寄存器),以及NFSECC(Nand Flash用于IO的ECC寄存器)。

    (1)NFCONF:2440的NFCONF寄存器是用来设置NAND Flash的时序参数TACLS、TWRPH0、TWRPH1。配置寄存器的[3:0]是只读位,用来指示外部所接的Nand Flash的配置信息,它们是由配置引脚NCON,GPG13,GPG14和GPG15所决定的(比如说K9F2G08U0A的配置为NCON、 GPG13和GPG14接高电平,GPG15接低电平,所以[3:0]位状态应该是1110)。

    (2)NFCONT:用来使能/禁止NAND Flash控制器、使能/禁止控制引脚信号nFCE、初始化ECC。它还有其他功能,在一般的应用中用不到,比如锁定NAND Flash。

    (3)NFCMMD:对于不同型号的Flash,操作命令一般不一样。参考前面介绍的K9F2G08U0A命令序列。

    (4)NFADDR:当写这个寄存器时,它将对Flash发出地址信号。只用到低8位来传输,所以需要分次来写入一个完整的32位地址,K9F2G08U0A的地址序列在图4已经做了详细说明。

    (5)NFDATA:只用到低8位,读、写此寄存器将启动对NAND Flash的读数据、写数据操作。

    (6)NFSTAT:只用到位0,用来检测NAND是否准备好。0:busy,1:ready。

    接下来就可以看Nand Flash的基本操作程序了。

  • 相关阅读:
    设计模式
    jQuery回到顶部插件jQuery GoUp
    CentOS7+Tomcat 生产系统部署
    iOS 时间戳转换为时间
    iOS开发系列--Swift 3.0
    IOS
    iOS之宏定义#define
    #define和预编译指令
    iOS宏定义的使用与规范
    ios十进制、十六进制字符串,byte,data等之间的转换
  • 原文地址:https://www.cnblogs.com/ht-beyond/p/4279586.html
Copyright © 2011-2022 走看看