📄 fat16.c
字号:
if (ret != 0)
printf("Invalid data Response token.\n");
for(i=0;i<BPB_FATSz16;i++){
ReadFatBlock(BPB_RsvdSecCnt+i);
ret = SD_ActiveInit();
if (ret != 0)
printf("Invalid data Response token.\n");
EVMDM642_waitusec(30);
WriteFatBlock(BPB_RsvdSecCnt+BPB_FATSz16+i);
if((i==145)||(i==0))
{
EVMDM642_waitusec(600000);
}
ret = SD_ActiveInit();
if (ret != 0)
printf("Invalid data Response token.\n");
EVMDM642_waitusec(30);
}
}
//-------------------------------------------------------------------------
//获得和文件名对应的目录
Uint8 GetFileID(Uint8 Name[11],DIR *ID,Uint16 *pIndex){
Uint16 i,DirSecCut,DirStart,m;
Uint8 ret;
DirSecCut = GetDirSecCount();//BPB_RootEntCnt*32/BPB_BytesPerSec;目录项占用的扇区数
DirStart = DirStartSec();//BPB_RsvdSecCnt+BPB_NumFATs*BPB_FATSz16;获取根目录开始扇区号
ret = SD_ResetSD(); /* 5. 发出CMDO命令复位SD卡 send CMD0 command to reset sd card */
if (ret != 0)
printf("Invalid data Response token.\n");
EVMDM642_waitusec(60000);
//EVMDM642_waitusec(600000);
ret = SD_ActiveInit(); /* 6. 激活卡进入初始化过程. active card initialize process */
if (ret != 0)
printf("Invalid data Response token.\n");
for(i=0,*pIndex=0;i<DirSecCut;i++){
ReadFatBlock(DirStart+i);
for(m=0;m<16;m++){
if(IsEqual(Name,(Uint8 *)&((DIR*)&BUFFER[m*32])->FileName,11)){
*ID = *((DIR*)&BUFFER[m*32]);
return 1; //找到对应的目录项,返回1.
}
(*pIndex)++;
}
}
return 0; //没有找到对应的目录项,返回0.
}
/************************************************************************************/
Uint8 CreateFile(Uint8 *Name,Uint32 Size){ //创建一个空文件
Uint16 ClusID, ClusNum, ClusNext, i,dirIndex;
DIR FileDir;
Uint8 ret;
Uint32 j=0;
//(GetFileID(Name,&FileDir,&dirIndex)==1)return SD_FAIL; //文件已存在
ClusNum=Size/(BPB_SecPerClus*BPB_BytesPerSec)+1;
EmptyBytes((Uint8 *)&FileDir,sizeof(DIR));
CopyBytes(Name,(Uint8 *)&FileDir.FileName,11);
FileDir.FilePosit.Size=Size;
FileDir.FilePosit.Start=GetNextFAT(0);
ClusID=FileDir.FilePosit.Start;
correctdir((Uint8 *)&FileDir,FileDir.FilePosit.Size,FileDir.FilePosit.Start);
ret = SD_ResetSD(); /* 5. 发出CMDO命令复位SD卡 send CMD0 command to reset sd card */
if (ret != 0)
printf("Invalid data Response token.\n");
EVMDM642_waitusec(60000);
//EVMDM642_waitusec(600000);
ret = SD_ActiveInit(); /* 6. 激活卡进入初始化过程. active card initialize process */
if (ret != 0)
printf("Invalid data Response token.\n");
for(i=0;i<ClusNum-1;i++){
WriteFAT(ClusID,0xffff,j++);
ClusNext=GetNextFAT(ClusID);
WriteFAT(ClusID,ClusNext,j++);
ClusID=ClusNext;
}
// clsre=ClusID;
WriteFAT(ClusID, 0xffff,j++);
WriteDIR(GetEmptyDIR(),&FileDir);
//CopyFAT();
return SD_SUCC;
}
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//读文件
Uint8 ReadFile(Uint8 Name[11],Uint32 Start,Uint32 len,Uint8 *p){
Uint16 BytePerClus,ClusID,m,dirIndex;
Uint32 LBA;
Uint8 i,ret;
DIR FileDir;
Uint32 retu=0x80200000;
if(GetFileID(Name,&FileDir,&dirIndex)==0)return SD_FAIL;//文件不存在
BytePerClus=BPB_SecPerClus*BPB_BytesPerSec; //每簇的字节数
m=Start/BytePerClus; //计算开始位置包含的簇数
recorrectdir((Uint8 *)&FileDir);
ClusID=FileDir.FilePosit.Start; //文件的开始簇号
ret = SD_ResetSD(); /* 5. 发出CMDO命令复位SD卡 send CMD0 command to reset sd card */
if (ret != 0)
printf("Invalid data Response token.\n");
EVMDM642_waitusec(60000);
//EVMDM642_waitusec(600000);
ret = SD_ActiveInit(); /* 6. 激活卡进入初始化过程. active card initialize process */
if (ret != 0)
printf("Invalid data Response token.\n");
for(i=0;i<m;i++)ClusID=ReadFAT(ClusID); //计算开始位置所在簇的簇号
i=(Start%BytePerClus)/BPB_BytesPerSec; //计算开始位置所在扇区的簇内偏移
LBA=ClusConvLBA(ClusID)+i; //计算开始位置的逻辑扇区号
m=(Start%BytePerClus)%BPB_BytesPerSec; //计算开始位置在扇区内偏移
ret = SD_ResetSD(); /* 5. 发出CMDO命令复位SD卡 send CMD0 command to reset sd card */
if (ret != 0)
printf("Invalid data Response token.\n");
EVMDM642_waitusec(60000);
//EVMDM642_waitusec(600000);
ret = SD_ActiveInit(); /* 6. 激活卡进入初始化过程. active card initialize process */
if (ret != 0)
printf("Invalid data Response token.\n");
READ:
for(;i<BPB_SecPerClus;i++)
{
ReadFatBlock(LBA++);
ret = SD_ActiveInit(); /* 6. 激活卡进入初始化过程. active card initialize process */
if (ret != 0)
printf("Invalid data Response token.\n");
for(;m<BPB_BytesPerSec;m++)
{
(*(Uint8 *)retu++)=BUFFER[m];
if(--len==0)return SD_SUCC; //如果读取完成就退出
}
m=0;
}
i=0;
ClusID=ReadFAT(ClusID); //下一簇簇号
LBA=ClusConvLBA(ClusID);
goto READ;
}
//-------------------------------------------------------------------------
//写文件
Uint8 WriteFile(Uint8 Name[11],Uint32 Start,Uint32 len,Uint8 *p){
Uint16 BytePerClus,ClusID,m,dirIndex;
Uint32 LBA;
Uint8 i,ret;
DIR FileDir;
Uint16 ad=0;
Uint32 tu=0x803ffbca;
if(GetFileID(Name,&FileDir,&dirIndex)==0)return SD_FAIL;//文件不存在
BytePerClus=BPB_SecPerClus*BPB_BytesPerSec; // 每簇的字节数
m=Start/BytePerClus; //计算开始位置包含的簇数
recorrectdir((Uint8 *)&FileDir);
ClusID=FileDir.FilePosit.Start; //文件的开始簇号
ret = SD_ResetSD(); /* 5. 发出CMDO命令复位SD卡 send CMD0 command to reset sd card */
if (ret != 0)
printf("Invalid data Response token.\n");
EVMDM642_waitusec(60000);
//EVMDM642_waitusec(600000);
ret = SD_ActiveInit(); /* 6. 激活卡进入初始化过程. active card initialize process */
if (ret != 0)
printf("Invalid data Response token.\n");
for(i=0;i<m;i++)ClusID=ReadFAT(ClusID); //计算开始位置所在簇的簇号
i=(Start%BytePerClus)/BPB_BytesPerSec; //计算开始位置所在扇区的簇内偏移
LBA=ClusConvLBA(ClusID)+i; //计算开始位置的逻辑扇区号
m=(Start%BytePerClus)%BPB_BytesPerSec; //计算开始位置在扇区内偏移
ret = SD_ResetSD(); /* 5. 发出CMDO命令复位SD卡 send CMD0 command to reset sd card */
if (ret != 0)
printf("Invalid data Response token.\n");
ret = SD_ActiveInit(); /* 6. 激活卡进入初始化过程. active card initialize process */
if (ret != 0)
printf("Invalid data Response token.\n");
EVMDM642_waitusec(60000);
WRITE:
for(;i<BPB_SecPerClus;i++)
{
tee=2;
ad=ad+1;
//if(ad==3)
//EVMDM642_waitusec(3000000);
//ReadFatBlock(LBA);
ret = SD_ActiveInit(); /* 6. 激活卡进入初始化过程. active card initialize process */
// EVMDM642_waitusec(6000);
for(;m<BPB_BytesPerSec;m++,tu++)
{
BUFFER[m]=*(Uint8 *)tu;
if(--len==0)
{ //如果读取完成就退出
WriteFatBlock(LBA); //回写扇区
EVMDM642_waitusec(6000);
ret = SD_ActiveInit();
return SD_SUCC;
}
}
m=0;
WriteFatBlock(LBA++); //回写扇区
//EVMDM642_waitusec(6000);
if(((LBA+1024+242)%1024==0)||(ad==1)||(ad==2))
{
EVMDM642_waitusec(1000000);
//ret = SD_ResetSD(); /* 5. 发出CMDO命令复位SD卡 send CMD0 command to reset sd card */
//if (ret != 0)
//printf("Invalid data Response token.\n");
ret = SD_ActiveInit(); /* 6. 激活卡进入初始化过程. active card initialize process */
if (ret != 0)
printf("Invalid data Response token.\n");
}
else
EVMDM642_waitusec(6000);
ret = SD_ActiveInit();
}
i=0;
ClusID=ReadFAT(ClusID); //下一簇簇号
LBA=ClusConvLBA(ClusID);
goto WRITE;
}
//-------------------------------------------------------------------------
Uint8 InitFat16(void){ //初始化FAT16的变量
if(ReadMBR()==SD_FAIL)return SD_FAIL;
if(ReadBPB()==SD_FAIL)return SD_FAIL;
return SD_SUCC;
}
//-------------------------------------------------------------------------
//删除文件
Uint8 EreaseFile(Uint8 Name[11]){
Uint16 ClusID,ClusNext,dirIndex;
DIR FileDir;
Uint32 j;
if(GetFileID(Name,&FileDir,&dirIndex)==0)return SD_FAIL; //文件不存在
ClusID=FileDir.FilePosit.Start; //文件的开始簇号
EREASEFAT:
if((ClusNext=ReadFAT(ClusID))!=0xffff){ //删除FAT表中的链表
WriteFAT(ClusID,0x0000,j++);
ClusID=ClusNext;
}else{
WriteFAT(ClusID,0x0000,j++);
goto EREASEFATEND;
}
goto EREASEFAT;
EREASEFATEND:
FileDir.FileName.NAME[0]=0xe5; //删除Dir中的文件记录
WriteDIR(dirIndex,&FileDir);
CopyFAT(); //FAT2<-FAT1
return SD_SUCC;
}
//-------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -