?? fat.c
字號:
#include"fat.h"
#include "Usart.h"
uint32 FAT_MASK;
uint8 Fat_Buffer[512];
uint32 NumOfFile; //文件的數量
//DISK_FAT_INFO結構,用來存儲SD卡的信息
struct DISK_FAT_INFO DiskFATInfo;
//MUSIC_INFO結構,用來存儲音樂的信息,MusicInfoList用來存放音樂列表,這里限制100首
struct MUSIC_INFO MusicInfoList[3];
//******************************************************************************
//初始化FAT,將SD卡信息,存到DiskFATInfo結構
uint8 Fat_Init(void)
{
SD_ReadBlock(0,Fat_Buffer);
if(Fat_Buffer[0] != 0xEB)
{
DiskFATInfo.DBR_LBA = (Fat_Buffer[454]|(Fat_Buffer[455]<<8)|((uint32)Fat_Buffer[456]<<16)|((uint32)Fat_Buffer[457]<<24));
switch(Fat_Buffer[0x1C2])
{
case 0x0B:
DiskFATInfo.FAT_Style = 32;
FAT_MASK = FAT32_MASK;
break;
case 0x04:
DiskFATInfo.FAT_Style = 16;
FAT_MASK = FAT16_MASK;
break;
}
}
else
{
DiskFATInfo.DBR_LBA = 0;
switch(Fat_Buffer[0x55])
{
case 0x33:
DiskFATInfo.FAT_Style = 32;
FAT_MASK = FAT32_MASK;
break;
case 0x31:
DiskFATInfo.FAT_Style = 16;
FAT_MASK = FAT16_MASK;
break;
}
}
SD_ReadBlock(DiskFATInfo.DBR_LBA,Fat_Buffer);
DiskFATInfo.BytesPerSector = Fat_Buffer[0x0B] |(Fat_Buffer[0x0C] << 8);
DiskFATInfo.SectorsPerClustor = Fat_Buffer[0x0D];
DiskFATInfo.NumOfFATs = Fat_Buffer[0x10] |(Fat_Buffer[0x11] << 8);
DiskFATInfo.SectorsPerFAT = Fat_Buffer[0x24] |Fat_Buffer[0x25] << 8|(uint32)Fat_Buffer[0x26]<<16|(uint32)Fat_Buffer[0x27]<<24;
DiskFATInfo.FAT_LBA = DiskFATInfo.DBR_LBA + (Fat_Buffer[0x0E]|Fat_Buffer[0x0F]<<8);
DiskFATInfo.FDT_LBA = DiskFATInfo.FAT_LBA + DiskFATInfo.SectorsPerFAT*DiskFATInfo.NumOfFATs;
DiskFATInfo.FDT_StartClustor = Fat_Buffer[0x2C] |Fat_Buffer[0x2D] << 8|(uint32)Fat_Buffer[0x2E]<<16|(uint32)Fat_Buffer[0x2F]<<24;
return 1;
}
//****************************************************************************
//文件擴展名匹配,匹配成功返回真
uint8 FileExt_Compare(uint8 *strExt1,uint8 *strExt2)
{
uint8 i;
for(i=0; i<3; i++)
{
if(strExt1[i]!= strExt2[i]) break;
}
if(i == 3) return 1;
return 0;
}
//****************************************************************************
//獲取音樂文件
void GetMusicFile(void)
{
uint16 i,j,k;
uint32 tem; //記錄目錄起始位置
uint32 Index_tmp=1; //記錄目錄編號,不從0開始,因為第0項是系統占用的
uint32 LocalOfFirstLFN;
uint32 n;
uint16 LocalOfMusic=0; //音樂文件的編號
uint8 FileExt[3];
while(1)
{
n = DiskFATInfo.FDT_LBA+(Index_tmp/(DiskFATInfo.BytesPerSector/32));
//讀取FDT的相應扇區位置的內容
SD_ReadBlock(n,Fat_Buffer);
tem=((Index_tmp)*32)%DiskFATInfo.BytesPerSector; //獲取相應的目錄
if(Fat_Buffer[tem] == 0) //后面沒有文件了,文件查詢完畢
{
Index_tmp = 0;
break;
}
if((Fat_Buffer[tem] != 0xe5) && (Fat_Buffer[tem] != 0x05)) //文件沒有刪除
{
if(Fat_Buffer[tem+11]!= 0x0F) //文件不為長文件名的一部分
{
for(i=0;i<3;i++) //讀取該文件的擴展名
{
FileExt[i] = Fat_Buffer[tem+8+i];
}
if(FileExt_Compare(FileExt,"MP3")) //如果該文件是MP3
{
for(i=0;;i++) //將文件名賦值給音樂列表的文件名項
{
if(Fat_Buffer[tem+i] == 0x20 || i>=8)
{
MusicInfoList[LocalOfMusic].FileName[i] = '.';
MusicInfoList[LocalOfMusic].FileName[i+1] = 'm';
MusicInfoList[LocalOfMusic].FileName[i+2] = 'p';
MusicInfoList[LocalOfMusic].FileName[i+3] = '3';
break;
}
MusicInfoList[LocalOfMusic].FileName[i]=Fat_Buffer[tem+i];
}
//將文件的起始簇號賦值給音樂列表的起始簇號項
MusicInfoList[LocalOfMusic].FileStartClustor = Fat_Buffer[tem+0x1A]|Fat_Buffer[tem+0x1B]<<8|((uint32)Fat_Buffer[tem+0x14]<<16) | ((uint32)Fat_Buffer[tem+0x15]<<24) ;
MusicInfoList[LocalOfMusic].FileLength = Fat_Buffer[tem+0x1C]|(Fat_Buffer[tem+0x1D]<<8)|((uint32)Fat_Buffer[tem+0x1E]<<16)|((uint32)Fat_Buffer[tem+0x1F]<<24);
LocalOfMusic++; //開始下一個音樂文件的記錄
}
}
else
{
LocalOfFirstLFN = Index_tmp;
while(1)
{
Index_tmp++;
n = DiskFATInfo.FDT_LBA+(Index_tmp/(DiskFATInfo.BytesPerSector/32));
//讀取FDT的相應扇區位置的內容
SD_ReadBlock(n,Fat_Buffer);
tem = ((Index_tmp)*32)%DiskFATInfo.BytesPerSector;
if(Fat_Buffer[tem+11]!= 0x0F)
{
MusicInfoList[LocalOfMusic].FileStartClustor = Fat_Buffer[tem+0x1A]|Fat_Buffer[tem+0x1B]<<8|((uint32)Fat_Buffer[tem+0x14]<<16) | ((uint32)Fat_Buffer[tem+0x15]<<24) ;
MusicInfoList[LocalOfMusic].FileLength = Fat_Buffer[tem+0x1C]|(Fat_Buffer[tem+0x1D]<<8)|((uint32)Fat_Buffer[tem+0x1E]<<16)|((uint32)Fat_Buffer[tem+0x1F]<<24);
break;
}
}
k = 0;
for(i=Index_tmp-1; i>=LocalOfFirstLFN; i--)
{
n = DiskFATInfo.FDT_LBA+(i/(DiskFATInfo.BytesPerSector/32));
//讀取FDT的相應扇區位置的內容
SD_ReadBlock(n,Fat_Buffer);
tem = (i*32)%DiskFATInfo.BytesPerSector;
for(j=1; j<32; j++)
{
if(j==0x0B|j==0x0C|j==0x0D|j==0x1A|j==0x1B)
continue;
if(Fat_Buffer[tem+j]<128 && Fat_Buffer[tem+j]!=0)
{
MusicInfoList[LocalOfMusic].FileName[k] = Fat_Buffer[tem+j];
k++;
}
// else if(Fat_Buffer[tem+j]>128 && Fat_Buffer[tem+j]!=)
}
}
LocalOfMusic++; //開始下一個音樂文件的記錄
}
}
Index_tmp++; //跳到下一個目錄編號
}
NumOfFile = LocalOfMusic;
}
uint32 ReadBlockforCluster(uint32 Sector,uint32 offset)
{
uint32 tmp;
SD_ReadBlock(Sector,Fat_Buffer);
tmp=Fat_Buffer[offset] |(Fat_Buffer[offset+1]<<8) |((uint32)Fat_Buffer[offset+2]<<16) |((uint32)Fat_Buffer[offset+3]<<24);
return tmp;
}
uint32 FatNextCluster(uint32 cluster)
{
uint32 nextCluster=0;
uint32 fatOffset=0;
uint32 sector=0;
uint16 offset=0;
fatOffset = cluster<<2;
sector = DiskFATInfo.FAT_LBA + (fatOffset>>9);
offset = fatOffset % DiskFATInfo.BytesPerSector;
nextCluster = ReadBlockforCluster(sector,offset);
if (nextCluster >= (CLUST_EOFS & FAT_MASK)) // 是否文件的結束簇
{
nextCluster = CLUST_EOFE;
}
return nextCluster;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -