NandFlash 与NORFlash 驱动.doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
NandFlash 与NORFlash 驱动

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 stdio.h #define U16 unsigned short #define U32 unsigned int #define ROM_BASE 0#define CMD_ADDR0 *((volatile U16 *)(0x5555*2 + ROM_BASE)) #define CMD_ADDR1 *((volatile U16 *)(0x2aaa*2 + ROM_BASE)) U16 num[10] = {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 == 1 ???uart_printf(XXXXXXXXXXXXXXXXXXXXXXXXXXX\n); ??} ? ??uart_printf(erasing success:0x%x\n,(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 = num[i];? ??? ??while(1) ??{ ???if((*(volatile U16 *)ProgStart0x80)==(num[i]0x80))? ????break;? ???uart_pr

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档