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

📄 nandflash.c

📁 三星44b0读取nand flash的源代码.nand flash 的型号是k9f5608.很有参考价值哦
💻 C
字号:
#include "console.h"
#include "44b0x.h"
#include "DataType.h"



#define	NAND_DAT	0x02000000
#define	NAND_ALE	0x02000004 
#define	NAND_CLE	0x02000002

#define NAND_CE		(1<<9)	//GPC9
#define NAND_RB		(1<<8)	//GPC8 busy low, input

#define	READCMD0	0
#define	READCMD1	1
#define	READCMD2	0x50
#define	ERASECMD0	0x60
#define	ERASECMD1	0xd0
#define	PROGCMD0	0x80
#define	PROGCMD1	0x10
#define	QUERYCMD	0x70
#define	READIDCMD	0x90

void NFChipSel(U32);
int  NFIsReady(void);
void NFWrCmd(int);
void NFWrAddr(int);
void NFWrDat(int);
U8   NFRdDat(void);

//#define	NFChipEn()	NFChipSel(1)
//#define	NFChipDs()	NFChipSel(0)
#define	NFIsBusy()	NFWaitBusy()

#define	NFWrCmd(cmd)	*(volatile U8 *)NAND_CLE = (cmd)
#define	NFWrAddr(addr)	*(volatile U8 *)NAND_ALE = (addr)
#define	NFWrDat(dat)	*(volatile U8 *)NAND_DAT = (dat)
#define	NFRdDat()		*(volatile U8 *)NAND_DAT

//#define	WIAT_BUSY_HARD
//#define	ER_BAD_BLK_TEST
//#define	WR_BAD_BLK_TEST

//-----------------------------------------------------
//
//-----------------------------------------------------

void NFChipEn(void)
{
	rPDATC  &= ~(NAND_CE); 
}

//-----------------------------------------------------
//
//-----------------------------------------------------

void NFChipDs(void)
{
	rPDATC  |= NAND_CE; 
}

//-----------------------------------------------------
//
//-----------------------------------------------------
U32 NFWaitBusy(void)
{
	//如果rb引脚为1,则等待
	while(!(rPDATC & NAND_RB))
	{
		;
		//printf("\n\r\n\r	Waiting ....");
	}
	return 0;
}

/*static U32 NFWaitBusy(void)
{
	U8 stat;
	
	NFWrCmd(QUERYCMD);
	do 
	{
		stat = NFRdDat();
		//printf("busy!%x\n", stat);
	}while(!(stat&0x40));
	NFWrCmd(READCMD0);
	return stat&1;
}*/
//-----------------------------------------------------
//
//-----------------------------------------------------
 U32 NFReadID(void)
{
	U32 id;

	NFChipEn();
	
	NFWrCmd(READIDCMD);
	NFWrAddr(0);
	id  = NFRdDat()<<8;
	id |= NFRdDat();
	NFChipDs();
	
	return id;
}

//-----------------------------------------------------
//
//-----------------------------------------------------

//addr =  address
void NFReadPage(U32 addr, U8 *buf)
{
//	U8 addr_h,addr_l;
	U16 i;
	U32 PageAddr;
	PageAddr = addr >> 9;
	NFChipEn();
	NFWrCmd(READCMD0);
	NFWrAddr(0);
	NFWrAddr(PageAddr & 0xff);
	*(buf + 900) = PageAddr & 0xff;
	NFWrAddr(PageAddr/256);
	*(buf + 901) = PageAddr /256;

	NFWaitBusy();		

	for(i=0; i<512; i++)
		*(U8 *)(buf + i) = NFRdDat();	
	//	printf("0x%x",buf[i]);	

	NFChipDs();
}

//-----------------------------------------------------
//
//-----------------------------------------------------
//block addr	a9-a24
 U32 NFEraseBlock(U32 addr)
{
	U8 stat;
	addr = addr >>9;
	addr &= ~0x1f;
		
	NFChipEn();	
	NFWrCmd(ERASECMD0);		
	NFWrAddr(addr);
	NFWrAddr(addr>>8);
	
//	if(NandAddr)
//		NFWrAddr(addr>>16);
	NFWrCmd(ERASECMD1);		
	 NFWaitBusy();
	NFChipDs();
	
//#ifdef	ER_BAD_BLK_TEST
//	if(!((addr+0xe0)&0xff)) stat = 1;	//just for test bad block
//#endif
	
//	printf("Erase block 0x%x %s\n", addr, stat?"fail":"ok");
	printf("\n\r Erase OK!");	
	return stat;
}

//-----------------------------------------------------
//
//-----------------------------------------------------

//addr =  address
 U32 NFWritePage(U32 addr, U8 *buf)
{
	U8 RdDat[512];
	U16 i, stat;
	U32 PageAddr = addr>>9;
	NFChipEn();
	
	NFWrCmd(PROGCMD0);
	NFWrAddr(0);
	NFWrAddr(PageAddr);
	NFWrAddr(PageAddr>>8);

	for(i=0; i<512; i++)
		NFWrDat(buf[i]);
    	
	NFWrCmd(PROGCMD1);
	stat = NFWaitBusy();
	
	if(stat)
		printf("Write nand flash 0x%x fail\n", addr);
	else {	
		
		NFReadPage(addr, RdDat);
		for(i=0; i<512; i++)
			if(RdDat[i]!=buf[i]) 
			{
				printf("\n\r\n\r buf[%d] = 0x%x",i,buf[i]);
				printf("\n\r\n\r RdDat[%d] = 0x%x",i,RdDat[i]);
				printf("\n\r\n\r Check data at page 0x%x, offset 0x%x fail\n", addr, i);
				stat = 1;
				break;
			}
	}
		
	NFChipDs();

	return stat;	
}
//-----------------------------------------------------
//
//-----------------------------------------------------

void EraseArea(U32 startaddr,U32 lenth)
{
	U32 tempe=0;
	U32	j;
	tempe = startaddr>>14;
		for(j=0;j<lenth;j++)
		{
		NFEraseBlock((j+tempe)<<5);
		}

} 

⌨️ 快捷键说明

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