📄 lpc2200nand.c
字号:
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 + -