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

📄 program_nf.c

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