📄 program_nf.c
字号:
/*
Nand Flash的写函数
参数也要满足一定的要求
*/
/*Nand Flash ontroller 的控制寄存器*/
#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)
/*port F的控制寄存器*/
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
#define GPFUP (*(volatile unsigned long *)0x56000058)
#define page_size 512
#define page_size_mask (page_size -1)
/*延时子函数
*/
void wait (unsigned long dly){
for (;dly>0;dly-- );
}
void program_NF(char *load_begin_addr,unsigned long begin_page_addr,unsigned long program_size){
// int delay;
int i,j;
char *load_addr = load_begin_addr;
unsigned long page_addr = begin_page_addr;
/*看参数是否 符合要求*/
if ((begin_page_addr & page_size_mask) || (program_size & page_size_mask))
return;
// char *load_addr = load_begin_addr;
// unsigned long page_addr = begin_page_addr;
// int i,j;
/*使能Nand Flash 的片选信号*/
NFCONF &= ~(1<<11);
// wait(200);
for (;page_addr < (begin_page_addr+program_size);page_addr+=512){
/*写入写命令*/
NFCMD = 0x80;
// wait(200);
/*写入将要写 的页的初始地址,与读操作类似*/
NFADDR = (page_addr & 0xff);
NFADDR = (page_addr >> 9) & 0xff;
NFADDR = (page_addr >> 17) & 0xff;
NFADDR = (page_addr >> 25) & 0x01;
// wait(200);
/*写入要写的数据,应该预先写到了NF中 global buffer 中了*/
/*循环写入512次*/
for (i=0;i<512;i++){
NFDATA = *(load_addr);
load_addr++;
}
// wait(200);
/*写入10h,开始往NF中写入数据,确认要写*/
NFCMD = 0x10;
/*查询NF 的状态,直至一页的写操作完成*/
while (!(NFSTAT & 1))
for (i=0;i<10;i++);
/*ckeck I/O 0,看写的过程中有无错误*/
/*Read Status 命令*/
NFCMD = 0x70;
/*检查I/O 0 ,若没有生了错误,使LED2每隔几秒钟闪一次,总共闪10次*/
if (!(NFDATA & 1)){
GPFCON = 0x5555;/*将整个F口配置成输出端口*/
for(j=0;j<3;j++){
GPFDAT = 0xdf;
wait(30000); /*时间既不能短也不能长*/
GPFDAT |= (1<<5);
wait(30000);
}
}
}
/*
GPFCON = 0x5555;
GPFDAT = 0xdf;
for(delay=2000;delay>0;delay--);
*/
/*关Nand Flash 的片选信号*/
NFCONF |= (1<<11);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -