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

📄 fat.c

📁 基于SPI方式的MMC卡的FAT代码,可修改用于SD卡的管理.
💻 C
📖 第 1 页 / 共 2 页
字号:
	}
	else	//文件存在就向文件的结尾添加数据
	{
		if(Time > 0x8000) UpDataFAT(FileSize);//写FAT表
		AddToEnd(LastAddr,WriteData,FileSize);
	}
	UpDataRecord(FileSize);

	return;
}



/**********************************************************************************************
**
**	函数名称:WriteFile
**
**	函数功能:向文件中写如数据
**
**	输入参数:文件大小,待写数据
**
**	返 回 值:1--写入成功
**
**	影响参数:暂无
**
**	调用模块:暂无
**
**	说    明:暂无
**
**********************************************************************************************/
BYTE WriteFile(DWORD WriteAddr,DWORD FileSize,BYTE *WriteData)
{
	WORD i=0,j=0;
	BYTE Buffer[512];
	DWORD Len = FileSize,FileSize_OF_Sector = FileSize >> 9;

	do
	{
		Len = FileSize - i*512;
		memset(Buffer,0xFF,512);
		if(Len >= 512)
		{
			for(j = 0;j < 512;j++)
			{
					Buffer[j] = *(WriteData + j + i*512);;
			}
		}
		else
		{
			for(j = 0;j < Len;j++)
			{
					Buffer[j] = *(WriteData + j + i*512);;
			}
		}
		mmc_write_block(WriteAddr + i,Buffer);
	}while((i++) < FileSize_OF_Sector);
	
	return 1;
}


/**********************************************************************************************
**							 
**	函数名称:strupr
**
**	函数功能:将字符串里面的字母转换为对应的大写字母
**
**	输入参数:字符串
**
**	返 回 值:转换后的字符串
**
**	影响参数:暂无
**
**	调用模块:暂无
**
**	说    明:FAT16中的字母都以大写的形式存储
**
**********************************************************************************************/
char *strupr(char *Str)
{
    char *cp;
    
    cp = Str;
    while (*cp != 0)
    {
        if (*cp >= 'a' && *cp <= 'z' )
        {
            *cp -=  'a' - 'A';
        }
        cp++;
    }
    return Str;
}


/**********************************************************************************************
**
**	函数名称:ChkFileExist
**
**	函数功能:检查文件是否存在
**
**	输入参数:文件名
**
**	返 回 值:0--文件不存在,1--文件存在
**
**	影响参数:暂无
**
**	调用模块:暂无
**
**	说    明:暂无
**
**********************************************************************************************/
BYTE ChkFileExist(BYTE *Name)
{
	BYTE i,j,k,Buf1[11],Buf2[11];
	BYTE Flag = 0;

	for(i=0;i<8;i++)
	{		
		if(*Name != '.' && *Name != '\0') 
		{
			Buf1[i] = *Name;
		}
		else
		{
			goto Label;
		}
		Name++;
		Label:	Buf1[i+1] = 0x20;
	}
	for(i=0;i<3;i++)
	{
		Name++;
		if(*Name != 0)	Buf1[i+8] = *Name;
		else	Buf1[i+8] = 0x20;
	}

	mmc_read_block(RootDir_Start_SecNum);

	for(i=0;i<16;i++)
	{
		k = i << 5;
		for(j = k;j < k + 11;j++) Buf2[j - k] = MMCRDData[j];
		if(!memcmp(Buf1,Buf2,11))
		{
			Flag = 1; 
			break;
		}
		else
		{
			Flag = 0;
		}
	}
	return Flag;
}

/**********************************************************************************************
**
**	函数名称:AddToEnd
**
**	函数功能:向文件的结尾添加数据
**
**	输入参数:暂无
**
**	返 回 值:0--添加失败,1--添加成功
**
**	影响参数:暂无
**
**	调用模块:暂无
**
**	说    明:暂无
**
**********************************************************************************************/
void AddToEnd(DWORD Addr,BYTE *buf,DWORD Length)
{
	DWORD Temp,Temp1,Temp2,Len;
	WORD i,j,k;
	
 	mmc_read_block(RootDir_Start_SecNum);

	Temp = MMCRDData[60]|(MMCRDData[61] << 8)|(MMCRDData[62] << 16)|(MMCRDData[63] << 24);
	Temp += Length;

	MMCRDData[60] = (Temp & 0x000000FF) >> 0x00;//文件大小
	MMCRDData[61] = (Temp & 0x0000FF00) >> 0x08;
	MMCRDData[62] = (Temp & 0x00FF0000) >> 0x10;
	MMCRDData[63] = (Temp & 0xFF000000) >> 0x18;

	mmc_write_block(RootDir_Start_SecNum,MMCRDData);
	
	Temp1 = Addr / 512;
	Temp2 = Addr % 512;

	if(Temp2 == 0)
	{
		WriteFile(Temp1,Length,buf);
	}
	else
	{
		mmc_read_block(Temp1);
		k=0;
		for(i=Temp2;i<512;i++)
		{
			MMCRDData[i] = *(buf+i-Temp2);
			k++;
		}
		mmc_write_block(Temp1,MMCRDData);
		Len = Length - k;
		for(i=0;i<Len;i++)
		{
			*(buf+i) = *(buf+k+i);
		}
		WriteFile(Temp1+1,Len,buf);
	}
		
	return ;
}


/**********************************************************************************************
**
**	函数名称:FindFileEnd
**
**	函数功能:查找文件的结尾
**
**	输入参数:暂无
**
**	返 回 值:查找到的地址
**
**	影响参数:暂无
**
**	调用模块:暂无
**
**	说    明:暂无
**
**********************************************************************************************/
DWORD FindFileEnd()
{
	DWORD FileDataEndAddr = 0;

/*	for(i=0;;i++)
	{
		mmc_read_block(FileDataStartAddr+i);
		for(j=0;j<512;j++)
		{
			if((MMCRDData[j] == 0xFF && MMCRDData[j+1] == 0xFF) || (MMCRDData[j] == 0x00 && MMCRDData[j+1] == 0x00))
			{
				FileDataEndAddr = j + ((FileDataStartAddr + i) << 9);
				return FileDataEndAddr;	
			}
		}
	}*/
	mmc_read_block(TotalSector-1);
	FileDataEndAddr = MMCRDData[4]|(MMCRDData[5] << 8)|(MMCRDData[6] << 16)|(MMCRDData[7] << 24);
	if(FileDataEndAddr == 0)
		return (Data_Start_SecNum << 9);
	else
		return FileDataEndAddr;
}

/**********************************************************************************************
**
**	函数名称:GetRecord
**
**	函数功能:获取向MMC中写的次数
**
**	输入参数:暂无
**
**	返 回 值:记录的次数
**
**	影响参数:暂无
**
**	调用模块:暂无
**
**	说    明:根据记录的次数决定是否需要写FAT表,最后一个扇区的0-3字节记录该数据
**
**********************************************************************************************/
DWORD GetRecord(void)
{
	DWORD Rt = 0;
	mmc_read_block(TotalSector-1);
	Rt = MMCRDData[0]|(MMCRDData[1] << 8)|(MMCRDData[2] << 16 )|(MMCRDData[3] << 24);
	return Rt;
}

/**********************************************************************************************
**
**	函数名称:UpDataRecord
**
**	函数功能:获取向MMC中写的次数
**
**	输入参数:暂无
**
**	返 回 值:暂无
**
**	影响参数:暂无
**
**	调用模块:暂无
**
**	说    明:更新最后一个扇区的0-3字节记录该数据
**
**********************************************************************************************/
void UpDataRecord(DWORD FileLength)
{
	DWORD Temp1 = 0,Temp2 = 0;
	mmc_read_block(TotalSector-1);

	Temp1 = MMCRDData[0]|(MMCRDData[1] << 8)|(MMCRDData[2] << 16 )|(MMCRDData[3] << 24);
	Temp1 ++;
	
	MMCRDData[0] = (Temp1 & 0x000000FF) >> 0x00;
	MMCRDData[1] = (Temp1 & 0x0000FF00) >> 0x08;
	MMCRDData[2] = (Temp1 & 0x00FF0000) >> 0x10;
	MMCRDData[3] = (Temp1 & 0xFF000000) >> 0x18;

	Temp2 = MMCRDData[4]|(MMCRDData[5] << 8)|(MMCRDData[6] << 16 )|(MMCRDData[7] << 24);
	if(Temp2 == 0) Temp2 = (Data_Start_SecNum << 9) + FileLength;
	else 	Temp2 += FileLength;
	
	MMCRDData[4] = (Temp2 & 0x000000FF) >> 0x00;
	MMCRDData[5] = (Temp2 & 0x0000FF00) >> 0x08;
	MMCRDData[6] = (Temp2 & 0x00FF0000) >> 0x10;
	MMCRDData[7] = (Temp2 & 0xFF000000) >> 0x18;

	mmc_write_block(TotalSector-1,MMCRDData);
}

⌨️ 快捷键说明

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