s3c2440的nandflash启动(二)

2014-11-24 10:09:33 · 作者: · 浏览: 1
{rNFCONT |= (1<<1); }


#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所附带的光盘中应该也有详细地讲解。