📄 read_nf.c
字号:
/*
读Nand Flash 的子程序:page read
参数说明:
store_begin_add: 从Nand Flash中读到的data存放的地址的首址
nand_begin_add: 读Nand Flash的首址(数值上,必须满足一定的条件)
page_num: 读的页数
*/
#define NFCONF (*(volatile unsigned long *)0x4e000000)
#define NFCMD (*(volatile unsigned long *)0x4e000004)
#define NFADDR (*(volatile unsigned long *)0x4e000008)
#define NFDATA (*(volatile unsigned long *)0x4e00000c)
#define NFSTAT (*(volatile unsigned long *)0x4e000010)
#define page_size 512
#define page_size_mask (page_size - 1)
#define page_add_max 0x3fffe00
//void wait(unsigned long dly);
void wait_idle();
void read_NF(unsigned char *store_begin_add,unsigned long nand_begin_add,unsigned long page_num) {
unsigned long i;
unsigned int j;
unsigned char *store_add = store_begin_add;
unsigned long nand_add = nand_begin_add;
/*看输入的参数是否合格*/
if ((nand_begin_add & page_size_mask) || ( (nand_begin_add + (page_num-1)*page_size) > page_add_max ))
return; /*返回main()*/
NFCONF &= ~(1<<11); /*首先使能Nand Flash的片选端,我们在初始化NF的时候,片选信号没有使能
就是待操作的时候,首先使能*/
/*写反了*/
// unsigned long i;
// unsigned int j;
// unsigned char *store_add = store_begin_add; /*store_add,是读的data存放的地址*/
// unsignde long nand_add = nand_begin_add; /*nand_add,是要读的每一页的始址*/
// wait(200);
for (i=0;i<page_num;i++){ /*大循环,实现page_num页的读*/
NFCMD = 0x00; /*向CMD REG 中写入读命令*/
// wait(200);
/*输入的地址,其实是每一页的初始地址*/
NFADDR = nand_add & 0xff; /*1st cycle,A7-A0*/
NFADDR = (nand_add >> 9) & 0xff; /*2nd cycle,A16-A9*/
NFADDR = (nand_add >> 17 ) & 0xff; /*3rd cycle ,A17-A24*/
NFADDR = (nand_add >> 25 ) & 0x01; /*4th cylce ,A25*/
wait_idle(); /*读取数据之前,确定NF已经READY*/
for(j=0;j<512;j++,store_add++){ /*小循环,连续从NFDATA中读512次,实现一页的读*/
*store_add = (NFDATA & 0xff);
}
nand_add += 512; /*进入下一页的首址,每一页是 512字节*/
}
NFCONF |= (1<<11); /*禁止片选信号*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -