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

📄 nfdrv.c

📁 该软件为在sunplus的61单片机上实现的mp3播放器.里面有完整的源代码.
💻 C
字号:
#include "NFDrv.h"
#include "..\\spce061\\061reg.h"
#include "..\\D12\\D12CI.h"

//Function Define In NFHAL.ASM
extern void F_InitWriteNF();
extern void F_InitReadNF();
extern unsigned int F_ReadNF();
extern void F_ReadSectorNF(unsigned int Addr);
extern unsigned int g_RWBuf[];
extern void F_WriteDataToNF(unsigned int Data);
extern void F_WriteCmdToNF(unsigned int Data);
extern void F_WriteAddrToNF(unsigned int Data);
extern void F_WriteSectorToNF(unsigned int Addr);

unsigned long int gl_address;
#define NF_WaitBusy()	while(!(*P_IOA_Data & 0x08))
void NandFlashInit()
{
}

void NF_Reset()
{
  F_InitWriteNF();  
  F_WriteCmdToNF(NF_RESET_CMD);  
}

void NF_ReadOpenAarea(unsigned int wColumnAddr, unsigned long int wRowAddr)                        
{
    F_InitWriteNF();
	F_WriteCmdToNF(NF_READ_A_AREA_CMD);                                 
    F_WriteAddrToNF ( wColumnAddr );                                                  
    F_WriteAddrToNF ( wRowAddr);                      
    F_WriteAddrToNF ((wRowAddr>>8)&0xff );                      
    NF_WaitBusy();
    F_InitReadNF();	    
}

void NF_ReadOpenCarea(unsigned int wColumnAddr, unsigned int wRowAddr)
{
    F_InitWriteNF();
	F_WriteCmdToNF(NF_READ_C_AREA_CMD);                                 
    F_WriteAddrToNF ( wColumnAddr );                                                  
    F_WriteAddrToNF ( wRowAddr);                      
    F_WriteAddrToNF ((wRowAddr>>8)&0xff );                      
    NF_WaitBusy();
    F_InitReadNF();	
}

void NF_WriteOpenAarea(unsigned int wColumnAddr, unsigned long int wRowAddr)                        
{
  	NF_WP_CLOSE();   
  	F_InitWriteNF();    
  	NF_WaitBusy();
  	F_WriteCmdToNF(NF_READ_A_AREA_CMD);
  	F_WriteCmdToNF(NF_SEQUENTIAL_DATA_INPUT_CMD);
      
  	F_WriteAddrToNF( wColumnAddr&0xff );		//1st Cycle
  	F_WriteAddrToNF( wRowAddr & 0xff );			//2nd Cycle
  	F_WriteAddrToNF( (wRowAddr>>8)&0xff );   	//3th Cycle
	NF_WaitBusy();
}

void NF_WriteOpenCarea(unsigned int wColumnAddr, unsigned long int wRowAddr)                        
{
  	NF_WP_CLOSE();   
  	F_InitWriteNF();    
  	NF_WaitBusy();
  	F_WriteCmdToNF(NF_READ_C_AREA_CMD);
  	F_WriteCmdToNF(NF_SEQUENTIAL_DATA_INPUT_CMD);
      
  	F_WriteAddrToNF( wColumnAddr&0xff );		//1st Cycle
  	F_WriteAddrToNF( wRowAddr & 0xff );			//2nd Cycle
  	F_WriteAddrToNF( (wRowAddr>>8)&0xff );   	//3th Cycle
	NF_WaitBusy();
}
          
void NF_ReadMultiByte(unsigned long int dAddr, unsigned int wLen, unsigned int *wrData )
{
  unsigned int i;
  F_InitWriteNF();    
  NF_WaitBusy();
  
  F_WriteCmdToNF((dAddr>>8)&0x1 );
  	F_WriteAddrToNF(dAddr);					//1st Cycle
  	F_WriteAddrToNF((dAddr>>9)&0xff);		//2nd Cycle
  	F_WriteAddrToNF((dAddr>>17)&0xff);  	//3th Cycle
  F_InitReadNF();
  NF_WaitBusy();
  for(i=0; i<wLen; i++)
  {
  	*wrData++ = F_ReadNF();	  	  	  	
  }	
}

void NF_PageRead(unsigned int wColumnAddr,unsigned long int wRowAddr, unsigned int *wrData)
{
  unsigned int i;
  F_InitWriteNF();    
  NF_WaitBusy();
  F_WriteCmdToNF(NF_READ_A_AREA_CMD);
  	F_WriteAddrToNF(wColumnAddr &0xff);		//1st Cycle
  	F_WriteAddrToNF(wRowAddr & 0xff);		//2nd Cycle
  	F_WriteAddrToNF(wRowAddr>>8 & 0xff);  	//3th Cycle
  F_InitReadNF();
  NF_WaitBusy();
  F_ReadSectorNF(wrData);	
}

unsigned int NF_ReadID()
{
unsigned int tData;
  F_InitWriteNF();  
  F_WriteCmdToNF(NF_READ_ID_CMD);
  F_WriteAddrToNF(0x00);
  F_InitReadNF();
  tData=F_ReadNF();			//Read MakerCode  
  tData = (tData<<8)&0xff00;
  tData |= F_ReadNF();		//Read DeviceCode
  return(tData);			//Return Maker(H8) & Device(L8) Code  	
}


unsigned int NF_PageProgram(unsigned int wColumnAddr, unsigned long int wRowAddr, unsigned int *wrData)
{
  unsigned int i;
  NF_WP_CLOSE();   
  F_InitWriteNF();    
  NF_WaitBusy();
  F_WriteCmdToNF(NF_READ_A_AREA_CMD);
  F_WriteCmdToNF(NF_SEQUENTIAL_DATA_INPUT_CMD);
      
  F_WriteAddrToNF( wColumnAddr&0xff );		//1st Cycle
  F_WriteAddrToNF( wRowAddr & 0xff );		//2nd Cycle
  F_WriteAddrToNF( (wRowAddr>>8)&0xff );   	//3th Cycle
  NF_WaitBusy();
  F_WriteSectorToNF(wrData);
  
  F_WriteCmdToNF(NF_PAGE_PROGRAM_CMD);
  NF_WaitBusy();
  
  F_WriteCmdToNF(NF_READ_STATUS_CMD );		/*Read Status */
  F_InitReadNF();
  NF_WP_OPEN();    
  return (F_ReadNF()); 		
}

/*F**************************************************************************
* NAME: NF_MarkBadBlock
*----------------------------------------------------------------------------
* PARAMS:   
*           
* return:   
*----------------------------------------------------------------------------
* PURPOSE:
*   Write 0x00 on block status byte (Byte 5 of spare data)
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*   This function use the global variable Uint32 address
*----------------------------------------------------------------------------
* REQUIREMENTS: 
* ram/xram:
* cycle:
* stack: 
* code:
*****************************************************************************/
void NF_MarkBadBlock(void)
{
  NF_WaitBusy();
  NF_WriteOpenCarea(0x00,gl_address);
  
  F_WriteDataToNF(0xFF);
  F_WriteDataToNF(0xFF);
  F_WriteDataToNF(0xFF);
  F_WriteDataToNF(0x00);
  F_WriteDataToNF(0x00);
  F_WriteDataToNF(0x00);
  F_WriteDataToNF(0xFF);
  F_WriteDataToNF(0xFF);
  F_WriteDataToNF(0xFF);
  F_WriteDataToNF(0xFF);
  F_WriteDataToNF(0xFF);
  F_WriteDataToNF(0xFF);
  F_WriteDataToNF(0xFF);
  F_WriteDataToNF(0xFF);
  F_WriteDataToNF(0xFF);
  F_WriteDataToNF(0xFF);

  F_WriteCmdToNF(NF_PAGE_PROGRAM_CMD);
  NF_WaitBusy();
}


unsigned int NF_EraseBlock(unsigned long int Addr32 )
{
  *P_Watchdog_Clear=0x0001;   
  F_InitWriteNF(); 
  NF_WP_CLOSE();    
  Addr32 = Addr32<<5 ;		//(Sector -> Block) Address
  NF_WaitBusy();
  F_WriteCmdToNF(NF_READ_A_AREA_CMD);
  F_WriteCmdToNF(NF_BLOCK_ERASE_CMD);       	/* Auto Block Erase Setup     */

  	F_WriteAddrToNF( Addr32 & 0xff );         	/* 2nd address cycle          */  
  	F_WriteAddrToNF((Addr32>>8)&0xff); 			/* 3rd address cycle          */
  	F_WriteCmdToNF(NF_BLOCK_ERASE_CONFIRM_CMD);	/* Erase command              */
  
  NF_WaitBusy();
  	F_WriteCmdToNF(NF_READ_STATUS_CMD );			/*Read Status */
  F_InitReadNF();
  
  NF_WP_OPEN();   
  return (F_ReadNF());									//Return Status      
}

/*F**************************************************************************
* NAME: nf_erase_all_block
*----------------------------------------------------------------------------
* PARAMS:   
*           
* return:   
*   OK : erase done
*   KO : erase not done
*----------------------------------------------------------------------------
* PURPOSE:
*   This function erase all blocks on a NF card and write CIS information
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*   This function use the global variable Uint32 address
*----------------------------------------------------------------------------
* REQUIREMENTS: 
* ram/xram:
* cycle:
* stack: 
* code:
*****************************************************************************/
void nf_erase_all_block (void)
{
	unsigned int i, badBlockDetect;
//  Erase All Block
	for(gl_address = 0; gl_address < 2048; gl_address++)
	{
		NF_WaitBusy();
		NF_ReadOpenCarea(0x05,gl_address*32);
		if( F_ReadNF() == 0xff )
		{
			if( NF_EraseBlock(gl_address) & 0x01)
			{// Error in Erase
				NF_MarkBadBlock();
			}
			else
			{// Successful in Erase
			 NF_WaitBusy();
        	 NF_WriteOpenCarea(0x00,gl_address*32);
        	 F_WriteDataToNF(0x00);
        	 F_WriteDataToNF(0x00);
        	 F_WriteDataToNF(0x00);
             F_WriteDataToNF(0x00);
             F_WriteDataToNF(0x00);
             F_WriteDataToNF(0x00);
             F_WriteDataToNF(0x00);
             F_WriteDataToNF(0x00);
             F_WriteDataToNF(0x00);
             F_WriteDataToNF(0x00);
             F_WriteDataToNF(0x00);
             F_WriteDataToNF(0x00);
             F_WriteDataToNF(0x00);
             F_WriteDataToNF(0x00);
             F_WriteDataToNF(0x00);
             F_WriteDataToNF(0x00);
             
			 F_WriteCmdToNF(NF_PAGE_PROGRAM_CMD);        /* Valid the page programmation */
			 NF_WaitBusy();
			 
  			 F_WriteCmdToNF(NF_READ_STATUS_CMD );			/*Read Status */
  			 
             if(0x01 & F_ReadNF())
             {// Error in Program
             	NF_MarkBadBlock();
             }
              	
        	 badBlockDetect = 0;
        	 NF_ReadOpenCarea(0x00,gl_address*32);
        	 for (i = 16; i != 0; i--)
             {
          	  if (F_ReadNF() != 0x00) badBlockDetect = 1;
        	 }			
        	 if (badBlockDetect)
        	 {
          	  NF_MarkBadBlock();
             }
             else
             {
			   if( NF_EraseBlock(gl_address) & 0x01)
			    {// Error in Erase
				 NF_MarkBadBlock();
			    }
        	 }	
		   }
		}//Success Erase End	
	} //For End
}

void DMA_NFtoD12(unsigned long int wAddr, unsigned int nbSector)
{
unsigned int nbPage;
while(nbSector--)
 {
  	NF_ReadOpenAarea(0x00,wAddr++);
  	nbPage=8;
  	while(nbPage--)
  	{
		do
		{
      		F_InitWriteD12();
      		F_WriteCmdToD12(0x05);		
	  		F_InitReadD12();
	 	}while((F_ReadD12() & 0x01)); // Wait (D12-Data) is Empty
	 	
		F_InitWriteD12();
		F_WriteCmdToD12(0xF0);
		F_WriteDataToD12(0x00);
		F_WriteDataToD12(64);	
//  Write Data -> D12	(-- DMA MODE --)	
		F_DMA_NFtoD12_64B();
			
    	F_InitWriteD12();	
		F_WriteCmdToD12(0x00FA);				
//  Clear D12 Interrupt	
//		F_D12_ReadLastTransactionStatus(5);		
   		}
  	}
   	F_D12_ReadLastTransactionStatus(5);	  		
  	do
  	{  	
      F_InitWriteD12();
      F_WriteCmdToD12(0x05);		
	  F_InitReadD12();
   	} while((F_ReadD12() & 0x01)); 	// Wait (D12-Data) is Empty
}

void DMA_D12toNF(unsigned long int wAddr, unsigned int nbSector)
{
unsigned int nbPage;
while(nbSector--)
 {
  	NF_WriteOpenAarea(0x00,wAddr++);
  	nbPage=8;
  	while(nbPage--)
  	{
		do
		{
      		F_InitWriteD12();
      		F_WriteCmdToD12(0x04);		
	  		F_InitReadD12();
	 	}while(!(F_ReadD12() & 0x01)); // Wait (D12-Data) is Full
	 	
	F_InitWriteD12();
	F_WriteCmdToD12(0x00F0);
	F_InitReadD12();
	F_ReadD12();		//Empty Read(1)
    F_ReadD12();		//Empty Read(2)
	
//  Write Data -> D12	(-- DMA MODE --)	
	F_DMA_D12toNF_64B();					
	
    F_InitWriteD12();	
	F_WriteCmdToD12(0x00F2);		
   	}
   	
//	Page Program
   F_InitWriteNF();
   F_WriteCmdToNF(NF_PAGE_PROGRAM_CMD);
   NF_WaitBusy();
   F_WriteCmdToNF(NF_READ_STATUS_CMD );		/*Read Status */
   F_InitReadNF();
   if(F_ReadNF() &0x01) ;//UartSendData(0xaa);	
  }   	    	
//  Clear D12 Interrupt	  
	F_D12_ReadLastTransactionStatus(4);  
  	NF_WP_OPEN();    	
}

⌨️ 快捷键说明

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