📄 k9f5608drv.c
字号:
/*
*
* 在作NANDFLASH的基本测试时,建议只对第零块进行操作,因为只有这一块才是厂家保证的不坏块,
* 在对其它块进行操作前,必须要调用函数NandInvalidCheck()进行坏块检查,防址对坏块进行读写,
* 并对出现读写错误的块进行坏块标记,禁止多次对坏块进擦写操作,这样容易引起周边块的损坏。
*
* */
#include "header.h"
void InitNandBus(void)
{ //在本函数里初始化模拟控制信号的时序,本程序用的是华邦w90p710芯片的外部地址零所作,其中NAND的CE接地
CLRBIT(EBICON,EXBE0); //nWE is write enable
EXT0CON=(0x100<<BASADDR)|(0<<SIZE)|(1<<ADRS)|(5<<tACC)|(5<<tCOH)|(1<<tACS)|(1<<tCOS)|(1<<DBWD);
//nand base address 0x4000000
GPIO_CFG4=GPIO_CFG4&(~(0X3<<20)); //general IO
CLRBIT(GPIO_DIR4,10);
}
unsigned int ResetNand(void) //reset nand status
{
unsigned int i;
CMDLATCH=0xff;
i=0;
i=0;
while(!NANDRB)
{
i++;
if(i>100)
return(0);
}
return(1);
}
unsigned int ReadId(void) //return 0 means read id failure!
{ //Read nandflash id
unsigned int id;
unsigned char bak1,bak2;
if(!NANDRB)
{
if(!ResetNand())
return(0);
}
CMDLATCH=0x90;
ADRLATCH=0x0;
bak1=READIO;
bak2=READIO;
id=(bak1<<8);
id=id|(bak2);
return(id);
}
unsigned char NandRead1(unsigned int address,unsigned char *buffer) //return 0 means read failure and return1 means read success!
{ //read the data from address to 0xff(before the Column Address(A0~A7) become to 0x0)
unsigned char cmd,j;
unsigned int i;
if(!NANDRB)
{
if(!ResetNand())
return(0);
}
if(GETBIT(address,8))
cmd=0x1;
else
cmd=0x0;
CMDLATCH=cmd;
ADRLATCH=(address)&0xff;
ADRLATCH=(address>>9)&0xff;
ADRLATCH=(address>>17)&0xff;
i=0;
while(!NANDRB)
{
i++;
if(i>=10000)
return(0);
}
j=0;
for(i=(address&0xff);i<256;i++)
{
*(buffer+j)=READIO;
j++;
}
return(1);
}
unsigned char NandRead2(unsigned int address,unsigned char *buffer) //read 16(512~528) byte
{
//return 0 means read failure and return1 means read success!
unsigned int i;
if(!NANDRB)
{
if(!ResetNand())
return(0);
}
CMDLATCH=0x50;
ADRLATCH=0; //Column address is ignore
ADRLATCH=(address>>9)&0xff;
ADRLATCH=(address>>17)&0xff;
i=0;
while(!NANDRB)
{
i++;
if(i>=10000)
return(0);
}
for(i=0;i<16;i++)
{
*(buffer+i)=READIO;
}
return(1);
}
unsigned char NandPageProg(unsigned int address,unsigned char *buffer) //program 528 byte
{
unsigned int i; //return 0 means Write failure and return1 means Write success!
if(!NANDRB)
{
if(!ResetNand())
return(0);
}
CMDLATCH=0x80;
ADRLATCH=0; //Column address is ignore
ADRLATCH=(address>>9)&0xff;
ADRLATCH=(address>>17)&0xff;
for(i=0;i<528;i++)
READIO=*(buffer+i);
CMDLATCH=0x10;
i=0;
while(!NANDRB)
{
i++;
if(i>=1000000)
return(0);
}
CMDLATCH=0x70;
i=READIO;
if(GETBIT(i,0))
return((unsigned char)i);
else
return(1);
}
unsigned char NandEraseBlock(unsigned int pageaddress) //erase a block,return 0 means erase failure and return 1 means erase success!
{
unsigned int i;
if(!NANDRB)
{
if(!ResetNand())
return(0);
}
CMDLATCH=0x60; //Column address is ignore
ADRLATCH=(pageaddress)&0xff;
ADRLATCH=(pageaddress>>8)&0xff;
CMDLATCH=0xd0;
i=0;
while(!NANDRB)
{
i++;
if(i>=10000000)
return(0);
}
CMDLATCH=0x70;
i=READIO;
if(GETBIT(i,0))
return(0);
else
return(1);
}
unsigned char NandCopyBack(unsigned int sourceaddr,unsigned int aimaddr)
{ //page copy from sourceaddr to aimaddr
//return 0 means copy failure and return 1 means copy success!
unsigned int i;
CMDLATCH=0x00; //Column address is ignore
ADRLATCH=(sourceaddr)&0xff;
ADRLATCH=(sourceaddr>>9)&0xff;
ADRLATCH=(sourceaddr>>17)&0xff;
i=0;
while(!NANDRB)
{
i++;
if(i>=10000000)
return(0);
}
CMDLATCH=0x8a;
ADRLATCH=(aimaddr)&0xff;
ADRLATCH=(aimaddr>>9)&0xff;
ADRLATCH=(aimaddr>>17)&0xff;
i=0;
while(!NANDRB)
{
i++;
if(i>=1000000)
return(0);
}
CMDLATCH=0x70;
i=READIO;
if(GETBIT(i,0))
return((unsigned char)i);
else
return(1);
}
void NandInvalidCheck(unsigned char *BlockBuffer)
{
unsigned int BlockNumber;
unsigned char buffer[16];
//unsigned char Ident;
BlockBuffer[0]=0xff; //block 0 is valid forever;
for(BlockNumber=1;BlockNumber<2048;BlockNumber++)
{
NandRead2((BlockNumber<<14)|(0<<9),buffer);
if(buffer[5]!=0xff)
{
BlockBuffer[BlockNumber]=0;
continue;
}
NandRead2((BlockNumber<<14)|(1<<9),buffer);
if(buffer[5]!=0xff)
{
BlockBuffer[BlockNumber]=0;
}
else
BlockBuffer[BlockNumber]=0xff;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -