?? nandflash.c
字號:
#include "console.h"
#include "44b0x.h"
#include "DataType.h"
#define NAND_DAT 0x02000000
#define NAND_ALE 0x02000004
#define NAND_CLE 0x02000002
#define NAND_CE (1<<9) //GPC9
#define NAND_RB (1<<8) //GPC8 busy low, input
#define READCMD0 0
#define READCMD1 1
#define READCMD2 0x50
#define ERASECMD0 0x60
#define ERASECMD1 0xd0
#define PROGCMD0 0x80
#define PROGCMD1 0x10
#define QUERYCMD 0x70
#define READIDCMD 0x90
void NFChipSel(U32);
int NFIsReady(void);
void NFWrCmd(int);
void NFWrAddr(int);
void NFWrDat(int);
U8 NFRdDat(void);
//#define NFChipEn() NFChipSel(1)
//#define NFChipDs() NFChipSel(0)
#define NFIsBusy() NFWaitBusy()
#define NFWrCmd(cmd) *(volatile U8 *)NAND_CLE = (cmd)
#define NFWrAddr(addr) *(volatile U8 *)NAND_ALE = (addr)
#define NFWrDat(dat) *(volatile U8 *)NAND_DAT = (dat)
#define NFRdDat() *(volatile U8 *)NAND_DAT
//#define WIAT_BUSY_HARD
//#define ER_BAD_BLK_TEST
//#define WR_BAD_BLK_TEST
//-----------------------------------------------------
//
//-----------------------------------------------------
void NFChipEn(void)
{
rPDATC &= ~(NAND_CE);
}
//-----------------------------------------------------
//
//-----------------------------------------------------
void NFChipDs(void)
{
rPDATC |= NAND_CE;
}
//-----------------------------------------------------
//
//-----------------------------------------------------
U32 NFWaitBusy(void)
{
//如果rb引腳為1,則等待
while(!(rPDATC & NAND_RB))
{
;
//printf("\n\r\n\r Waiting ....");
}
return 0;
}
/*static U32 NFWaitBusy(void)
{
U8 stat;
NFWrCmd(QUERYCMD);
do
{
stat = NFRdDat();
//printf("busy!%x\n", stat);
}while(!(stat&0x40));
NFWrCmd(READCMD0);
return stat&1;
}*/
//-----------------------------------------------------
//
//-----------------------------------------------------
U32 NFReadID(void)
{
U32 id;
NFChipEn();
NFWrCmd(READIDCMD);
NFWrAddr(0);
id = NFRdDat()<<8;
id |= NFRdDat();
NFChipDs();
return id;
}
//-----------------------------------------------------
//
//-----------------------------------------------------
//addr = address
void NFReadPage(U32 addr, U8 *buf)
{
// U8 addr_h,addr_l;
U16 i;
U32 PageAddr;
PageAddr = addr >> 9;
NFChipEn();
NFWrCmd(READCMD0);
NFWrAddr(0);
NFWrAddr(PageAddr & 0xff);
*(buf + 900) = PageAddr & 0xff;
NFWrAddr(PageAddr/256);
*(buf + 901) = PageAddr /256;
NFWaitBusy();
for(i=0; i<512; i++)
*(U8 *)(buf + i) = NFRdDat();
// printf("0x%x",buf[i]);
NFChipDs();
}
//-----------------------------------------------------
//
//-----------------------------------------------------
//block addr a9-a24
U32 NFEraseBlock(U32 addr)
{
U8 stat;
addr = addr >>9;
addr &= ~0x1f;
NFChipEn();
NFWrCmd(ERASECMD0);
NFWrAddr(addr);
NFWrAddr(addr>>8);
// if(NandAddr)
// NFWrAddr(addr>>16);
NFWrCmd(ERASECMD1);
NFWaitBusy();
NFChipDs();
//#ifdef ER_BAD_BLK_TEST
// if(!((addr+0xe0)&0xff)) stat = 1; //just for test bad block
//#endif
// printf("Erase block 0x%x %s\n", addr, stat?"fail":"ok");
printf("\n\r Erase OK!");
return stat;
}
//-----------------------------------------------------
//
//-----------------------------------------------------
//addr = address
U32 NFWritePage(U32 addr, U8 *buf)
{
U8 RdDat[512];
U16 i, stat;
U32 PageAddr = addr>>9;
NFChipEn();
NFWrCmd(PROGCMD0);
NFWrAddr(0);
NFWrAddr(PageAddr);
NFWrAddr(PageAddr>>8);
for(i=0; i<512; i++)
NFWrDat(buf[i]);
NFWrCmd(PROGCMD1);
stat = NFWaitBusy();
if(stat)
printf("Write nand flash 0x%x fail\n", addr);
else {
NFReadPage(addr, RdDat);
for(i=0; i<512; i++)
if(RdDat[i]!=buf[i])
{
printf("\n\r\n\r buf[%d] = 0x%x",i,buf[i]);
printf("\n\r\n\r RdDat[%d] = 0x%x",i,RdDat[i]);
printf("\n\r\n\r Check data at page 0x%x, offset 0x%x fail\n", addr, i);
stat = 1;
break;
}
}
NFChipDs();
return stat;
}
//-----------------------------------------------------
//
//-----------------------------------------------------
void EraseArea(U32 startaddr,U32 lenth)
{
U32 tempe=0;
U32 j;
tempe = startaddr>>14;
for(j=0;j<lenth;j++)
{
NFEraseBlock((j+tempe)<<5);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -