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

📄 fat.c

📁 该软件为在sunplus的61单片机上实现的mp3播放器.里面有完整的源代码.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "fat.h"
#include "..\\public\\public.h"
#include "..\\NandFlash\\nfApp.h"
#include "..\\NandFlash\\NFdrv.h"
extern unsigned int g_RWBuf[512];
extern unsigned int F_ReadNF();
#define FAT16 	FAlSE
/*File Manage Function
*/
FILE fileHandler;
DIR_ENTRY fileDirEntry;
unsigned long int currentFileLocate;

unsigned int mpegBitrate;
// t_bitrate[V] [L] [BitrateIndex]
const unsigned int  t_bitrate[2][3][15] = {{
{0,32,48,56,64,80,96,112,128,144,160,176,192,224,256},
{0,8,16,24,32,40,48,56,64,80,96,112,128,144,160},
{0,8,16,24,32,40,48,56,64,80,96,112,128,144,160}
},{
{0,32,64,96,128,160,192,224,256,288,320,352,384,416,448},
{0,32,48,56,64,80,96,112,128,160,192,224,256,320,384},
{0,32,40,48,56,64,80,96,112,128,160,192,224,256,320}
}};

unsigned int FAT_FileReWind()
{
	currentFileLocate=ROOT_DIR_ADDR;
}

unsigned int FAT_FileFindNext(unsigned int *pch)
{	
	unsigned int i, ch[11],ic[2];
	for(i=0; i<11; i++)
		{
			if(*pch == '.')
				{
					pch++;
					i=8;
				}	
			ch[i]=*pch++;	
		}
		
	while(currentFileLocate < DATA_ADDR)
	{
		NF_ReadMultiByte(currentFileLocate, 32, (unsigned int)&fileDirEntry );
		currentFileLocate+=0x20;			
		if(	fileDirEntry.ExtName[0] == ch[8] &&
			fileDirEntry.ExtName[1] == ch[9] &&
			fileDirEntry.ExtName[2] == ch[10] )
			{//Finded File		
				fileHandler.StartClus = fileDirEntry.StartClus[1]*0x100 + fileDirEntry.StartClus[0];
				fileHandler.CurrentClus = fileHandler.StartClus;
				
			#if FAT16	
				NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus-1)*2), 2, ic);
				fileHandler.NextClus=(ic[1]&0xff)*0x100 + (ic[0]&0xff);
			#else
				NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus * 1.5)), 2, ic);
				if(fileHandler.CurrentClus & 0x01)
				{//Odd Number				//Get IC[0].Hight 4 Bit
				 	fileHandler.NextClus=  ( (ic[0]>>4)&0x0f ) | ((ic[1]<<4)&0x0ff0);
				}
				else
				{//Even Number
					fileHandler.NextClus= ic[0] | ((ic[1]<<8) & 0x0f00);
				}				
			#endif	
			
				fileHandler.FileLen	= fileDirEntry.FileLength[0]
									+ fileDirEntry.FileLength[1]*0x100
									+ fileDirEntry.FileLength[2]*0x10000
									+ fileDirEntry.FileLength[3]*0x1000000;
					
				fileHandler.FileCount=0x0000;							
				return(TRUE);
			}				
	}			
	return(FALSE);	//Not Find File	
}

unsigned int FAT_FileFindPrev(unsigned int *pch)
{
	unsigned int i, ch[11], ic[2];
	for(i=0; i<11; i++)
		{
			if(*pch == '.')
				{
					pch++;
					i=8;
				}	
			ch[i]=*pch++;	
		}
				
	while(currentFileLocate > ROOT_DIR_ADDR)
	{
		NF_ReadMultiByte(currentFileLocate, 32, (unsigned int)&fileDirEntry );
		currentFileLocate-=0x20;		
					
		if(	fileDirEntry.ExtName[0] == ch[8] &&
			fileDirEntry.ExtName[1] == ch[9] &&
			fileDirEntry.ExtName[2] == ch[10] )
			{//Finded File	
				fileHandler.StartClus = fileDirEntry.StartClus[1]*0x100 + fileDirEntry.StartClus[0];;
				fileHandler.CurrentClus = fileHandler.StartClus;
				
			#if FAT16	
				NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus-1)*2), 2, ic);
				fileHandler.NextClus=(ic[1]&0xff)*0x100 + (ic[0]&0xff);
			#else
				NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus * 1.5)), 2, ic);
				if(fileHandler.CurrentClus & 0x01)
				{//Odd Number				//Get IC[0].Hight 4 Bit
				 	fileHandler.NextClus= ((ic[0]>>4)&0x0f ) | ((ic[1]<<4)&0x0ff0);
				}
				else
				{//Even Number
					fileHandler.NextClus= ic[0] | ((ic[1]<<8) & 0x0f00);
				}				
			#endif	
							
				fileHandler.FileLen	= fileDirEntry.FileLength[0]
									+ fileDirEntry.FileLength[1]*0x100
									+ fileDirEntry.FileLength[2]*0x10000
									+ fileDirEntry.FileLength[3]*0x1000000;
					
				fileHandler.FileCount=0x0000;	
											
				return(TRUE);
			}			
	}
	return(FALSE);	//Not Find File
}

