大家看看我写的nandflash 读程序有啥问题
#define GPOCON (*(volatile unsigned long *)0x7F008140)
#define GPPCON (*(volatile unsigned long *)0x7F008160)
#define Base 0x70200000
#define NFCONF (*(volatile unsigned long *)(Base + 0x00))
#define NFCONT (*(volatile unsigned long *)(Base + 0x04))
#define NFCMMD (*(volatile unsigned long *)(Base + 0x08))
#define NFADDR (*(volatile unsigned long *)(Base + 0x0c))
#define NFDATA (*(volatile unsigned long *)(Base + 0x10))
#define NFSTAT (*(volatile unsigned long *)0x70200028)
#define DEVICE_SIZE (2048*64*2048)
#define BLOCK_SIZE (64*2048)
#define PAGE_SIZE (2048)
// 我自己写的bootloader 启动的时候需要从nandflash中读出内核到内存中,然后运行内核
//但是好像有点问题,没有达到预想的效果,各位大侠帮忙看看
void nand_read(unsigned char *mem_addr, //内存地址
unsigned long nand_addr,//nandflash地址
unsigned long off_set)//偏移大小
{
unsigned long page_addr=nand_addr-nand_addr%PAGE_SIZE; //得出页的首地址
unsigned long page_num;//有多少页
if(off_set%PAGE_SIZE==0)
{
page_num=off_set/PAGE_SIZE;
}
else
{
page_num=off_set/PAGE_SIZE+1;
}
int i;
int j;
for(i=0;i<page_num;i++) //循环读出每一页的内容
{
NFCONT&=~(1<<1); //片选使能
NFCMMD=0x00; //发送命令
//发送列地址
NFADDR=(page_addr)&0xff;
NFADDR=((page_addr)>>8)&0x7;
//发送行地址
NFADDR=((page_addr)>>11)&0xff;
NFADDR=((page_addr)>>19)&0xff;
NFADDR=((page_addr)>>27)&0x1;
NFCMMD=0x30;//读命令
while(!(NFSTAT&1))
{
;
}
/* 接受数据将数据写到内存的相应地址中*/
for(j=0;j<PAGE_SIZE;j++)
{
*mem_addr=NFDATA&0xff;
mem_addr++;
}
page_addr+=PAGE_SIZE; //设置下一页的地址
NFCONT|=(1<<1); //片选失效
}
}