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

📄 nand.c

📁 NAND FLASH 的读写例程
💻 C
字号:
/*****************************************************************************
 *   nand.c:  nand flash read and write
 *
 *   Copyright(C) 2007, uCdragon
 *   All rights reserved.
 *
 *   History
 *   2007.03.16  lqm@ucdragon.net
 *
******************************************************************************/
#include "nand.h"
#ifdef	NAND_FLASH_SUPPORT
typedef struct
{
	U32 id;
	U32 size;
}NFChipInfo;

static NFChipInfo NandFlashChip[] =
{
	{0xec73, SIZE_16M}, {0xec75, SIZE_32M}, {0xec76, SIZE_64M},
	{0xec79, SIZE_128M}, {0, 0}, 
};

static NFChipInfo * pNand = 0;
static BOOL NandAddr;

#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
#define	RESETCMD	0xFF


#define	NFWrCmd(cmd)	*(volatile U8 *)NandFlash_CLE = (cmd)
#define	NFWrAddr(addr)	*(volatile U8 *)NandFlash_ALE = (addr)
#define	NFWrDat(dat)	*(volatile U8 *)NandFlash_DATA =(dat)
#define	NFRdDat()		*(volatile U8 *)NandFlash_DATA

static U32 NFWaitBusy( void )
{
	U8 stat;

	NFWrCmd(QUERYCMD) ;
	do
	{
		stat = NFRdDat();
	}
	while ( !( stat & 0x40 ) ) ;

	NFWrCmd(READCMD0) ;
	return stat & 1 ;
}
static U32 NFReadID( void )
{
	U32 id, loop = 0;
	NFChipEn();
	NFWrCmd( RESETCMD );
	NFWrAddr( 0 );
	Delay( 2 );
	NFWrCmd( READIDCMD );
	NFWrAddr( 0 );
	while ( ( NFIsBusy() ) && ( loop < 10000 ) )
		loop++;
	if ( loop >= 10000 )
		return 0;
	id = NFRdDat() << 8;
	id |= NFRdDat();
	NFChipDs();

	return id;
}
int NandInit( void )
{
	U32 id = NFReadID();
	pNand = NandFlashChip;
	while(pNand->id)
	{
		if(pNand->id == id) break;
		pNand++;
	}
	if(!pNand->id) pNand = 0;
	else
	{
		NandAddr = pNand->size >= SIZE_64M;
	}
	return id;
}

U32 NFEraseBlock( U32 addr )
{
	U8 stat;

	addr &= NAND_BLOCK_MASK;

	NFChipEn();	
	NFWrCmd( ERASECMD0 );		
	NFWrAddr( addr );
	NFWrAddr( addr >> 8 );
	if ( NandAddr )
		NFWrAddr( addr >> 16 );
	NFWrCmd( ERASECMD1 );		
	stat = NFWaitBusy();
	NFChipDs();

	//printf( "Erase block 0x%08x %s\n" , addr , stat ? "fail" : "ok" );

	return stat;
}
//addr = page address
void NFReadPage( U32 addr , U8* buf )
{
	U16 i;
	NFChipEn();
	NFWrCmd( READCMD0 );
	NFWrAddr( 0 );
	NFWrAddr( addr );
	NFWrAddr( addr >> 8 );
	if ( NandAddr )
		NFWrAddr( addr >> 16 );
	//	InitEcc();
	NFWaitBusy();		
	for ( i = 0; i < NAND_SECTOR_LEN; i++ )
		buf[i] = NFRdDat();		
	NFChipDs();
}
//addr = page address
U32 NFWritePage( U32 addr , U8* buf )
{
	U32 i = NAND_SECTOR_LEN, stat;
	while (NFIsBusy());
	NFChipEn();
	NFWrCmd( READCMD0 );
	NFWrCmd( PROGCMD0 );
	NFWrAddr( 0 );
	NFWrAddr( addr );
	NFWrAddr( addr >> 8 );
	if ( NandAddr )
		NFWrAddr( addr >> 16 );
	//	InitEcc();	
	while(i--)
		NFWrDat( *buf++ );

	NFWrCmd( PROGCMD1 );
	stat = NFWaitBusy();
	NFChipDs();
	return stat;
}
#endif	/* NAND_SUPPORT */

⌨️ 快捷键说明

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