使用的NandFlash为三星的K9F2G08U0M_第1页
使用的NandFlash为三星的K9F2G08U0M_第2页
使用的NandFlash为三星的K9F2G08U0M_第3页
使用的NandFlash为三星的K9F2G08U0M_第4页
使用的NandFlash为三星的K9F2G08U0M_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

1、使用的Nand Flash为三星的K9F2G08U0M,存储为256M,数据宽度为8bit.具体的资料可以参考datasheet.由于S3C2440里面包括了Nand FLash 控制器,所以,我们的工作就是根据芯片手册配置一下寄存器。包括的寄存器如下: NFCONF;NFCONT;NFCMD;NFADDR;NFDATA;NFMECCD0;NFMECCD1;NFSECCD;NFSTAT;NFESTAT0;NFESTAT1;NFMECC0;NFMECC1;NFSECC;NFSBLK;NFEBLK;(1) 对于每个寄存器的地址,每一位的功能可以参考S3C2440芯片手册!对于目前的编程主要涉及到如

2、下五个寄存器:NFCONT;NFCMD;NFADDR;NFDATA;NFSTAT;使用宏定义:#define rNFCONF (*(volatile unsigned *)0x4E000000) #define rNFCONT (*(volatile unsigned *)0x4E000004) #define rNFCMD (*(volatile unsigned *)0x4E000008) #define rNFADDR (*(volatile unsigned char *)0x4E00000C)#define rNFDATA8 (*(volatile unsigned char *)0

3、x4E000010) #define rNFSTAT (*(volatile unsigned *)0x4E000020)特别注明:对于NFCONF寄存器,特别要说明的是TACLS,TWRPH0,TWRPH1,这三个参数。如何设置这三个参数,主要得看K9F2G08U0M 手册上的时序表,参数表,上面已经写好了CLE ,setup时间,WE_N的Pulse WiDth,WE_N HIGH HOLD TIME .根据这些参数,设置个合适的TACLS,TWRPH0,TWRPH1值!(2) 命令! Nand Flash编程时涉及到很多命令,其实这些命令帮助我们完成了很多的工作,我们现在只需做发送命令的

4、工作。#define Read_Cmd00#define Read_Cmd10x30#define Read_ID_Cmd0x90#define Reset_Cmd0xFF#define PageProgram_Cmd00x80#define PageProgram_Cmd10x10#define Cache_Program_Cmd00x80#define Cache_Program_Cmd10x15#define Copy_Back_Program_Cmd00x85#define Copy_Back_Program_Cmd1 0x10#define Block_Erase_Cmd00x60#

5、define Block_Erase_Cmd10xD0#define Read_Status_Cmd0x70当我们编写擦出,读,编程Nand Flash的函数时,就会涉及到以上各个命令。对于如何使用以上命令,在什么周期用,时序条件如何,完全可以参考K9F2G08U0M手册,上面很详细。写函数时,可以根据流程图,时序图,文字,一步步来,基本上不会有太大的问题。关于Erase operation根据上图,相信编写擦除函数,应该问题不大啊!(3) 本次实验主要完成以下函数的设计void S3C2440_Nand_Reset(void);unsigned S3C2440_Nand_Wait_Idle(

6、void);void S3C2440_Nand_Init(void);unsigned short S3C2440_Nand_Read_ID(void); /获取Nand Flash 设备类型号的void S3C2440_Nand_WR_Addr(unsigned int addr);unsigned S3C2440_Nand_Block_Erase(unsigned block_addr);void S3C2440_Nand_Read(unsigned char * des_addr,unsigned int src_addr,int size);unsigned S3C2440_Nand_

7、Program(unsigned char * buf,unsigned int addr);分享以下设计代码:/ 0:pass;1:failunsigned S3C2440_Nand_Wait_Idle(void) unsigned char stat;S3C2440_Nand_WRCmd(Read_Status_Cmd);dostat=S3C2440_Nand_RD_Data8();while(!(stat&0x40);return stat&0x1;void S3C2440_Nand_Init(void)S3C2440_Nand_CONF()=(TACLS12) | (TWRPH08)

8、| (TWRPH14) |(0NFCONT = (013)|(012)|(010)|(09)|(08)|(16)|(15)|(14)|(11)|(10);unsigned short S3C2440_Nand_Read_ID(void)unsigned short ID;S3C2440_Nand_Chip_En();S3C2440_Nand_WRCmd(Read_ID_Cmd);S3C2440_NandWR_Addr_Single(0);while(S3C2440_Nand_ISBUSY();ID=S3C2440_Nand_RD_Data8()NAND_SECTOR_BIT_WID+1;S3C

9、2440_NandWR_Addr_Single(column_addr&0xff);S3C2440_NandWR_Addr_Single(column_addr8)&0x0f);S3C2440_NandWR_Addr_Single(page_addr&0xff);S3C2440_NandWR_Addr_Single(page_addr8)&0xff);S3C2440_NandWR_Addr_Single(page_addr16)&0x1);unsigned S3C2440_Nand_Block_Erase(unsigned block_addr)int i,status;block_addr

10、&=0x3f; /ingore the low 6 bits;S3C2440_Nand_Chip_En();S3C2440_Nand_WRCmd(Block_Erase_Cmd0);S3C2440_NandWR_Addr_Single(block_addr&0xff);S3C2440_NandWR_Addr_Single(block_addr8)&0xff);S3C2440_NandWR_Addr_Single(block_addr16)&0x1);S3C2440_Nand_WRCmd(Block_Erase_Cmd1);for(i=0;iNAND_SECTOR_BIT_WID;S3C2440

11、_Nand_Chip_En();while (page_num)S3C2440_Nand_InitEcc();S3C2440_Nand_WRCmd(Read_Cmd0);S3C2440_Nand_WR_Addr(src_addr+(j(NAND_SECTOR_BIT_WID+1);S3C2440_Nand_WRCmd(Read_Cmd1);for(i=0;i100;i+);while(S3C2440_Nand_ISBUSY();for(i=0;iNAND_SECTOR_SIZE;i+)*des_addr+=S3C2440_Nand_RD_Data8();page_num-;j+;S3C2440

12、_Nand_Chip_Disable();unsigned S3C2440_Nand_Program(unsigned char * buf,unsigned int addr)int i,status;if(addr & NAND_BLOCK_MASK)return Addr_NOT_Align; /address or size is not align;S3C2440_Nand_Chip_En();S3C2440_Nand_InitEcc(); S3C2440_Nand_WRCmd(PageProgram_Cmd0);S3C2440_Nand_WR_Addr(addr);for(i=0;

13、iNAND_SECTOR_SIZE;i+)S3C2440_Nand_WR_Data8(*buf+);S3C2440_Nand_WRCmd(PageProgram_Cmd1);if(S3C2440_Nand_Wait_Idle() status=ERROR; else status=TRUE;S3C2440_Nand_Chip_Disable();return status;对于上面函数里面涉及的一下小函数,宏定义,设计起来很简单,在此就不累述了,看看芯片资料就可以了!对于K9F2G08U0M使用的地址共29位,A0A28,分5个周期完成发送工作!对于S3C2440_Nand_Block_Erase()函数涉及的只是A12A28,row address,当然其中A12A17会被忽略,编程时应该考虑到!对于S3C2440_Nand_Read(unsigned char * des_addr,unsigned int src_addr,int size) 函数里面的参数src_a

温馨提示

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

评论

0/150

提交评论