?? nandif.c
字號:
#include "nandif.h"
void _NandOutData(unsigned char data)
{
*ADDR_DATA = data;
//_Hw_delay(1);
}
unsigned char _NandInData()
{
unsigned char ret;
ret = *ADDR_DATA;
//_Hw_delay(1);
return ret;
}
void _NandSetAddr(unsigned char addr)
{
*ADDR_ADDRESS = addr;
//_Hw_delay(1);
}
void _NandSetCmd(unsigned char cmd)
{
*ADDR_CMDTABLE = cmd;
//_Hw_delay(1);
}
void Nand_WriteCommand( unsigned char cmd )
{
_HwSetCmd(cmd);
}
int Nand_ChkBusy(void)
{
unsigned char status;
Nand_WriteCommand(NAND_RDSTATUS);
/* Get Status */
status = _HwInData();
if((status & FLSTAT_NAND_BUSY) != 0) {
return 0;//ok
}
else {
return 1;//failed
}
}
void Nand_ResetDevice( void )
{
/* Reset Command 0xff */
Nand_WriteCommand( NAND_RST_CHIP ) ;
/* wait Ready */
while(Nand_ChkBusy());
}
unsigned short Nand_ReadDevID()
{
unsigned short ret;
unsigned char id1,id2;
/* Command 0x90 (ID read1)*/
Nand_WriteCommand(NAND_READ_ID) ;
/* Set Address 0x00*/
_HwSetAddr(0x00) ;
/* Read MakerID, DeviceID */
id1 = _HwInData() << 8 ;
id2 = _HwInData() ;
ret = (id1<<8) | id2;
return ret;
}
void Nand_SetPageAdr( unsigned long pnum)
{
_HwSetAddr(0x00);
_HwSetAddr((unsigned char)pnum & 0xff) ;
_HwSetAddr((unsigned char)(pnum >> 8) & 0xff) ;
}
void Nand_SetBlockAdr( unsigned long bnum)
{
unsigned short start_page;
start_page = 32*bnum;
_HwSetAddr((unsigned char)start_page & 0xff) ;
_HwSetAddr((unsigned char)(start_page >> 8) & 0xff) ;
}
int Nand_BlockErase(unsigned long bnum)
{
/* Block Erase set up */
Nand_WriteCommand(NAND_ERASE1);
/* Set Block Address */
Nand_SetBlockAdr(bnum);
/* Block erase */
Nand_WriteCommand(NAND_ERASE2);
/* Check Busy */
while(Nand_ChkBusy());
return 0;
}
int Nand_ReadSector(unsigned long page, unsigned char * dataBuf, unsigned char * redtBuf)
{
int ret,i;
/* Set Read Cmd */
Nand_WriteCommand(NAND_READ);
/* Set Page Adr */
Nand_SetPageAdr(page);
/* Busy Check */
while(Nand_ChkBusy());
/* Read data */
/* Command 0x0 (read1)*/
Nand_WriteCommand(NAND_READ1);
for( i = 0 ; i < 0x200 ; i++ )
{
dataBuf[i] = _HwInData();
}
/* Read diffuseness part */
for( i = 0 ; i < 0x10 ; i++ )
{
redtBuf[i] = _HwInData();
}
return 0;
}
int Nand_WriteSector(unsigned long page, unsigned char * dataBuf, unsigned char * redtBuf)
{
int i;
/* Serial Data input cmd */
Nand_WriteCommand( NAND_WRDATA ) ;
/* Set Page Adr */
Nand_SetPageAdr(page) ;
/* Buffer Data Write */
for( i = 0 ; i < 0x200 ; i++)
{
_HwOutData(dataBuf[i]) ;
}
/* Buffer Redt Write */
for( i = 0 ; i < 0x10 ; i++)
{
_HwOutData(redtBuf[i]) ;
}
/* Auto Program */
Nand_WriteCommand( NAND_WRITE ) ;
/* Busy Check */
while(Nand_ChkBusy());
return 0;
}
int Nand_ReadSectorRedt( unsigned long page, unsigned char * redtBuf)
{
int i;
/* Command 0x50 */
Nand_WriteCommand( NAND_READ_REDT ) ;
/* Set Address */
Nand_SetPageAdr(page) ;
/* Wait ready */
while(Nand_ChkBusy());
/* Redundunt Data Read */
/* Command 0x0 (read1)*/
Nand_WriteCommand(NAND_READ1) ;
for( i = 0 ; i < 0x10 ; i++ )
{
redtBuf[i] = _HwInData() ;
}
/* Wait Ready */
while(Nand_ChkBusy());
return 0;
}
int Nand_WriteSectorRedt(unsigned long page, unsigned char * redtBuf)
{
int i;
/* Command 0x50 */
Nand_WriteCommand( NAND_READ_REDT ) ;
/* Wait ready */
while(Nand_ChkBusy());
/* Serial Data Input */
Nand_WriteCommand( NAND_WRDATA );
/* Set address */
Nand_SetPageAdr(page);
/* Redundunt Data Write */
for( i = 0 ; i < 0x10 ; i++)
{
_HwOutData(redtBuf[i]) ;
}
/* Auto Program */
Nand_WriteCommand( NAND_WRITE );
/* Check Busy */
while(Nand_ChkBusy());
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -