Nand Flash原理分析与编程

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

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

       在三星的NAND Flash中,当CPUNAND Flash开始启动时,CPU会通过内部的硬件将NAND Flash开始的4KB数据复制到称为“Steppingstone”的4KB的内部RAM中,起始地址为0,然后跳到地址0处开始执行。这也就是我们为什么可以把小于4KB的程序烧到NAND Flash中,可以运行,而当大于4KB时,却没有办法运行,必须借助于NAND Flash的读操作,读取4KB以后的程序到内存中。

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

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

1block = 32page

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

      K9F1208U0B总共有4096Blocks,故我们可以知道这块flash的容量为4096 *(32 *528)= 69206016 Bytes = 66 MB

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

 

                       Nand Flash 物理结构图

 

    在NAND Flash中有8I/O引脚(IO0—IO7)、5个全能信号(nWE ALE CLE nCE nRE)、一个引脚,1个写保护引脚。操作NAND Flash时,先传输命令,然后传输地址,最后读写数据。对于64MBNAND Flash,需要一个26位的地址。只能8I/O引脚充当地址、数据、命令的复用端口,所以每次传地址只能传8位。这样就需要4个地址序列。因此读写一次nand flash需要传送4次(A[7:0] A[16:9] A[24:17] A[25])。64MNAND Flash的地址范围为0x00000000—0x03FFFFFF。

    一页有528个字节,而在前512B中存放着用户的数据。在后面的16字节中(OOB)中存放着执行命令后的状态信息。主要是ECC校验的标识。列地址A0-A7可以寻址的范围是256个字节,要寻址528字节的话,将一页分为了A.1half arrayB(2 half array) C(spare array)。A0—255字节,B 256-511 字节C512—527字节。访问某页时必须选定特定的区。这可以使地址指针指向特定的区实现。

       NAND Flash中存在三类地址,分别为Block Address Column Address Page Address.

       Column Address用来选择是在上半页寻址还是在下半页寻址A[0]—A[7].也就相当于页内的偏移地址。在进行擦除时不需要列地址,因为擦除是以块为单位擦除。32Page需要5bit来表示。也就是A[13:9];也就是页在块内的相对地址。A8这一位用来设置512字节的上半页,还是下半页,1表示是在上半页,而2表示是在下半页。Block的地址有A[25:14]组成。

 

存储操作特点:

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

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

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

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

         一个容量为64M(512Mbit)NAND Flash,分为131072页,528列。(实际中由于存在spare area,故都大于这个值),有4096块,需要12bit来表示即A[25:14].如果是128M1Gbit)的话,blodk AddressA[26:14].由于地址只能在IO0—IO7上传送。编程时通常通过移位来实现地址的传送。传送过程如下:

1个地址序列:传递column address,也就是NAND Flash[7:0],这一周期不需要移位即可传递到I/O[7:0]上,而half page pointer A8是由操作指令决定,00h,在A区,01hB区,指令决定在哪个half page上进行读写,而真正A8的值是不需要程序员关心的;

2个地址序列:就是将NAND_ADDR右移9位,而不是8位,将NAND_ADDR[16:9]传递到I/O[7:0]上;

3个地址序列:将NAND_ADDR[24:17]传递到I/O[7:0]上;

4个地址序列:将NAND_ADDR[25]传送到I/O上。

    整个地址的传送过程需要4步才能完成。如果NAND Flash的大小是32MB的以下的话,那么block address最高位只到bit24,因此寻址只需要3步,就可以完成。

       在进行擦除操作时由于是以块进行擦除,所以只需要3个地址序列,也就是只传递块的地址,即A[14:25]

 

NAND Flash地址的计算:

        Column Address翻译过来是列地址,也就是在一页里的偏移地址。其实是指定Page上的某个Byte,指定这个Byte,其实也就是指定此页的读写起始地址。

        Page Address:页地址。页的地址总是以512Bytes对齐的,所以它的低9位问题0,确定读写操作在NAND Flash中的哪个页进行。

    当我们得到一个Nand Flash地址addr时,我们可以这样分解出Column AddressPage Address

Columnaddr = addr % 512   // column address

Pageaddr = addr>>9            // page address

 

      也就是一个Nand Flash地址的A0-A7是它的column address ,A9—A25是它的Page Address,地址A8被忽略。

现在假设我要从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

