您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页【转】Nand Flash原理分析与编程

【转】Nand Flash原理分析与编程

来源:华佗小知识

NAND Flash 在嵌入式系统中的地位与PC机上的硬盘是类似的。用于保存系统运行所必需的操作系统,应用程序,用户数据,运行过程中产生的各类数据,系统掉电后数据不会护丢失。现在的Flash主要有两咱,一种是NAND Flash 一种是Nor Flash。NOR Flash是由Intel公司于1988年发明的,用以代替EERPOM,NAND Flash由Toshiba 公司在19年发明的。

    网上有很多介绍两者区别的文章,在此就不做介绍了,主要介绍关于NAND Flash的组织结构和编写程序的方法。

        NAND Flash的寻址方式和NAND Flash的memory组织方式紧密相关。NAND Flash的数据是以bit的方式保存在 memory cell(存储单元)。一般情况下,一个cell中只能存储一个bit。这些cell以8个或者16个为单位,连成 bit line ,形成所谓的byte(x8)/word(x16),这就是NAND Flash的位宽。

         这些Line会再组成Pape(页)。然后是每32个page形成一个Block,所以一个Block(块)大小是16k.Block是NAND Flash中最大的操作单元,其中的擦除操作是以Block为单位进行擦除的,而读写和编程是以page为单位进行操作的,并且读写之前必须进行flash的擦写。我们这里以三星K9F1208U0M的NAND Flash为例,它的大小是MB的。

1block = 32page

1page = 512bytes(datafield) + 16bytes(oob)

      K9F1208U0B总共有4096 个Blocks,故我们可以知道这块flash的容量为4096 *(32 *528)= 69206016 Bytes = 66 MB(故用烧录器将其内容全部读出,可保存为大小为67584kB的BIN文件,科系的代理商竟然说我的文件太大,故烧录时造成部分失败。。。。。,有理说不清了都!)

   但事实上每个Page上的最后16Bytes是用于存贮检验码用的,并不能存放实际的数据,所以实际上我们可以操作的芯片容量为
4096 *(32 *512) = 671088 Bytes = MB 

 

存储操作特点:

1.擦除操作的最小单位是块

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

3 OOB部分的第六字节(即517字节)标志是否坏块,如果不是坏块该值为FF,否则为坏块

4 除OOB第六字节外,通常至少把OOB前3字节存放Nand Flash硬件ECC码

Columnaddr = addr % 512   // column address

Pageaddr = addr>>9            // page address

 

现在假设我要从Nand Flash中的第5000字节处开始读取1024个字节到内存的0x30000000处,我们这样调用read函数 

NF_Read(5000, 0x30000000,1024); 

我们来分析5000这个src_addr.

根据   

column_addr=src_addr%512;       

page_address=(src_addr>>9);     

我们可得出column_addr=5000%512=392

page_address=(5000>>9)=9

column_addr=5000%512;

page_address=(5000>>9);

NF_CMD=0x01;                                          //要从2nd half开始读取 所以要发送命令0x01

NF_ADDR= column_addr &0xff;                     //1st Cycle A[7:0]

NF_ADDR=page_address& 0xff

NF_ADDR=(page_address>>8)&0xff;                 //3rd.Cycle   A[24:17]

NF_ADDR=(page_address>>16)&0xff;              //4th.Cycle   A[25]

我用下面的代码进行数据的读取. 

for(i=column_addr;i<512;i++)

        *buf++=NF_RDDATA();

每当读取完一个Page之后,数据指针会落在下一个Page的0号Column(0号Byte).

 

from:

转载于:https://www.cnblogs.com/dahai/archive/2010/07/13/1776308.html

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务