大家看看我写的nandflash 读程序有啥问题

njynjylq 2013-11-01 10:36:57
#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); //片选失效
}

}
...全文
64 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