#define NF_RDDATA8() (rNFDATA8)
#define NF_CLEAR_RB() {rNFSTAT |= (1<<2); }
#define NF_DETECT_RB() {while(!(rNFSTAT&(1<<2)));}
#define NF_CE_L() NF_nFCE_L()
#define NF_CE_H() NF_nFCE_H()
//nandflash命令集
#define CMD_READ1 0x00 //读命令周期1
#define CMD_READ2 0x30 //读命令周期2
#define CMD_RESET 0xff //复位
// HCLK=100Mhz
#define TACLS 1
#define TWRPH0 2
#define TWRPH1 0
//把nandflash中的数据复制到SRAM
void RdNF2SDRAM( )
{
unsigned int i, j;
unsigned int start_addr = 0x0; //nandflash起始地址
unsigned char * to = (unsigned char *)0x30000000; //SRAM起始地址
unsigned int size = 0x100000; //复制数据的大小
//初始化nandflash
rGPACON = (rGPACON &~(0x3f<<17)) | (0x3f<<17);
rNFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<0);
rNFCONT = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0);
//开始复制数据
for(i = (start_addr >> 11); size > 0; )
{
//nandflash复位
NF_CE_L();
NF_CLEAR_RB();
NF_CMD(CMD_RESET);
NF_DETECT_RB();
NF_CE_H();
NF_nFCE_L();
NF_CLEAR_RB();
NF_CMD(CMD_READ1); //读命令
//5个周期地址
NF_ADDR(0x00);
NF_ADDR(0x00);
NF_ADDR((i) & 0xff);
NF_ADDR((i >> 8) & 0xff);
NF_ADDR((i >> 16) & 0xff);
NF_CMD(CMD_READ2); //读命令
NF_DETECT_RB(); //等待
//开始复制一页数据
for (j = 0; j < 2048; j++)
{
to[j] = NF_RDDATA8();
}
NF_nFCE_H();
size -= 2048;
to += 2048;
i ++;
}
}
上面程序是把nandflash中的程序从地址0x0开始,复制到SRAM中,它的绝对地址为0x30000000,复制的大小为0x100000。为了简化程序,在这里我们没有进行ECC校验。
经过上面的修改,我们就可以把程序烧写到nandflash中,并运行起来了。至于如何烧写nandflash,我这里就不过多介绍了。我是用J-Link间接烧写的方法,该方法在网上就可以搜索到,而且在购买J-Link所附带的光盘中应该也有详细地讲解。