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

📄 drv_nf.c

📁 The combined demo is dedicated for S1C33L05, so DMT33L05 should be used to load and run the demo. F
💻 C
📖 第 1 页 / 共 4 页
字号:
  
  	/*  CLE, ALE set*/
  
  	colAddr=(unsigned short)(ulAddress & 0x000000ff);           /* A7-0*/
  	pageAddr=(unsigned short)((ulAddress & 0x0001fe00)>>9);     /* A16-9*/
	blockAddrL=(unsigned short)((ulAddress & 0x01fe0000)>>17);  /* A24-17*/
	blockAddrH=(unsigned short)((ulAddress & 0x0e000000)>>25);  /* A27-25*/
	
	SET_CLE_H;	/*  set CLE high*/
 		
	*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=AUTO_WRITE_CMD;/*  write command*/
	
	SET_CLE_L;		/*  set CLE low*/
	SET_ALE_H;		/*  set ALE h*/
	
	*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=colAddr;	    /*  send col address*/
	*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=pageAddr;	  /*  send page address*/
	*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=blockAddrL;	/*  send block l address*/
	*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=blockAddrH;  /*  send block h address*/
	
	SET_ALE_L;		/* set ALE L*/

  	#ifdef ECC
 	 	RESET_ECC;
		EN_ECC;	
	#endif
  	/*  DMA transfer start*/
  
 	 DMA_EN;
  	 DMA_TRIG;  
  
  	/* Wait till DMA_En bit equal to "0"*/
	do{}	
	while (CHECK_DMA_END);
  
	#ifdef ECC
 	 	DIS_ECC;

		do{}
		while (!CHECK_ECC_READY);
				
  		/* Write ECC data to redundant area (first 6byte/3word)*/
  		ECCRet = ECC_AREA0_COL_ADDR;

  		pWriteData = pWriteData + 0x200;  /* write ECC data to the end of pWriteData buffer*/
  
  		for (Cnt=0; Cnt<6; Cnt++){
    			*pWriteData ++ = * ECCRet ++;
  		}  
  
  		pWriteData = pWriteData - 6;

	  	for (Cnt=0; Cnt< 3; Cnt++){
	  		*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS = *(volatile unsigned short*)pWriteData;
	  		pWriteData +=2;
	  	}
	#endif	
	
	SET_CLE_H;	/*  set CLE high*/
	
	*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=PAGE_WRITE_CMD;
	
	SET_CLE_L;	/* set CLE l*/
  
  	asm("nop");
  	asm("nop");  
  	asm("nop"); 
  	asm("nop");
  	asm("nop");   
  	asm("nop"); 
  	asm("nop");
 	asm("nop"); 
  	asm("nop"); 
  	asm("nop");
  	asm("nop"); 
  	asm("nop"); 
  	asm("nop");
  	asm("nop");  
 	asm("nop"); 
  	asm("nop");
  	asm("nop"); 
  	asm("nop"); 
  	asm("nop");
  	asm("nop"); 
 	asm("nop"); 
  	do{}	
 	while (!CHECK_BUSY);		/*wait R/#B to high*/
    
	SET_CLE_H;			/*  set CLE high*/
	*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=READ_STATUS_CMD;
	SET_CLE_L;			/* set CLE l*/	
	
	
	ReadStatus=*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS;
	
	if (ReadStatus & 0x1)
		return FLASH_WRITE_ERR;
 			
	return RetVal;
}