/*File Control Function 
*/
unsigned int FAT_Open(unsigned int *pch)
{
	unsigned int i[2];	
	
	currentFileLocate=ROOT_DIR_ADDR;               	
	if (! FAT_FileFindNext(pch) )
		return(FALSE);
	else
		return(TRUE);	
}

void FAT_Close()
{
	fileHandler.StartClus = NULL;
	fileHandler.CurrentClus = NULL;
	fileHandler.NextClus = NULL;
	fileHandler.FileLen = NULL;		
	fileHandler.FileCount=NULL;
}

/*File Read/Write Function
*/
void FAT_Putc(unsigned char ch)
{

}
unsigned int FAT_Getc()
{
	unsigned int ic[2];

	if( 0x00 == (fileHandler.FileCount % 0x4000) && (0x00 != fileHandler.FileCount) )
		{//New Block (but Not File First Byte)
		 fileHandler.CurrentClus=fileHandler.NextClus;
		
		 #if FAT16	
			 NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus-1)*2), 2, ic);
			 fileHandler.NextClus=(ic[1]&0xff)*0x100 + (ic[0]&0xff);
		 #else
			 NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus * 1.5)), 2, ic);
			 if(fileHandler.CurrentClus & 0x01)
				{//Odd Number				//Get IC[0].Hight 4 Bit
				 	fileHandler.NextClus= ((ic[0]>>4)&0x0f ) | ((ic[1]<<4)&0x0ff0);
				}
				else
				{//Even Number
					fileHandler.NextClus= ic[0] | ((ic[1]<<8) & 0x0f00);
				}				
			#endif	
		   }
					
	NF_ReadMultiByte(((unsigned long int)(fileHandler.CurrentClus+1) * 0x4000) + (fileHandler.FileCount&0x3fff), 1, ic);
	fileHandler.FileCount++;
	return(ic[0]);		

}

void FAT_WriteSector()
{
}
			
unsigned int FAT_ReadSector()
{
	unsigned int i[2];
	if( 0x00 == (fileHandler.FileCount % 0x4000) && (0x00 != fileHandler.FileCount) )
	{//New Block (but Not File First Byte)
		fileHandler.CurrentClus=fileHandler.NextClus;
		#if FAT16
			NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus-1)*2), 2, i);
			fileHandler.NextClus=(i[1]&0xff)*0x100 + (i[0]&0xff);
			
		#else
				NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus * 1.5)), 2, i);
				if(fileHandler.CurrentClus & 0x01)
				{//Odd Number				//Get IC[0].Hight 4 Bit
				 	fileHandler.NextClus = ( (i[0]>>4)&0x0f ) | ((i[1]<<4)&0x0ff0);
				}
				else
				{//Even Number
					fileHandler.NextClus= i[0] | ((i[1]<<8) & 0x0f00);
				}	
							
		#endif	

	}
	
	NF_PageRead(0x00,((unsigned long int) (fileHandler.CurrentClus+1) * 0x20) + ((fileHandler.FileCount>>9) & 0x1f ), g_RWBuf);	
		
	if( (fileHandler.FileLen-fileHandler.FileCount) >= 512)
		{
		 fileHandler.FileCount+=512;
		 return(512);
		}
	else
		{
		 i[0]=fileHandler.FileLen-fileHandler.FileCount;
		 fileHandler.FileCount=fileHandler.FileLen;
		 return(i[0]);	
		}			
}

/*File Operation Function
*/
void FAT_ReWind(FILE *fp)
{

}

/*File Check Function
*/
unsigned int FAT_Eof()
{
	return(fileHandler.FileCount >= fileHandler.FileLen);
}

unsigned int FAT_FindMPEGHead()
{
FILE backFile;
MPEG_HEADER mpegHeader;
unsigned int i;
	backFile=fileHandler;
	mpegHeader.u32 =  FAT_Getc();
	mpegHeader.u32 <<= 8;
	mpegHeader.u32 |= FAT_Getc();
	mpegHeader.u32 <<= 8;
	mpegHeader.u32 |= FAT_Getc();	
	do	
	{	
		mpegHeader.u32 <<=8;
		i = FAT_Getc();
		i &= 0x00ff;
		mpegHeader.u32 |= i;
																							
		if( (mpegHeader.mpegHead.syncword == 0xfff) &&
	    	(mpegHeader.mpegHead.layer != 0x00) &&
	    	(mpegHeader.mpegHead.bitrate_index != 0x0f) &&
	    	(mpegHeader.mpegHead.sampling_frequency != 0x03)
	   	   )
	     {
	     	fileHandler=backFile;
	     	mpegBitrate= t_bitrate[mpegHeader.mpegHead.ID][3-mpegHeader.mpegHead.layer][mpegHeader.mpegHead.bitrate_index];
	    	return(TRUE);
	     }	 
	}while( !FAT_Eof() );
	
	return(FALSE);  // */
}
/*F**************************************************************************
* NAME: fat_format
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
*   Create single FAT12 or FAT16 partition and format the selected memory 

⌨️ 快捷键说明

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