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

📄 drv_nandflash.c

📁 nandflash驱动程序
💻 C
字号:
////////////////////////////////////////////////////////////////////////
//	文件名		:drv_nandflash.c
//	文件功能	:系统读取Nand Flash驱动
//	作者		:cxl
//	创建时间	:2005年11月11日
//      处理器	        : Epson C33L05
//	项目名称	:
//	备注		:
//     可以驱动的Nand Flash型号: K9F1G08U0A  SAMSUNG
////////////////////////////////////////////////////////////////////////


//Sys include file
#include "..\include\common.h"
#include "..\include\8timer.h"
#include "..\include\16timer.h"
#include "..\include\io.h"
#include "..\include\presc.h"

//Nand Flash driver file
#include "comm_drv.h"
#include "drv_nandfls.h"


//#undef  USE_K9F5616
//#undef  USE_K9F2808U0M
//#define USE_K9F1208U0M

t_nand_fls_id this_nand_fls_id,*p_nand_fls_id;

int nand_fls_init(void)
{
	unsigned short i;
	//read id
	p_nand_fls_id = &this_nand_fls_id;
	memset(p_nand_fls_id,0,sizeof(t_nand_fls_id));
		
	

/*select ALE, CLE port as output*/
  	SET_ALE_L;
 	SET_ALE_OUTPUT;
 	SET_CLE_L;
 	SET_CLE_OUTPUT;

 	/* select CE15,16 data is high (P51)*/
 	SET_NAND_CE_H;
	
 	/*select CE/GPIO port function as CE*/
 	SET_NAND_CE_CE;
	
 	/*select CE as output*/
 	SET_NAND_CE_OUTPUT;
	
 	/* set flash device mode*/
  	SET_DEVICE_8;	
 	
 	/*select NAND flashmap to area 15 and boot function*/	
	SET_NAND_AREA;

 	/*select SMWE,SMRD port function as flash I/F function */
 	//CLR_SMIFREG;
 	SET_SMIF_WE;
 	SET_SMIF_RD;
 	
 	/*set by/ry signal as input*/
 	SET_BUSY_INPUT;	
 	
 	/*disable write protect*/
 	SET_WP_H;
 	SET_WP_GPIO;
 	
 	/*set wp pin as output	*/
 	SET_WP_OUTPUT;	
 
 
       SET_NAND_CE_L;
  
       asm("nop");
  
 	 for(i=0;i<10000;i++){
		   asm("nop");
	 }	
    
 
    	//write read ID command
    	SET_CLE_H;
    	REG_CHAR(Nand_Fls_COMM_ADD)=0x90;
	SET_CLE_L;
    	//write address 0
    	SET_ALE_H;
    	REG_CHAR(Nand_Fls_Reg_ADD)=0x00;
	SET_ALE_L;
 
    	//read maker id
    	p_nand_fls_id->maker_code 		= REG_CHAR(Nand_Fls_Data_ADD);
    	p_nand_fls_id->device_code 		= REG_CHAR(Nand_Fls_Data_ADD);
    	p_nand_fls_id->rev1        		= REG_CHAR(Nand_Fls_Data_ADD);
    	p_nand_fls_id->mutiplane_code = REG_CHAR(Nand_Fls_Data_ADD);
    	
    	SET_NAND_CE_H;
    	asm("nop");
   	if((p_nand_fls_id->maker_code == 0xEC)&&(p_nand_fls_id->device_code == 0xF1)\
   			&&(p_nand_fls_id->mutiplane_code == 0x15))
   			return NAND_INIT_OK;
    	return NAND_INIT_ERROR;
    	

}


void nand_fls_Reset(void){
  	
  	int i;
 	
 	SET_CLE_H;		/*set CLE H*/
 	
 	*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=RESET_CMD;	/*write RESET command*/

 	SET_CLE_L;		/*set CE L*/

	/*Wait flash R/#B ready (worst case 500us reset when erase; delay 1ms for safe)*/
 	for (i=0; i<800; i++) {
    		asm("nop");
  	}  
  
	return;	
 }

//这里用到的地址入口参数都是字节地址,范围是0--->128MB+4MB-1.
//地址的格式是:A7--A0,0000+A11---A8,A19--A12,A27--A20.
//上面这种理解是错误的

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -