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

📄 lpc2200nand.c

📁 LPC2200系列ARM读写外部NandFlash源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		nandWr_Cmd( NAND_CMD_AREA_A );	//begin from "A" half page	
	}
	
	nandWr_Addr( ( unsigned short ) ( NandAddr & 0xff ) );		 	//column address
	nandWr_Addr( ( unsigned short ) ( ( NandAddr >> 9 ) & 0xff) ); 	//low block address
	nandWr_Addr( ( unsigned short ) ( ( NandAddr >> 17 ) & 0xff) );	//high block address
	//read NAND status register
	nandWr_Cmd( NAND_CMD_RD_STATUS );
	//wait until write operation success
	do
	{
		NandStatus = nandRd_Data();	
	}while(!(NandStatus & 0x40));
	nandWr_Cmd( NAND_CMD_RD_DONE );
	
	for ( i = 0; i < StartColumn; i++ )
		Buffer[i] = nandRd_Data();		

	nandClose();
}

//***************************************************************************
//* Name: nandFlashSpareWrite
//* Input(s) : unsigned int 	NandAddr.
//*            unsigned char  	*Buffer.
//* Returns  : unsigned char    NandStatus.
//* Description : x8 NAND flash page write. 
//*               Because we are using a x8 NAND, the data width is 8bit (unsigned char *Buffer).
//*               *Buffer should contain 512 Bytes data and 16 Bytes ECC information
//* Notes:        NandAddr
//*               A0 - A7   column address
//*               A8        low/high half page selection
//*               A9 - A16  low block address
//*               A17 - A24 high block address
//*               *buffer
//*               |-----from startcolumn----->|---------->|   one page
//*                        data field          spare field
//***************************************************************************
unsigned char nandFlashSpareWrite( unsigned int NandAddr , unsigned char *Buffer )
{
	unsigned char NandStatus = 0x0;
	unsigned int i;
	// for x8 NAND flash device, each page has 16 Bytes for spare
	unsigned short StartColumn = 16 - (NandAddr & 0xf);
	
	nandOpen();	
	nandWr_Cmd( NAND_CMD_AREA_C );		//begin from "C" area	
	nandWr_Cmd( NAND_CMD_PAGEPROG_I );	//program command 1st cycle with 80h	
	nandWr_Addr( ( unsigned short ) ( NandAddr & 0xf ) );		//column address for spare field
	nandWr_Addr( ( unsigned short ) ( ( NandAddr >> 9 ) & 0xff) );	//low block address
	nandWr_Addr( ( unsigned short ) ( ( NandAddr >> 17 ) & 0xff) );	//high block address
	
	for ( i = 0; i < StartColumn; i++ )
		nandWr_Data( Buffer[i] );

	nandWr_Cmd( NAND_CMD_PAGEPROG_II );//confirm program with 10h		
	//read NAND status register
	nandWr_Cmd( NAND_CMD_RD_STATUS );
	//wait until write operation success
	do
	{
		NandStatus = nandRd_Data();	
	}while(!(NandStatus & 0x40));
	nandWr_Cmd( NAND_CMD_RD_DONE );
	nandClose();

	return NandStatus;
}


//***************************************************************************
//* Name: nandFlashSpareRead
//* Input(s) : unsigned int 	NandAddr.
//*            unsigned char  	*Buffer.
//* Returns  : void
//* Description : x8 NAND flash page write
//*               Because we are using a x8 NAND, the data width is 8bit (unsigned char *Buffer).
//*               *Buffer should contain 512 Bytes data and 16 Bytes ECC information
//* Notes:        NandAddr
//*               A0 - A7   column address
//*               A8        low/high half page selection
//*               A9 - A16  low block address
//*               A17 - A24 high block address
//*               *buffer
//*               |-----from startcolumn----->|---------->|   one page
//*                        data field          spare field
//***************************************************************************
void nandFlashSpareRead( unsigned int NandAddr , unsigned char *Buffer )
{
	unsigned char NandStatus;
	unsigned short i;
	// for x8 NAND flash device, each page has 16 Bytes for spare
	unsigned short StartColumn = 16 - (NandAddr & 0xf);
	
	nandOpen();
	nandWr_Cmd( NAND_CMD_AREA_C );	//begin from "C" area	
	nandWr_Addr( ( unsigned short ) ( NandAddr & 0xf ) );		//column address for spare field
	nandWr_Addr( ( unsigned short ) ( ( NandAddr >> 9 ) & 0xff) ); 	//low block address
	nandWr_Addr( ( unsigned short ) ( ( NandAddr >> 17 ) & 0xff) );	//high block address
	
	//read NAND status register
	nandWr_Cmd( NAND_CMD_RD_STATUS );
	do
	{
		NandStatus = nandRd_Data();	
	}while(!(NandStatus & 0x40));
	nandWr_Cmd( NAND_CMD_RD_DONE );

	for ( i = 0; i < StartColumn; i++ )
		Buffer[i] = nandRd_Data();		

	nandClose();
}

