⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 k9f5608drv.c

📁 nand flash模拟驱动
💻 C
字号:

 /*
 * 
 * 在作NANDFLASH的基本测试时,建议只对第零块进行操作,因为只有这一块才是厂家保证的不坏块,
 * 在对其它块进行操作前,必须要调用函数NandInvalidCheck()进行坏块检查,防址对坏块进行读写,
 * 并对出现读写错误的块进行坏块标记,禁止多次对坏块进擦写操作,这样容易引起周边块的损坏。
 * 
 * */



#include "header.h"
 
void InitNandBus(void)
{							//在本函数里初始化模拟控制信号的时序,本程序用的是华邦w90p710芯片的外部地址零所作,其中NAND的CE接地
	CLRBIT(EBICON,EXBE0);		//nWE is write enable
	EXT0CON=(0x100<<BASADDR)|(0<<SIZE)|(1<<ADRS)|(5<<tACC)|(5<<tCOH)|(1<<tACS)|(1<<tCOS)|(1<<DBWD);
	//nand base address 0x4000000							 
	GPIO_CFG4=GPIO_CFG4&(~(0X3<<20));		//general IO
	CLRBIT(GPIO_DIR4,10);
}

unsigned int ResetNand(void)		//reset nand status
{

	unsigned int i;
	
	CMDLATCH=0xff;
	i=0;
	i=0;
	while(!NANDRB)
	{
		i++;
		if(i>100)
		 return(0);
	}
	return(1);
}

unsigned int ReadId(void)		//return 0 means read id failure!
{								//Read nandflash id
	 
	unsigned int id;
	unsigned char bak1,bak2;
	if(!NANDRB)
	{
		if(!ResetNand())
			return(0);
	}
	CMDLATCH=0x90;
	ADRLATCH=0x0;
	bak1=READIO;
	bak2=READIO;
	id=(bak1<<8);
	id=id|(bak2);
	return(id);
}

unsigned char NandRead1(unsigned int address,unsigned char *buffer)	//return 0 means read failure and return1 means read success!
{												//read the data from address to 0xff(before the Column Address(A0~A7) become to 0x0)
	
	unsigned char cmd,j;
	unsigned int i;
	
	if(!NANDRB)
	{
		if(!ResetNand())
			return(0);
	}
	if(GETBIT(address,8))
		cmd=0x1;
	else
	 	cmd=0x0;
	 CMDLATCH=cmd;
	 ADRLATCH=(address)&0xff;
	 ADRLATCH=(address>>9)&0xff;
	 ADRLATCH=(address>>17)&0xff;
	 i=0;
	 while(!NANDRB)
	 {
	 	i++;
	 	if(i>=10000)
	 		return(0);
	 }
	 j=0;
	 for(i=(address&0xff);i<256;i++)
	 {
	 	*(buffer+j)=READIO;
	 	j++;
	 }
	 return(1);
}
unsigned char NandRead2(unsigned int address,unsigned char *buffer)		//read 16(512~528) byte
{
	 								//return 0 means read failure and return1 means read success!
	unsigned int i;
	
	if(!NANDRB)
	{
		if(!ResetNand())
			return(0);
	}
	 CMDLATCH=0x50;
	 ADRLATCH=0;			//Column address is ignore
	 ADRLATCH=(address>>9)&0xff;
	 ADRLATCH=(address>>17)&0xff;
	 i=0;
	 while(!NANDRB)
	 {
	 	i++;
	 	if(i>=10000)
	 		return(0);
	 }
	 for(i=0;i<16;i++)
	 {
	 	*(buffer+i)=READIO;
	 }
	 return(1);
}

unsigned char NandPageProg(unsigned int address,unsigned char *buffer)		//program 528 byte 			
{
	unsigned int i;							//return 0 means Write failure and return1 means Write success!
	
	
	if(!NANDRB)
	{
		if(!ResetNand())
			return(0);
	}
	CMDLATCH=0x80;
	ADRLATCH=0;				//Column address is ignore
	ADRLATCH=(address>>9)&0xff;
	ADRLATCH=(address>>17)&0xff;
	for(i=0;i<528;i++)
		READIO=*(buffer+i);
	CMDLATCH=0x10;
	i=0;
	 while(!NANDRB)
	 {
	 	i++;
	 	if(i>=1000000)
	 		return(0);
	 } 
	 CMDLATCH=0x70;
	 i=READIO;
	 if(GETBIT(i,0))
	 	return((unsigned char)i);
	 else
	 	return(1);
}

unsigned char NandEraseBlock(unsigned int pageaddress)		//erase a block,return 0 means erase failure and return 1 means erase success!
{
	unsigned int i;
	
	if(!NANDRB)
	{
		if(!ResetNand())
			return(0);
	}
	CMDLATCH=0x60;				//Column address is ignore
	ADRLATCH=(pageaddress)&0xff;
	ADRLATCH=(pageaddress>>8)&0xff;
	CMDLATCH=0xd0;
	i=0;
	 while(!NANDRB)
	 {
	 	i++;
	 	if(i>=10000000)
	 		return(0);
	 } 
	 CMDLATCH=0x70;
	 i=READIO;
	 if(GETBIT(i,0))
	 	return(0);
	 else
	 	return(1);

}

unsigned char NandCopyBack(unsigned int sourceaddr,unsigned int aimaddr)
{			//page copy  from sourceaddr to aimaddr
			//return 0 means copy failure and return 1 means copy success!
			
	unsigned int i;
	
	CMDLATCH=0x00;				//Column address is ignore
	ADRLATCH=(sourceaddr)&0xff;
	ADRLATCH=(sourceaddr>>9)&0xff;
	ADRLATCH=(sourceaddr>>17)&0xff;
	i=0;
	 while(!NANDRB)
	 {
	 	i++;
	 	if(i>=10000000)
	 		return(0);
	 } 
	CMDLATCH=0x8a;
	ADRLATCH=(aimaddr)&0xff;
	ADRLATCH=(aimaddr>>9)&0xff;
	ADRLATCH=(aimaddr>>17)&0xff;
	i=0;
	 while(!NANDRB)
	 {
	 	i++;
	 	if(i>=1000000)
	 		return(0);
	 } 
	 CMDLATCH=0x70;
	 i=READIO;
	 if(GETBIT(i,0))
	 	return((unsigned char)i);
	 else
	 	return(1);


}

void NandInvalidCheck(unsigned char *BlockBuffer)
{
	unsigned int BlockNumber;
	unsigned char buffer[16];
	//unsigned char Ident;
	
	BlockBuffer[0]=0xff;			//block 0 is valid forever;
	for(BlockNumber=1;BlockNumber<2048;BlockNumber++)
	{
		NandRead2((BlockNumber<<14)|(0<<9),buffer);
		
		if(buffer[5]!=0xff)
		{
			BlockBuffer[BlockNumber]=0;
			continue;
		}
		NandRead2((BlockNumber<<14)|(1<<9),buffer);
		if(buffer[5]!=0xff)
		{
			BlockBuffer[BlockNumber]=0;
		}
		else
			BlockBuffer[BlockNumber]=0xff;
	}


}







⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -