lpc2200nand.c

来自「LPC2200系列ARM读写外部NandFlash源代码」· C语言 代码 · 共 428 行 · 第 1/2 页

C
428
字号
		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 + =
减小字号Ctrl + -
显示快捷键?