//---------------------------------------------------------------------------------
//  	Function name 		: fnSMC_PageWrite	
// 	Function description	: write page data to SMC
//		 
//      Parameters
//         Input  		:unsigned long 	ulAddress  		page address
//         Output 		:unsigned char* pWriteBuf		buf for store write data
//         I/O    		:void
//      
//      Return value 		:unsigned char	FLASH_SUCCESS		write Success
//						FLASH_ECC_ERROR		ecc check error
//						FLASH_PAR_ERR		parameter error
//						FLASH_WRITE_ERR		write error
//	Global variable 	:void	
//---------------------------------------------------------------------------------   
unsigned char fnSMC_PageWrite( unsigned long ulAddress, unsigned char* pWriteData){
	
	unsigned char  RetVal;
	unsigned char  ReadStatus;
	unsigned short colAddr,pageAddr,blockAddrL,blockAddrH;
	unsigned short Cnt;
	unsigned char* ECCRet;
	unsigned char* Write_ECC;
	
	RetVal=FLASH_SUCCESS;
		
	#ifdef	DEBUG
		/* check parameter */
		if  (ulAddress >=(MAX_BLK_NUM * MAX_PG_NUM * PG_SIZE))
			return FLASH_PAR_ERR;
	#endif
	
  	colAddr=(unsigned short)(ulAddress & 0x000000ff);           /*A7-0*/
  	pageAddr=(unsigned short)((ulAddress & 0x0001fe00)>>9);     /*A16-9*/
	blockAddrL=(unsigned short)((ulAddress & 0x01fe0000)>>17);  /*A24-17*/
	blockAddrH=(unsigned short)((ulAddress & 0x0e000000)>>25);  /*A27-25*/
	
	SET_CLE_H;	/* set CLE high*/

  	SET_SMC_CE_L;		/*set SMC CE L 	*/
 		
	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=AUTO_WRITE_CMD;/* write command*/
	
	SET_CLE_L;		/* set CLE low*/
	SET_ALE_H;		/* set ALE h*/
	
	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=colAddr;	    /* send col address*/
	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=pageAddr;	  /* send page address*/
	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=blockAddrL;	/* send block l address*/
	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=blockAddrH;  /* send block h address*/
	
	SET_ALE_L;		/*set ALE L*/
	#ifdef ECC
  		RESET_ECC;
		EN_ECC;	
	
		for (Cnt=0; Cnt< 512; Cnt++){
	  		*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS = *pWriteData;   /*write one byte*/
	  		pWriteData++;
		}

		DIS_ECC;

		do{}
		while (!CHECK_ECC_READY);
		
  		/*Write ECC data to redundant area (first 6byte/3word)*/
 		 ECCRet = ECC_AREA0_COL_ADDR;

  		Write_ECC = pWriteData;
  
  		for (Cnt=0; Cnt<6; Cnt++){
    			*Write_ECC ++ = * ECCRet ++;
  		}  

		  for (Cnt=0; Cnt< 6; Cnt++){
	  		*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS = * pWriteData++;
	 	 }
	#endif
	
	SET_CLE_H;	/* set CLE high
	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=PAGE_WRITE_CMD;*/
	SET_CLE_L;	/*set CLE l*/
  
    	
  	asm("nop");
  	asm("nop");  
  	asm("nop"); 
  	asm("nop");
  	asm("nop");   
  	asm("nop"); 
  	asm("nop");
 	asm("nop"); 
  	asm("nop"); 
  	asm("nop");
  	asm("nop"); 
  	asm("nop"); 
  	asm("nop");
  	asm("nop");  
 	asm("nop"); 
  	asm("nop");
  	asm("nop"); 
  	asm("nop"); 
  	asm("nop");
  	asm("nop"); 
 	asm("nop"); 
  	do{}	
 	while (!CHECK_BUSY);		/*wait R/#B to high*/
    
  
	SET_CLE_H;	/* set CLE high*/
	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=READ_STATUS_CMD;
	SET_CLE_L;	/*set CLE l*/	
	
	
	ReadStatus=*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS;
	
	if (ReadStatus & 0x1)
		return FLASH_WRITE_ERR;
 			
 	SET_SMC_CE_H;		/*set SMC CE H */	

	return RetVal;
}

//---------------------------------------------------------------------------------
//  	Function name 		: fnFlash_PageWrite	
// 	Function description	: write page data to SMC
//		 
//      Parameters
//         Input  		:unsigned long 	ulAddress  		page address
//         Output 		:unsigned char* pWriteBuf		buf for store write data
//         I/O    		:void
//      
//      Return value 		:unsigned char	FLASH_SUCCESS		write Success
//						FLASH_ECC_ERROR		ecc check error
//						FLASH_PAR_ERR		parameter error
//						FLASH_WRITE_ERR		write error
//	Global variable 	:void	
//---------------------------------------------------------------------------------   
unsigned char fnFlash_PageWrite( unsigned long ulAddress, unsigned char* pWriteData){
	
	unsigned char  RetVal;
	unsigned char  ReadStatus;
	unsigned short colAddr,pageAddr,blockAddrL,blockAddrH;
	unsigned short Cnt;
	unsigned char* ECCRet;
	unsigned char* Write_ECC;
	
	RetVal=FLASH_SUCCESS;
		
	#ifdef	DEBUG
		/* check parameter */
		if  (ulAddress >=(MAX_BLK_NUM * MAX_PG_NUM * PG_SIZE))
			return FLASH_PAR_ERR;
	#endif
	
  	colAddr=(unsigned short)(ulAddress & 0x000000ff);           /*A7-0 */
  	pageAddr=(unsigned short)((ulAddress & 0x0001fe00)>>9);     /*A16-9*/
	  blockAddrL=(unsigned short)((ulAddress & 0x01fe0000)>>17);  /*A24-17*/
	  blockAddrH=(unsigned short)((ulAddress & 0x0e000000)>>25);  /*A27-25*/
	
	SET_CLE_H;	/* set CLE high*/

	*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=AUTO_WRITE_CMD;/* write command*/
	
	SET_CLE_L;		/* set CLE low*/
	SET_ALE_H;		/* set ALE h*/
	
	*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=colAddr;	    /* send col address*/
	*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=pageAddr;	  /* send page address*/
	*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=blockAddrL;	/* send block l address*/
	*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=blockAddrH;  /* send block h address*/
	
	SET_ALE_L;		/*set ALE L*/

	#ifdef ECC
  		RESET_ECC;
		EN_ECC;	
	#endif
  		for (Cnt=0; Cnt< 256; Cnt++){
	 		*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS= *(volatile unsigned short*)pWriteData;
	 		pWriteData+=2;
	 	}
	#ifdef ECC
		DIS_ECC;

		do{}
		while (!CHECK_ECC_READY);
		
  		/*Write ECC data to redundant area (first 6byte/3word)*/
  		ECCRet = ECC_AREA0_COL_ADDR;

  		Write_ECC = pWriteData;
  
  		for (Cnt=0; Cnt<6; Cnt++){
    			*Write_ECC ++ = * ECCRet ++;
  		}  

	  	for (Cnt=0; Cnt< 3; Cnt++){
	  		*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS = *(volatile unsigned short*)pWriteData;
	  		pWriteData +=2;
	  	}
	#endif
	SET_CLE_H;	/* set CLE high*/
	*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=PAGE_WRITE_CMD;
	SET_CLE_L;	/*set CLE l*/
  
    	
  	asm("nop");
  	asm("nop");  
  	asm("nop"); 
  	asm("nop");
  	asm("nop");   
  	asm("nop"); 
  	asm("nop");
 	asm("nop"); 
  	asm("nop"); 
  	asm("nop");
  	asm("nop"); 
  	asm("nop"); 
  	asm("nop");
  	asm("nop");  
 	asm("nop"); 
  	asm("nop");
  	asm("nop"); 
  	asm("nop"); 
  	asm("nop");
  	asm("nop"); 
 	asm("nop"); 
  	do{}	
 	while (!CHECK_BUSY);		/*wait R/#B to high*/
  
	SET_CLE_H;	/* set CLE high*/
	*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=READ_STATUS_CMD;
	SET_CLE_L;	/*set CLE l	*/
	
	
	ReadStatus=*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS;
	
	if (ReadStatus & 0x1)
		return FLASH_WRITE_ERR;
 			
	return RetVal;
}




//---------------------------------------------------------------------------------
//  	Function name 		: fnSMC_BlockErase	
// 	Function description	: write page data to SMC
//		 
//      Parameters
//         Input  		:unsigned long 	ulAddress  		block address
//         Output 		:
//         I/O    		:void
//      
//      Return value 		:unsigned char	FLASH_SUCCESS		Success
//						FLASH_PAR_ERR		parameter error
//						FLASH_ERASE_ERR		erase error
//	Global variable 	:void	
//---------------------------------------------------------------------------------      
unsigned char fnSMC_BlockErase(unsigned long ulAddress){

	unsigned char	 ReadStatus;
	unsigned char  RetVal;
	unsigned short pageAddr,blockAddrL,blockAddrH;
	
	#ifdef	DEBUG
		if((ulAddress < 0 ) || ( ulAddress >= (MAX_BLK_NUM * MAX_PG_NUM * PG_SIZE) ))	
  		return FLASH_PAR_ERR;
	#endif
	
  	pageAddr=(unsigned short)((ulAddress & 0x0001fe00)>>9);     /*A16-9*/
	blockAddrL=(unsigned short)((ulAddress & 0x01fe0000)>>17);  /*A24-17*/
	blockAddrH=(unsigned short)((ulAddress & 0x0e000000)>>25);  /*A27-25*/
		
	SET_CLE_H;	/* set CLE high*/

  	SET_SMC_CE_L;		/*set SMC CE L 	*/
 		
	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=AUTO_ERASE_CMD;/* write command*/
	
	SET_CLE_L;		/* set CLE low*/
	
	SET_ALE_H;		/* set ALE h*/
	
	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=pageAddr;	   /* send page address*/
	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=blockAddrL;	 /* send block l address*/
	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=blockAddrH;   /* send block h address*/
	
	SET_ALE_L;		/*set ALE L*/
	
	SET_CLE_H;		/* set CLE high*/
	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=ERASE_CMD;
	
  	SET_CLE_L;	/*set CLE l*/
	
	asm("nop");
  	asm("nop");  
  	asm("nop"); 
  	asm("nop");
  	asm("nop");   
  	asm("nop"); 
  	asm("nop");
 	asm("nop"); 
  	asm("nop"); 
  	asm("nop");
  	asm("nop"); 
  	asm("nop"); 
  	asm("nop");
  	asm("nop");  
 	asm("nop"); 
  	asm("nop");
  	asm("nop"); 
  	asm("nop"); 
  	asm("nop");
  	asm("nop"); 
 	asm("nop"); 
  	do{}	
 	while (!CHECK_BUSY);		/*wait R/#B to high*/
  
	
	SET_CLE_H;		/* set CLE high*/
	
	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=READ_STATUS_CMD;
	
	SET_CLE_L;	/*set CLE l*/
	
	ReadStatus=*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS;

  	SET_SMC_CE_H;		/*set SMC CE H*/
	
	if (ReadStatus & 0x1)
		return FLASH_ERASE_ERR;
	
  	return FLASH_SUCCESS;

}


//---------------------------------------------------------------------------------
//  	Function name 		: fnFlash_BlockErase	
// 	Function description	: write page data to SMC
//		 
//      Parameters
//         Input  		:unsigned long 	ulAddress  		block address
//         Output 		:
//         I/O    		:void
//      
//      Return value 		:unsigned char	FLASH_SUCCESS		Success
//						FLASH_PAR_ERR		parameter error
//						FLASH_ERASE_ERR		erase error
//	Global variable 	:void	
//---------------------------------------------------------------------------------      
unsigned char fnFlash_BlockErase(unsigned long ulAddress){

⌨️ 快捷键说明

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