于是我们可以知道5000这个地址是在第9页的第392个字节处,于是我们的NF_read函数将这样发送命令和参数

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]

    向NandFlash的命令寄存器和地址寄存器发送完以上命令和参数之后,我们就可以从rNFDATA寄存器(NandFlash数据寄存器)读取数据了.

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

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

{

 

        *buf++=NF_RDDATA();

}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NetTiers模板中各个选项的一些解释

名称ChooseSourceDatabase选择数据库MappingFileMapping文件位置(会根据output目录自动更改,不需要设置)OutputDirectory文件输出目录RootNameSpace根节点的命名空间Filter by Individual Objects - OptionalEnumTables枚举表,表中的所有数据都会被用作枚举类型,要求:第一列为主…

php调用谷歌翻译接口_一个google翻译的php调用方式

直接看代码<?php /*** translate()** 翻译函数** param mixed $text 待翻译的内容* param string $language 翻译的语言&#xff0c;格式为 当前语言|目标语言* return*/function translate($text,$languagezh-cn|en){if(empty($text)){return false;}set_time_limit(0);$h…

【转】应用架构之道:分离业务逻辑和技术细节

架构 什么是架构&#xff1f; 关于架构这个概念很难给出一个明确的定义&#xff0c;也没有一个标准的定义。 硬是要给一个概述&#xff0c;我认为架构就是对系统中的实体以及实体之间的关系所进行的抽象描述。 架构始于建筑&#xff0c;是因为人类发展&#xff08;原始人自…

ARM9之NAND FLASH总结

/*author----->Armking*/ /*data----->2008年9月2*/ /*ps:本人总结&#xff0c;备于日后查阅&#xff0c;如若转载&#xff0c;请注明出处*/ /*QQ:382750150*/ 写于篇头&#xff1a; 终于又开始接着学习了&#xff0c;只是不知道为什么JTAG又连不上目标板了&#xff0c;如…

内连接

内连接查询操作列出与连接条件匹配的数据行&#xff0c;它使用比较运算符比较被连接列的列值。内连接分三种&#xff1a;1、等值连接&#xff1a;在连接条件中使用等于号()运算符比较被连接列的列值&#xff0c;其查询结果中列出被连接表中的所有列&#xff0c;包括其中的重复列…

python中赋值运算符有哪些_Python代码中有哪些赋值运算符呢?

摘要:下文讲述Python代码中赋值运算符的相关的简介说明&#xff0c;如下所示:赋值运算符主要用于赋值操作&#xff0c;用于为对象赋值&#xff0c;那么Python中赋值运算符到底有哪些呢&#xff1f;下文将一一道来&#xff0c;如下所示:赋值运算符详解说明示例说明简单的赋值运算…

解读HTTP包

解读HTTP包&#xff1a;[摘要]详细介绍HTTP包的格式、协议内容及相关的处理方法&#xff0c;内容分3节&#xff1a;1、超文本传输协议及HTTP包;2、Socket类与ServerSocket类;3、读取HTTP包。 一、超文本传输协议及HTTP包 HTTP协议用于在Internet上发送和接收消息。HTTP协议是一…

几个颇有创意的网站推广方法(推荐)

几个颇有创意的网站推广方法(推荐)元旦佳节&#xff0c;相信有不少朋友从QQ、MSN、E-mail里收到了亲友发来的贺卡&#xff0c;其中流传得比较多的是几张比较有创意的图片&#xff0c;他们都只需要在链接里输入你想祝福的人的名字&#xff0c;然后该文字会出现在图片中去&#x…

明光市机器人_“柠檬皮”软体机器人!26岁小伙联合发明光磁场机器人|专访...

会行走、能搬货&#xff0c;还会 “跳街舞”。近日&#xff0c;美国西北大学发明出一款软体机器人&#xff0c;该机器人看起来像一只剥开的柠檬皮&#xff0c;它能在水箱中运动&#xff0c;并拥有多种本领&#xff0c;比如搬运物品、催化化学反应、输送治疗剂等&#xff0c;而它…

【转】SD-WAN,到底是什么*****

作为一个热门概念&#xff0c;SD-WAN近年以来频繁地出现在我们的视野当中。 很多人说&#xff0c;它是未来最具发展潜力的通信技术之一&#xff0c;极具商业价值。 行业里的老牌通信设备商和运营商对它一致看好&#xff0c;新兴创业企业也把它视为千载难逢的风口机遇&#xff0…

超文本传输协议及HTTP包

HTTP协议用于在Internet上发送和接收消息。HTTP协议是一种请求-应答式的协议 ——客户端发送一个请求&#xff0c;服务器返回该请求的应答&#xff0c;所有的请求与应答都是HTTP包。HTTP协议使用可靠的TCP连接&#xff0c;默认端口是80。HTTP的第一 个版本是HTTP/0.9&#xff0…

ffmpeg 截图太模糊了_PPT图片模糊?导师说放大!

今日分享图片智能放大●●●●重庆大学PPT图片太模糊了&#xff0c;要用原图&#xff01;放大&#xff0c;放大导师如是说&#xff0c;小硕表示&#xff0c;图片本就这样这咋办&#xff1f;不愁&#xff0c;稳住接着看在做PPT时还是做论文时想用某张图片&#xff0c;但是直接拉…

【转】全了!临港四镇最新对口地段小学,中学都在这里,看看你的孩子能读哪个学校

临港的家长们关于自己的孩子就读哪个学校&#xff0c;家长们一直都很关心和关注&#xff0c;每个家长对孩子的教育很是重视&#xff0c;有部分家长买临港的房子就冲着学区去的&#xff0c;临港的优质教育资源一直是被居民所称赞的&#xff0c;学校也没家长失望&#xff0c;个别…

状态栏显示时间代码

状态栏显示时间代码 <html><head><title>网页特效|Linkweb.cn/Js|---状态栏滚动时间</title></head><body>请看状态栏<BR><!--将以下代码加入HTML的<Body></Body>之间--> <SCRIPT languageJavaScript>var o…

WINCE驱动程序快速入门

有人也许和我一样比较心急&#xff0c;想尽快知道如何去写一个具体的驱动程序&#xff0c;这里&#xff0c;假设您对驱动程序已经有比较好的了解&#xff0c;告诉大家一个快速上路的方法。当然&#xff0c;如果您有足够的时间我建议在动手之前还是深入了解一下CE整个系统架构。…

【转】Azure Az-900认证 04——-考取AZ900所有知识点总结--获取证书!

结合最近所做的模拟题&#xff0c;把一些容易考的知识和概念重新回顾记录一下。标红的字要注意一下&#xff0c;有可能这几个简单的字&#xff0c;就是最能概括这个概念的关键点&#xff0c;个人在回顾的时候把这些点红色标出来了&#xff0c;会在题干中以不同的案例形式来考察…

怎么用vc采集ni卡数据_8bit,200MS/s 低成本模拟输入高速采集卡FCFR-PCI9850

FCFR-PCI98508bit,200MS/s 低成本模拟输入高速采集卡FCFR-PCI9850&#xff08;简称PCI9850&#xff09;是低成本高速数字化化仪&#xff0c;AD分辨率8bit&#xff0c;AD采样率200MS/s&#xff0c;硬件FIFO缓存32M字节&#xff0c;采集卡支持50MS/s的高速连续采集&#xff0c;触…

网站程序安全分析器 VB源码

本程序通杀:ASP ASPX PHP CGI JSP VBS 等脚本WebShell并能查出99%加密过的脚本WebShell后来发现..精度越高误杀越高...基本做到宁误扫三千不放过1马~其实是利用串判断.原理很简单.有很多人向偶要代码.想到人家ScanWebshell都贡献出来了~偶要是不贡献出来就不厚道咯.以下是全部代…

S3C6410启动模式介绍

目前的ARM处理器都支持多种启动模式&#xff0c;S3C6410和以前的Samsung的ARM处理器一样&#xff0c;通过外部管脚OM[4:0]的拉高拉低来决定是从哪个存储设备上启动。我认为S3C6410的User Manual并没有说的很清楚&#xff0c;所以我在最开始使用的时候&#xff0c;也对其启动模式…

如何用木板做桥_如何辨别使用的公园椅是否需要保养

如何辨别使用的公园椅存在哪些问题新城市公园椅小编与您分享&#xff0c;每一项事物都会有它的使用寿命&#xff0c;公园椅也不例外。公园椅使用有几年后后&#xff0c;我们通过公园椅的哪些表现来发现公园椅存在哪些隐患呢&#xff1f;通过观察、触摸、按压这三种方式来发现公…