📄 main.c
字号:
r_ecc2=rNF_ECC2;
Uart_Printf("R_ECC0:0x%x,R_EEC1:0x%x,R_EEC2:0x%x\n",r_ecc0,r_ecc1,r_ecc2);
if( (r_ecc0==eccbuf[0]) && (r_ecc1==eccbuf[1]) && (r_ecc2==eccbuf[2]) )
{
Uart_Printf("ECC check is ok\n");
return TRUE;
}
else
{
Uart_Printf("ECC check is error\n");
return FALSE;
}
}
/*********************************************************************************************************
** Function name: NF_ReadSpareData
** Descriptions: 读出block块中第page页的OOB区的第num个字节
** Input: blcok 块地址
** page 页地址
** num 第n个字节
** Output:
** Created by: 刘国华
** Created Date: 2008-08-14
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 NF_ReadSpareData(uint32 block,uint8 page, uint8 num)
{
uint32 block_page;
uint8 ret_data;
block_page=(block<<5)+page;
// 发送命令和地址
NF_nFCE_L();
NF_CMD(CMD_READOOB); // 读取空闲区数据
NF_ADDR(num&0x0f); // 发送地址地址的A3-A0,A7-A4无效
NF_ADDR(block_page&0xff); // 发送地址A9--A16
NF_ADDR((block_page>>8) & 0x000000FF); // 发送地址A17--A24
NF_ADDR((block_page>>16) & 0x000000FF); // 发送地址A25
NF_WAITRB(); // 等待数据准备好
ret_data=NF_RDDATA(); // 读出一个字节的数据
//NF_WAITRB(); //如果加在这里则会出错千万要注意
NF_nFCE_H();
return ret_data;
}
/*********************************************************************************************************
** Function name: NF_WriteByte()
** Descriptions: 向某个块的某个页中的某个地址写入n个字节
** Input: blcok 块地址 (0-4096)
** page 页地址 (0-31)
** addr 字节地址 (0-527)
** num 写入字节的个数
** Output:
** Created by: 刘国华
** Created Date: 2008-08-14
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 NF_WriteByte(uint32 block,uint8 page,uint32 addr,uint32 num,uint8 *buf)
{
uint32 block_page;
uint32 i;
uint8 status;
block_page=(block<<5)+page;
NF_RSTECC(); //ECC使能
NF_nFCE_L();
if(addr>=512)
NF_CMD(CMD_READOOB); //0x50(C区)
else if(addr>=256)
NF_CMD(CMD_READ1); //0x01(B区)
else
NF_CMD(CMD_READ0); //0x00(A区)
NF_CMD(CMD_SEQIN); // 装载数据命令0x80
NF_ADDR(addr&0xff); // 发送地址地址的A0-A7无效
NF_ADDR(block_page&0xff); // 发送地址A9--A16
NF_ADDR((block_page>>8) & 0x000000FF); // 发送地址A17--A24
NF_ADDR((block_page>>16) & 0x000000FF); // 发送地址A25
//load data to nandflash
for(i=0;i<num;i++)
{
NF_WRDATA(*buf++);
}
eccbuf[0]=rNF_ECC0;
eccbuf[1]=rNF_ECC1;
eccbuf[2]=rNF_ECC2; //两种方法都可以
Uart_Printf("W_EEC0:0x%x,W_EEC1:0x%x,W_EEC2:0x%x\n",eccbuf[0],eccbuf[1],eccbuf[2]);
NF_CMD(CMD_PAGEPROG);
NF_WAITRB();
NF_CMD(CMD_STATUS);
status=NF_RDDATA();
if(status&0x01)
{
NF_nFCE_H();
return FALSE;
}
else
{
NF_nFCE_H();
return TRUE;
}
}
/*********************************************************************************************************
** Function name: NF_ReadByte()
** Descriptions: 从某个块的某个页中的某个地址读出n个字节
** Input: blcok 块地址 (0-4096)
** page 页地址 (0-31)
** addr 字节地址 (0-527)
** num 写入字节的个数
** Output:
** Created by: 刘国华
** Created Date: 2008-08-14
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 NF_ReadByte(uint32 block,uint8 page,uint32 addr,uint32 num,uint8 *buf_ret)
{
uint32 blockpage=(block<<5)+page;//
uint32 i;
uint8 r_ecc0,r_ecc1,r_ecc2;
NF_RSTECC(); //ECC使能
NF_nFCE_L();
if(addr>=512)
NF_CMD(CMD_READOOB); //0x50(C区)
else if(addr>=256)
NF_CMD(CMD_READ1); //0x01(B区)
else
NF_CMD(CMD_READ0); //0x00(A区)
NF_ADDR(addr&0xff); //A7-A0为0x00
NF_ADDR(blockpage&0x000000ff); //A9-A16
NF_ADDR((blockpage>>8)&0x000000ff);//A17-A24
NF_ADDR((blockpage>>16)&0x000000ff); //A25
NF_WAITRB();
for(i=0;i<num;i++)
{
*buf_ret++=NF_RDDATA();
}
NF_nFCE_H();
//读出此时的ECC校验码(读出数据后产生的ECC)
r_ecc0=rNF_ECC0;
r_ecc1=rNF_ECC1;
r_ecc2=rNF_ECC2;
Uart_Printf("R_ECC0:0x%x,R_EEC1:0x%x,R_EEC2:0x%x\n",r_ecc0,r_ecc1,r_ecc2);
if( (r_ecc0==eccbuf[0]) && (r_ecc1==eccbuf[1]) && (r_ecc2==eccbuf[2]) )
{
Uart_Printf("ECC check is ok\n");
return TRUE;
}
else
{
Uart_Printf("ECC check is error\n");
return FALSE;
}
}
/*********************************************************************************************************
** Function name: main
** Descriptions: 主函数,程序入口。
** Input: 无
** Output: 系统返回值0
** Created by: 黄绍斌
** Created Date: 2005-12-31
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int main(void)
{
uint32 id_code=0;
uint32 block_num;
uint8 ret,w_buf[512],r_buf[512];
uint32 bad_block_num=0; //坏块计数器
uint32 i=0;
UART_Select(0);
UART_Init();
Uart_Printf("*********************nandflash test******************\n");
NF_Init(); //nand 初始化
id_code=NF_ReadID(); //读出芯片的ID信息
Uart_Printf("manufacture id:0x%x,device code:0x%x,",((id_code&0xff000000)>>24),((id_code&0x00ff0000)>>16));
Uart_Printf("id_code:0x%x\n",id_code);
//////////////////////erase all block:4096/////////////////////////////////////
for(block_num=0;block_num<MAX_BLOCK_NUM;block_num++)
{
ret=NF_EraseBlock(block_num);
if(FALSE==ret)
{
Uart_Printf("bad block num:%d\n",block_num);
}
}
Uart_Printf("erase all block is ok!\n");
/****************************check bad block******************************************************/
for(block_num=0;block_num<MAX_BLOCK_NUM;block_num++)
{
if((NF_ReadSpareData(block_num,PAGE0,5)!=0xff) || (NF_ReadSpareData(block_num,PAGE1,5)!=0xff)) //读出每个块的1,2页的起始第517个字节
{
bad_block_num++;
Uart_Printf("block%d is bad\n",block_num);
}
}
Uart_Printf("total num of bad block is:%d",bad_block_num); //打印出总的坏块
////////////////////////////////////////////////////////////////////////////////////////////////////
/*
for(i=0;i<512;i++)
{
w_buf[i]=i; //初始化写buf,注意uint8只能到0xf,所以后面的是256个字节又重复0-0xff
}
for(i=0;i<512;i++)
{
r_buf[i]=0; //初始化读buf
}
ret=NF_EraseBlock(1); //擦除第二块
if(FALSE==ret)
{
Uart_Printf("bad block\n");
}
ret=NF_WritePage(1,0,w_buf); //向第2块的第1页写入512字节
if(FALSE==ret)
{
Uart_Printf("write page error \n");
}
NF_ReadPage(1,0,r_buf); //从第2块的第1页读出512字节
for(i=0;i<512;i++)
{
Uart_Printf("%d**",r_buf[i]);
}
*/
while(1);
return(0);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -