📄 erase_nf.c
字号:
/*
Nand Flash 的ERASE 子程序:BLOCK_ERASE
*/
/*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)
void wait_idle(); /*调用的函数必须首先声明*/
void wait(unsigned long dly); /*同样的原因,否则,编译不通过*/
void erase_NF(unsigned long erase_block_num){
int delay;
int i,j;
unsigned long erase_block_addr;
/*总共只有4096个BLOCK,编号为0-4095*/
if (erase_block_num >= 4096){
return;
}
/*
GPFCON=0x5555;
GPFDAT=0x7f;
for (delay=2000;delay>0;delay--);
*/
/*计算BLOCK的实际地址*/
erase_block_addr = (erase_block_num<<14);
/*使能片选信号*/
NFCONF &= ~(1<<11);
// wait(200);
/*输入ERASE 命令*/
NFCMD = 0x60;
// wait(200);
/*输入要ERASE 的BLOCK的地址,分3个CYCLES*/
NFADDR = (erase_block_addr>>9) & 0xff;
NFADDR = (erase_block_addr>>17) & 0xff;
NFADDR = (erase_block_addr>>25) & 0x01;
// wait(200);
/*输入确认ERASE命令,正式开始ERASE*/
NFCMD = 0xd0;
/*查询NFSTAS,直至Nand Flash完成ERASE任务*/
// while ( !(NFSTAT & 1))
// for (i=0;i<10;i++);
wait_idle();
/*检查I/O 0,看ERASE操作有没有发生错误*/
/*Read Status 命令*/
NFCMD = 0x70;
/*检查I/O 0 ,若 没有发生错误,使LED1每隔几秒钟闪一次,总共闪10次*/
if (!(NFDATA & 1)){
GPFCON = 0x5555;/*将整个F口配置成输出端口*/
for(j=0;j<5;j++){
GPFDAT = 0xef;
wait(30000);
GPFDAT |= (1<<4);
wait(30000);
}
}
/*
GPFCON=0x5555;
GPFDAT=0xef;
for(delay=2000;delay>0;delay--);
*/
/*关片选信号*/
NFCONF |=(1<<11);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -