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

📄 fat16.c

📁 基于642的sd卡读写程序
💻 C
📖 第 1 页 / 共 2 页
字号:
 	    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 + -