NandFlash 与NORFlash 驱动.doc_第1页
NandFlash 与NORFlash 驱动.doc_第2页
NandFlash 与NORFlash 驱动.doc_第3页
NandFlash 与NORFlash 驱动.doc_第4页
NandFlash 与NORFlash 驱动.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

NandFlash 与NORFlash 驱动 (注:来源于网络)1 并不是所有的处理器都支持NAND Flash启动,这个信息需要从处理器的芯片手册中获得。如S3C2410可以支持Nand flash启动,也有些也支持从SD卡上启动。2 Nor flash与nand flash的差别:(1)接口差别: Nor flash接口时序和SDRAM一样 Nand flash使用的是控制、地址、数据复用的IO方式(2)Nand flash写入的速度比Nor flash快(3)Nand flash的容量为8-256M,而Nor flash为1-32M(4)Nor flash没有坏块,而Nand flash出厂时可能就有坏块操作NOR Flash的时序及命令列表注意:上面的Addr并不是总线上的地址,而是芯片的内部地址,当CPU的A1接到芯片IO的A0时(以这种接口方式的话),CPU的IO输出的地址应该左移一位(即0x5555 1),其它Addr地址同理。Nor flash是以写命令的方式对其进行读/写/擦除工作,要对Nor flash 进行读/写/擦除工作时必须明确扇区sector的大小,每种Nor flash内部存储容量的均匀度不一样,如,有些在低地址很密,高地址很疏(打个比方,呵呵),所以flash要擦除时,必须知道其边界点,即sector的大小,sector的值可以从Nor flash中的CFI获得,S3C2410中用的Nor flash的sector=4K。下面是Word-Program的命令时序(读写功能):下面是获得Nor flash的ID及CFI信息的命令时序:当然,在Nor flash 中发生擦除工作后,会等待一段时间,当擦除成功后,会提供相应的判断方法,如下:下面是调试好的相应的完整程序代码:#include #define U16 unsigned short#define U32 unsigned int#define ROM_BASE 0x00000000#define CMD_ADDR0 *(volatile U16 *)(0x5555*2 + ROM_BASE)#define CMD_ADDR1 *(volatile U16 *)(0x2aaa*2 + ROM_BASE)U16 num10 = 10,20,30,40,50,60,70,80,90,100;void erase(void) /擦除代码段U16 i;U32 sector;sector = ROM_BASE;for(i = 0; i10; i+)CMD_ADDR0 = 0xaaaa;CMD_ADDR1 = 0x5555;CMD_ADDR0 = 0x8080;CMD_ADDR0 = 0xaaaa;CMD_ADDR1 = 0x5555; *(volatile U16 *)sector = 0x3030; /0x3030表示清除命令while(1)if(*(volatile U16 *)sector)&0x80) /判断是否擦除成功break;/D7 = 1uart_printf(XXXXXXXXXXXXXXXXXXXXXXXXXXXn); uart_printf(erasing success:0x%xn,(volatile U16 *)sector);sector += 0x1000;void write(void) /写代码段U16 i;U32 ProgStart;ProgStart = ROM_BASE;for(i = 0; i 10; i+ ) CMD_ADDR0 = 0xaaaa; /写入的时序方法 CMD_ADDR1 = 0x5555; CMD_ADDR0 = 0xa0a0; *(volatile U16 *)ProgStart = numi;while(1)if(*(volatile U16 *)ProgStart&0x80)=(numi&0x80)break;uart_printf(.n);uart_printf(write success :%dn,*(volatile U16 *)ProgStart);ProgStart += 0x1000;intmain(int argc,char *argv) int i; sys_init(); erase(); write(); for(i = 0;i != 0x1ff000; i +=0x1000) uart_printf(num is:%dn,*(volatile U16 *)i);return 0;以下是Nand flash要掌握的东西:1 Nand flash的接口、内存组织及寻址方式2 Nand flash的坏块特性及坏块检测方法3Nand flash的操作:读/写/擦除方法1 Nand flash的接口、内存组织及寻址方式Nand Flash有两类:8bit 和 16 bit,我现在用的是8bit的nand flash下面是接口电路图:(1)Nand Flash采用复用IO接口方式,控制命令、地址、数据都使用IO0-IO7这8个IO端口。如何识别何时传输的是命令、地址和数据?这是由相应的控制信号决定。当CE片选被选中,CLE控制命令使能时,且在WE信号为低电平时,写入IO口的数据为命令,当ALE使能,WE为低电平时,写入IO的数据为地址。当nFE为低电平,WE为低电平时写入的数据即是真正的data.(2)Nand Flash在出厂时就可能带有坏块并且在使用的过程中也可能出现新的坏块,坏块是随机分布的,故需要采取合适的方式检测处理坏块。当检测到坏块后,标职出坏块,跳过坏块进行工作。 Nand Flash在出厂时会在每个block的0页面的space(512-527)空间中的第5个字节处标明此页所在的坏是否为坏块。如果为0xff则不是坏块,这个是nand flash出厂时的坏块检测方法。 当nand flash在使用过程中出现了坏块,如何发现并且标记它呢? 答:通过某种坏块检测的软件算法对每一页的512个字节进行一定的判断,计算出一个ECC码,然后将其放入00B中,等若干时间后再用同样的算法对其进行检测,再次得到一个ECC码,将这个ECC码和之前计算出的ECC码进行比较,如果相等则不是坏块,如果不等则为坏块,然后就将其标记。 须掌握:如何遍历坏块? ECC算法有两种:软件ECC算法,通用性好,每256个字节算出一个3byte的ECC码,故512个字节算出6byte的ECC码。硬件ECC算法 一个坏块有多大?指一个字节还是512个字节? 答:1block = 512* 32= 16K。 计算方法:一块有32页,每页512字节,故32*512=16K,只要其中某个字节有坏块,这16K就全废了。 如何标记坏块? 答:在此块的0页的space空间的第5位清0. Nand Flash的内部内存组织方式是怎样的?如何寻址? 答:将内存划分为4096个块(即4K总数的块),每个块有32页(块大小=32*512 = 16K),每页有512+16个字节(16字节为OOB存放ECC等纠错码)。但是我们还将每个页的512个字节分成三块:A(256字节)、B(256字节)、C(16字节)。 寻址过程:先寻址到第XX页面(由A9-A16决定),再寻址到第XX页面的第XX个字节(由A0-A7决定)#include #include head.hU8 buf512;U16 num512;static U16 NandAddr;static void InitNandCfg(void)/enable nand flash control, initilize ecc, chip disable,rNFCONF = (115)|(112)|(111)|(78)|(78);/先传a9-a16,if(NandAddr)WrNFAddr(addr16); /后传a17-a24 ,a25WrNFCmd(ERASECMD1);/传完地址后,写命令0xd0h(按时序要求)stat = WaitNFBusy(); /写完擦除命令后,执行等待uart_printf(.!n);NFChipDs();/关闭片选if(stat = 0)uart_printf(erase success!n);elseuart_printf(erase error!n);#ifdefER_BAD_BLK_TESTif(!(addr+0xe0)&0xff) stat = 1;/just for test bad block#endif/printf(Erase block 0x%x %sn, addr, stat?fail:ok);uart_printf(.);return stat;static void ReadPage(U32 addr, U8 *buf)U16 i;NFChipEn(); /使能nand flash,ceWrNFCmd(READCMD0);/发送读命令0x00WrNFAddr(0);/这个是必须要有的,但是我在时序图里找不着,不知道原因WrNFAddr(addr); /要读的数据的起始地址WrNFAddr(addr8);if(NandAddr)WrNFAddr(addr16);InitEcc(); /使能ECCWaitNFBusy();/WrNFCmd(READCMD0);/这句不是必须的for(i=0; i512; i+)bufi = RdNFDat();NFChipDs();static U32 ReadChipId(void)U32 id;NFChipEn();WrNFCmd(RdIDCMD);WrNFAddr(0);while(NFIsBusy();id = RdNFDat() 8);if(NandAddr)WrNFAddr(addr 16);for(i=0; i count; i+)WrNFDat(U8)wbufi);WrNFCmd(PROGCMD1);stat = WaitNFBusy();WrNFCmd(READCMD0);/addNFChipDs();void main(int argc,char *argv)U32 addr = 0x4000;U16 *num = (volatile U16 *)addr;int i;sys_init();InitNandFlash(); /初始化nand flash,get flash I

温馨提示

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

评论

0/150

提交评论