s3c2440对norflash操作.doc

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

norflash和nandflash是应用不同技术而实现的非易失闪存。它们之间的各自特点在这里就不做介绍了,而只把s3c2440对norflash的操作做一讲解。我们用的norflash为EN29LV160AB,其实对各种型号的norflash进行读写等操作差别不大。 ? ???????对norflash的操作主要就是读、写、擦除和识别等。EN29LV160AB的数据宽度可以是8位字节型,也可以是16位的字型,它由EN29LV160AB的某一引脚配置实现的。在这里我们选择字型。 ? 对norflash的读操作比较简单,系统上电后会自动进入读模式,而且也不需要额外的命令来实现读操作。下面的函数实现了读操作: ? U16 read_en29lv160ab(U32 addr) { ???????return *((volatile U16 *)(addr)); } ? ???????norflash不仅能够实现硬件复位,而且可以实现软件复位。软件复位的操作是向任一地址写入复位命令0xF0。下面的函数实现了软件复位: ? void reset_en29lv160ab(void) { ???????*((volatile U16 *)0x0) = 0xf0; } ? ???????norflash的擦除操作和写操作要稍微复杂一些,它们需要4个或6个周期来完成,每一个周期都要把相应的命令写入norflash中的某一命令寄存器中。写操作的过程为第一个周期是把命令0xAA写入地址为0x555的命令寄存器中,第二个周期是把命令0x55写入地址为0x2AA命令寄存器中,第三个周期是把命令0xA0再写入地址为0x555命令寄存器中,第四个周期为真正地把要写入的数据写入到norflash的地址中。下面的函数实现了写操作,其中该函数的两个输入参数分别为要写入的数据和地址,为了方便,我们事先定义好命令寄存器: ? #define????flash_base??????????????0#define????CMD_ADDR0??????????????*((volatile U16 *)(0x5551+flash_base)) #define????CMD_ADDR1??????????????*((volatile U16 *)(0x2aa1+flash_base)) ? U8 en29lv160ab_program(U32 addr, U16 dat) { ???????CMD_ADDR0 = 0xaa; ???????CMD_ADDR1 = 0x55; ???????CMD_ADDR0 = 0xa0; ???????*((volatile U16 *)(addr)) = dat; ? ???????return check_toggle(); } ? 由于我们是把norflash连接到了s3c2440的bank 0上,因此norflash中的地址相对于s3c2440来说基址为0而之所以又把norflash中的地址向左移一位(即乘以2),是因为我们是把s3c2440的ADDR1连接到了norflash的A0上的缘故。在该函数中,我们还调用了check_toggle函数,它的作用是用于判断这次操作是否正确,它的原型为: ? U8 check_toggle() { ???????volatile U16 newtoggle,oldtoggle; ???????oldtoggle = *((volatile U16 *)0x0); ? ???????while(1) ???????{???? ??????????????newtoggle = *((volatile U16 *)0x0); ????????????? ??????????????if((oldtoggle 0x40)==(newtoggle 0x40)) ?????????????????????break; ????????????? ??????????????if(newtoggle 0x20)???????????//DQ5 ??????????????{ ?????????????????????oldtoggle = *((volatile U16 *)0x0); ?????????????????????newtoggle = *((volatile U16 *)0x0); ???????????????????? ?????????????????????if((oldtoggle 0x40)==(newtoggle 0x40)) ????????????????????????????break; ???????????

文档评论(0)

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

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档