⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 erase_nf.c

📁 Linux环境下的S3C2410中NandFlash基本操作编程
💻 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 + -