NAND FLASH原理与实验.doc_第1页
NAND FLASH原理与实验.doc_第2页
NAND FLASH原理与实验.doc_第3页
NAND FLASH原理与实验.doc_第4页
NAND FLASH原理与实验.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

NAND FLASH原理与实验2012-10-17 12:32:02分类:原文地址:NAND FLASH原理与实验作者:wangh0802 常用的FLASH主要有NOR FLASH和NAND FLASH两种:NAND FLASH不能执行代码,主要用于存储大量数据;具有极高的单元密度,可以达到高存储密度,并且写入和檫除速度也很快;应用困难在于FLASH的管理需要特殊的系统接口。NOR FLASH中的数据掉电不会丢失,而且可以执行程序,常用于存储系统的启动代码;特点是芯片内执行(XIP),应用程序可以直接在NOR FLASH内运行,不需要再把代码读到系统RAM中。很低的写入和檫除速度大大影响了它的性能。为什么NAND FLASH无法执行程序呢?这主要是由于NAND FLASH的接口主要包括几个I/O口,对其中数据的访问是穿行的访问,无法实现随机访问,因此NAND FLASH无法执行程序。因为NAND FLASH接口电路是通过NAND FLASH控制器与S3C2440处理器相接的,因为读者不需要关心具体的访问时序,之所以提供NAND FLASH控制器就是为了便于使用NAND FLASH。如果没有NAND FLASH控制器,则需要产生相应的访问时序。 NAND FLASH的存储器组成主要有两部分:页(Page)、块(BIock)。以K9F2G08U0B为例: 每页大小为:2K 64字节,2K字节用来存储数据,64字节主要用来存储控制信息,主要是为了便于管理每一页。每块大小为:64个页;整个NAND FLASH由2K(2048)个块组成(128KPages)。 从数据输出可以看到K9F2G08U0B的容量是256MBytes*8Bit,怎么算出来的呢? NAND FLASH容量=块的数目*每块的容量 =块的数目*(每块包含页的数目*每页的容量) =2K块*(64页*(2KBytes 64Bytes) =2K块*64页*2KBytes 2K块*64页*64Bytes =256MBytes 8MBytes(256MBytes表示该NAND FLASH可以存储256M个字节数据,后面的8M字节的数据主要用于保存每一页的控制信息) 1K(Bytes)=1024字节,1M(Bytes)=1K(Bytes)*1K(Bytes);NAND FLASH接口电路: S3C2440处理器内部已经集成了NAND FLASH控制器,因此,接口电路将变得很简单,只需要将S3C2440处理器对应引脚和NAND FLASH的对应引脚接上即可。 但是不同的NAND FLASH的容量不一样,接口线宽不一样,S3C2440处理器如何获得这些信息呢?先对NAND FLASH控制器的作用进行简单的总结: 1.提供外接NAND FLASH的接口信息,包括接口线宽、容量等信息。 2.提供访问NAND FLASH所需要的时序信息。 S3C2440处理器提供了如下方法来识别NAND FLASH接口线宽和容量,OM1:0、NCON、GPG13、GPG14和GPG15共5个信号来选择NAND FLASH启动。 OM1:0:当两个引脚均为低电平是,从NAND FLASH启动。 NCON:NAND FLASH的类型选择信号。0、正常型NAND FLASH;1、高级型NAND FLASH; GPG13:NAND FLASH页容量选择信号。0、256Word(NCON=0)或1KWords(NCON=1); 1、512Bytes(NCON=0)或2KBytes(NCON=1); GPG14:NAND FLASH地址周期选择。0、3地址周期(NCON=0)或4地址周期(NCON=1)。 1、4地址周期(NCON=0)或5地址周期(NCON=1)。 GPG15:NAND FLASH接口线宽选择。0、8位总线宽度。1、16位总线宽度。如何访问NAND FLASH? 发送命令,即对NAND FLASH采取哪种操作,读,写还是擦除; 发送地址,即对NAND FLASH的哪一页进行上述操作; 发送数据,在此期间要检测NAND FLASH的内部状态。NAND FLASH内部的地址如何确定呢?从对应数据手册上可以找到有关地址序列的信息: 所谓的列地址即在一页中的地址,因为每页大小是2K 64Bytes,所以需要12根地址线来寻址,也即A0A11,整个NAND FLASH包含128K个页面,则需要17跟地址线来寻址一个页面,即A12A28,这也就是所谓的行地址。 S3C2440 NAND FLASH控制器,初始化只需要根据K9F2G08U0B数据手册给出的时序参数,正确初始化S3C2440处理器相关的寄存器即可。1.配置GPACON寄存器,将GPA17GPA22设置为NAND FLASH控制器信号模式。2.配置NAND FLASH,主要是初始化寄存器NFCONF. A.寄存器NFCONT,用于开启NAND FLASH控制器。 B.向寄存器NFCMD写入命令。向NAND FLASH发送命令,只需要将命令写入该寄存器即可,NAND FLASH控制器会根据上述参数自动产生出访问NAND FLASH所需要的命令信号。 C.向NAND FLASH发送命令:#define NF_CMD(cmd) rNFCMD=(cmd); D.向寄存器NFADDR写入地址:#define NF_ADDR(addr)rNFADDR=(addr); E.使用寄存器NFDATA进行数据读写,在此期间需要检查NFSTAT来检测NAND FLASH的状态。 F.寄存器NFSTAT,用于指示NAND FLASH是否处于忙状态。 #define NF_DETECT_RB()while(!(rNFSTAT&(12);使用宏代替简单的函数: 在程序开发过程中,经常将一个很大的工程分解为几个小的模块,每个模块使用单独的函数来实现,最后在工程中通过对各个模块函数的调用来实现整个工程所完成的功能,这也是典型的模块化开发技巧。但是,项目中调用关系复杂,尤其是存在多级函数调用时,需要将每一级的返回地址保存在栈中,容易导致溢出,此外函数调用开销也会增大。为了更好地解决上述问题,一般使用宏的形式来实现规模较小的函数。因为宏调用是预处理阶段,由预处理器对源程序中的宏进行展开,所以宏展开不占用运行时间。因为每一次宏调用都需要进行宏展开,所以会加大程序的代码量,因此规模较大的函数不宜使用宏的形式来实现。 #define rNFCONT (*(volatile unsigned *)0x4E000004)等等具体操作函数:#define NF_Enable() rNFCONT &=(11);#define NF_Disable()rNFCONT |=(11); #define NF_Send_Cmd(cmd) rNFCONT =(cmd);#define NF_Send_Addr(addr)rNFADDR =(addr);#define NF_Send_Data(data)rNFDATA8 =(data); #define NF_Enable_RB() rNFSTAT|=(12);开启忙检测功能#define NF_Check_Busy() while(!(rNFSTAT&(12);检测NAND FLASH是否处于忙状态。#define NF_Read_Byte() rNFDATA8NAND FLASH基本操作函数分析:其中包括复位,初始化,页写入,页读入,快擦除等操作函数。(一般使用命令,是将所有的命令以宏的形式定义好,以后使用的时候直接使用相应的宏即可) NAND FLASH复位函数:1. static void NF_Reset()2. 3. NF_Enable();/打开片选信号4. NF_Enable_RB();/开启忙信号检测5. NF_Send_Cmd(CMD_RESET);/发送复位命令6. NF_Check_Busy();/检测忙信号7. NF_Disable();/关闭片选信号8. NAND FLASH初始化函数:将相应的时序参数写入NAND FLASH控制器即可。分析TACLS、TWRPH0、TWRPH1的值。需要分别与芯片时间对应关系。tCLS-tWP、tWP、tCLH对应。 查对应芯片手册:tCLS=12ns、tWP=12ns、tCLH=5ns(参考值,实际可长),则TACLS=1、TWRPH1=4、TWRPH1=0.1. #define TACLS 12. #define TWRPH0 43. #define TWRPH1 04. void NF_Init(void)5. 6. rGPACON&=(0X3f17);7. rGPACON|=(0X3F17);/GPA17GPA22设置为NAND FLASH控制器信号输出模式;8. rNFCONF=(TACLS12)|(TWRPH08)|(TWRPH14);/三参数写入NFCON的相应位9. rNFCONT=(012)|(10);10. rNFSTAT=0;11. NF_Reset();12. NAND FLASH页写入函数:NAND FLASH主要用于大量数据段的存取,因此向NAND FLASH写入数据是以页为单位的。当然,有些类型的NAND FLASH也支持一个字节一个字节的写入(这就是所谓的随即读写,K9F2G08U0B就支持单字节写入)。NAND FLASH页写入函数的功能是向某一页写入数据。由不同得快组成(2048块),每块含64页,因此,要想写入某一页,首先需要确定该页属于哪一块。即向某一页写入数据,就像给某一层楼的所有用户送快递,首先要找到哪栋楼,然后在确定那层楼。 NAND FLASH页写入命令有两个,分别是0x80和0x10。页写入操作的流程为: (1)发送页写入命令0x80. (2)发送页地址。 (3)发送要写入的数据。 (4)发送页写入确认命令0x10。 (5)检测忙信号。 当发送页写入确认命令0x10之前,并没有将数据写入NAND FLASH的存储单元,仅仅是将数据写入了NAND FLASH是数据寄存器(Data Register &S/A)里,只有收到页写入确认命令0x10后,NAND FLASH才会自动将数据寄存器中的数据写入对应的存储单元中(这样做的主要目的是为了降低页写入的时间),同时这也需要一段时间,因此在发送完页写入确认命令后0x10之后,需要不断地检测忙信号,只有NAND FLASH真正写完数据后,才能对其进行后续的操作。函数NF_WritePage(),该函数有三个参数,第1个是块号,第2个是在快内的页好=号,第3个是一个指针,指向将要写入的数据的基地址。可以使用如下方式调用: unsigned char buf2048; NF_WritePage(17,4,buf);即将buf中的数据写入到NAND flash的第17块中的第4页。需要注意一个问题:向地址寄存器中写入的地址指的是NAND FLASH中的页的绝对地址,即该页距离第0页的绝对地址。由于NAND FLASH中含有的页数目太多,为了便于管理,才使用的块的概念,把整个NAND FLASH分成了2K个块,每块有64页。因此,上例中第17块中的第4页的绝地地址为:17*64+4=1092页点击(此处)折叠或打开1. void NF_WritePage(unsignedintblock,unsignedintpage,unsigned char*buffer)2. 3. unsignedinti;4. unsignedintblockPage=(block8)&0xff);15. NF_Send_Addr(blockPage16)&0x1);/以上都是根据NAND FLASH的地址周期进行操作的。地址的低12位用于页内寻址,这是对整页进行写入,因此,低12为设为0即可(每页2K,12位),剩下的才是绝对地址。16. for(i=0;i2048;i+)17. 18. NF_Send_Data(*bufPt+);/*写一个页512字节到Nand Flash芯片*/19. /for将2K的数据发送给NAND FLASH,发送的数据是一个字节一个字节地发送,只需要将数据写入数据寄存器,NAND FLASH控制器会自动发送。20. NF_Send_Cmd(CMD_WRITE2);/发送完毕后,发送页写入确认命令。21. NF_Check_Busy();/忙检测信号,等待NAND FLASH将所有数据写入完毕,在此期间无法对NAND FLASH进行其他操作。22. NF_Disable();/关闭片选信号23. 24. NAND FLASH页读取函数:页读取操作也需要两个命令:页读取发送命令0x00和页读取确认命令0x30。基本原理:当发送页读取发送命令0x00后,需要紧接着发送需要读取的页的绝地地址,然后发送页读取确认命令0x30,NAND FLASH收到第2个命令0x30后,自动将数据从内部存储单元复制到NAND FLASH的数据寄存器(Data Register &S/A)里,在此期间需要忙检测信号(如果忙信号有效,说明NAND FLASH存储单元中的数据还没有全部复制到数据寄存器),数据复制完毕后,可以通过读取S3C2440内部的特殊功能寄存器NFDATA来得到所需要的数据。NAND FLASH页读取命令有两个,分别是0x00和0x30,也读取操作流程为: (1)发送也读取发起命令0x00。(2)发送页地址,(3)发送也读取确认命令0x30(4)检测忙信号。(5)从S3C2440处理器寄存器NFDATA中读取数据。点击(此处)折叠或打开1. void NF_ReadPage(unsignedintblock,unsignedintpage,unsigned char*dstaddr)/这段程序用于,Nand Flash每页大小是2048个字节2. 3. unsignedinti;/这里没有用到ECC校验;只是简单的读取数据4. unsignedintblockPage=(block8)&0xff);14. NF_Send_Addr(blockPage16)&0x1);/以上1115发送绝对地址15.16. NF_Send_Cmd(CMD_READ2);/CMD_READ12=0x30 /发送页读取确认命令0x3017.18. NF_Check_Busy();/检测忙信号等待NAND FLASH将内部存储单元中的数据复制到数据寄存器中。19.20. for(i=0;i2048;i+)21. 22. dstaddri=NF_Read_Byte();/读取,从NFDATA寄存器读取数据即可。23. 24.25. NF_Disable(); /读完后关闭片选信号26.27. NAND FLASH块擦除函数:对NAND FLASH写之前,需要先进行擦除,这是由NAND FLASH自身的存

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论