//***************************************************************************
//* Name: nandFlashStatusRegRead
//* Input(s) : void.
//* Returns  : unsigned char  	NandStatus.
//* Description : read NAND flash status register. 
//***************************************************************************
unsigned char nandFlashStatusRegRead( void )
{
	unsigned char NandStatus = 0x0;

	nandOpen();	
	//read NAND status register
	nandWr_Cmd( NAND_CMD_RD_STATUS );
	//wait until read operation success
	do
	{
		NandStatus = nandRd_Data();	
	}while(!(NandStatus & 0x40));
	nandWr_Cmd( NAND_CMD_RD_DONE );
	nandClose();

	return NandStatus;
}


//***************************************************************************
//* Name: nandFlashReset
//* Input(s) : void.
//* Returns  : unsigned char  	NandStatus.
//* Description : reset NAND flash device. 
//***************************************************************************
unsigned char nandFlashReset( void )
{
	unsigned char NandStatus = 0x0;

	nandOpen();	
	nandWr_Cmd( NAND_CMD_RESET );
	//read NAND status register
	nandWr_Cmd( NAND_CMD_RD_STATUS );
	//wait until reset operation success
	do
	{
		NandStatus = nandRd_Data();	
	}while(!(NandStatus & 0x40));
	nandWr_Cmd( NAND_CMD_RD_DONE );
	nandClose();

	return NandStatus;
}

//***************************************************************************
//* Name: nandFlashCopyBack
//* Input(s) : unsigned int 	SrcAddr.
//*            unsigned int 	DestAddr.
//* Returns  : unsigned char    NandStatus.
//* Description : x8 NAND flash page copy back. 
//* Notes:        SrcAddr/DestAddr
//*               A0 - A7   column address
//*               A8        low/high half page selection
//*               A9 - A16  low block address
//*               A17 - A24 high block address
//***************************************************************************
unsigned char nandFlashCopyBack( unsigned int SrcAddr , unsigned int DestAddr )
{
	unsigned char NandStatus = 0x0;
	
	nandOpen();	
	nandWr_Cmd( NAND_CMD_COPYBACK_I );	//copy source page
	nandWr_Addr( ( unsigned short ) ( SrcAddr & 0xff ) );		 	//column address
	nandWr_Addr( ( unsigned short ) ( ( SrcAddr >> 9 ) & 0xff) ); 	//low block address
	nandWr_Addr( ( unsigned short ) ( ( SrcAddr >> 17 ) & 0xff) );	//high block address
	//read NAND status register
	nandWr_Cmd( NAND_CMD_RD_STATUS );
	//wait until write operation success
	do
	{
		NandStatus = nandRd_Data();	
	}while(!(NandStatus & 0x40));
	nandWr_Cmd( NAND_CMD_RD_DONE );

	nandWr_Cmd( NAND_CMD_COPYBACK_II );	//program destination page	
	nandWr_Addr( ( unsigned short ) ( DestAddr & 0xff ) );			//column address
	nandWr_Addr( ( unsigned short ) ( ( DestAddr >> 9 ) & 0xff) ); 	//low block address
	nandWr_Addr( ( unsigned short ) ( ( DestAddr >> 17 ) & 0xff) );	//high block address
	NandStatus = 0x0;
	//read NAND status register
	nandWr_Cmd( NAND_CMD_RD_STATUS );
	//wait until write operation success
	do
	{
		NandStatus = nandRd_Data();	
	}while(!(NandStatus & 0x40));
	nandWr_Cmd( NAND_CMD_RD_DONE );
	nandClose();

	return NandStatus;
}


⌨️ 快捷键说明

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