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

📄 fs.c

📁 凌阳单片机的录音,方音程序,用c语言边的,可用性强.
💻 C
字号:
//======================================================
// 文件名称:	FS.c
// 功能描述:	文件索引表管理
// 维护记录:	2006-8-03	v1.0
//======================================================
#include ".\Driver\SD\SD_Driver.h"
#include "FS.h"
#include "SD_Recording_Demo.h"

typedef struct _SD_FS
{
	unsigned long int StartSec;
	unsigned long int EndSec;
	unsigned int Offset;
} FileList;

FileList g_FileListArray[FS_MAX_FILENUM];			//	文件索引表
unsigned int g_FileNum;								//	总文件个数
unsigned long int UsedSecNum;						//	Sector使用量

unsigned long int CurFileStartSec;					//	当前文件的Sector起始地址
unsigned long int CurFileSec;						//	当前文件的操作Sector地址
unsigned long int CurFileEndSec;					//	当前文件的Sector结束地址
unsigned char CurFileOffset;						//	当前文件的末Sector的偏移
unsigned char CurOffset;							//	当前Sector的操作位置

//=============================================================
// 语法格式:	unsigned long int FS_GetUsedSecNum(void)
// 实现功能:	检查SD卡的Block使用量
// 参数:		无
// 返回值:		已使用的Block数量
//=============================================================
unsigned long int FS_GetUsedSecNum(void)
{
	if(0 == UsedSecNum)
		return 0;
	else
		return (UsedSecNum + 1);
}

//=============================================================
// 语法格式:	unsigned long int FS_GetUnusedSecNum(void)
// 实现功能:	检查SD卡的Block未使用量
// 参数:		无
// 返回值:		未使用的Block数量
//=============================================================
long int FS_GetUnusedSecNum(void)
{
	return(SDInfo.BlockNum - UsedSecNum - 1);
}

//=============================================================
// 语法格式:	unsigned long int FS_CheckFileEnd(void)
// 实现功能:	检查是否读取到语音文件的结尾
// 参数:		无
// 返回值:		已经到结尾则返回1,否则返回0
//=============================================================
unsigned int FS_CheckFileEnd(void)
{
	if(CurFileSec == CurFileEndSec)
		if(CurOffset >= CurFileOffset)
			return 1;
	return 0;
}

//=============================================================
// 语法格式:	void FS_Init(void)
// 实现功能:	文件索引表初始化
// 参数:		无
// 返回值:		无
//=============================================================
void FS_Init(void)
{
	while(SD_Initialize() != SD_NO_ERR);			//	初始化SD卡
	g_FileNum = 0;
	UsedSecNum = 0;
	CurFileStartSec = FS_START_SEC;					//	当前文件的Sector起始地址
	CurFileSec = FS_START_SEC;						//	当前文件的操作Sector地址
	CurFileEndSec = FS_START_SEC;					//	当前文件的Sector结束地址
	CurOffset = 0;									//	当前Sector的操作位置
}

//=============================================================
// 语法格式:	void FS_CreatFile(void)
// 实现功能:	创建文件
// 参数:		无
// 返回值:		无
//=============================================================
void FS_CreatFile(void)
{
	if(0 == g_FileNum)
	{
		CurFileStartSec = FS_START_SEC;
		CurFileSec = FS_START_SEC;
		CurFileEndSec = FS_START_SEC;
	}
	else
	{
		CurFileStartSec = g_FileListArray[g_FileNum - 1].EndSec + 1;//	得到上一个文件在索引表中的位置
		CurFileEndSec = CurFileStartSec;
		CurFileSec = CurFileStartSec;
		CurFileOffset = 0;
	}
	g_FileListArray[g_FileNum].StartSec = CurFileStartSec;
	g_FileListArray[g_FileNum].EndSec = CurFileEndSec;
	g_FileListArray[g_FileNum].Offset = CurFileOffset;
	CurOffset = 0;
	SD_WriteNewBlock(CurFileSec);
}

//=============================================================
// 语法格式:	void FS_WriteFile(unsigned int Value)
// 实现功能:	向文件结尾处写入一个字
// 参数:		Value	-	待写入的数据
// 返回值:		无
//=============================================================
void FS_WriteFile(unsigned int Value)
{
	FS_WritingFile(&Value, 1);
}

//=============================================================
// 语法格式:	void FS_WritingFile(unsigned int *Buf, unsigned int Len)
// 实现功能:	向文件结尾处连续写入多个字
// 参数:		Buf	-	待写入的数据缓冲区首地址
//				Len	-	待写入的数据的长度
// 返回值:		无
//=============================================================
void FS_WritingFile(unsigned int *Buf, unsigned int Len)
{
	unsigned int i;
	Len <<= 1;
	if(Len >= (SD_BLOCKSIZE - CurOffset))
	{
		SD_WritingBlockData((unsigned long int)(SD_BLOCKSIZE - CurOffset), (unsigned char *)Buf);
		SD_WriteFinished();
		CurFileSec++;
		CurFileEndSec = CurFileSec;

		i = SD_BLOCKSIZE - CurOffset;
		CurOffset = Len - i;
		i >>= 1;
		SD_WriteNewBlock(CurFileSec);
		SD_WritingBlockData((unsigned long int)CurOffset , (unsigned char *)&Buf[i]);
	}
	else
	{
		SD_WritingBlockData((unsigned long int)Len, (unsigned char *)Buf);
		CurOffset += Len;
	}
}

//=============================================================
// 语法格式:	void FS_CloseWriteFile(void)
// 实现功能:	结束写文件操作
// 参数:		无
// 返回值:		无
//=============================================================
void FS_CloseWriteFile(void)
{
	SD_WritingBlankData(SD_BLOCKSIZE - CurOffset);	//	当前扇区还有SD_BLOCKSIZE - CurOffset没有写完
	CurOffset = 0;
	SD_WriteFinished();

	g_FileListArray[g_FileNum].EndSec = CurFileEndSec;//	修改文件索引表
	g_FileListArray[g_FileNum].Offset = CurOffset;
	g_FileNum++;
	UsedSecNum = CurFileEndSec;
}

//=============================================================
// 语法格式:	void FS_OpenFile(unsigned int FHandle)
// 实现功能:	打开文件
// 参数:		FHandle - 文件序号
// 返回值:		无
//=============================================================
void FS_OpenFile(unsigned int FHandle)
{
	if(0 == FHandle)
		FHandle = 1;
	CurFileStartSec = g_FileListArray[FHandle - 1].StartSec;
	CurFileEndSec = g_FileListArray[FHandle - 1].EndSec;
	CurFileOffset = g_FileListArray[FHandle - 1].Offset;
	CurFileSec = CurFileStartSec;
	SD_ReadNewBlock(CurFileSec);
	CurOffset = 0;
}

//=============================================================
// 语法格式:	void FS_ReadingFile(unsigned int *Buf, unsigned int Len)
// 实现功能:	从文件中连续读取多个字
// 参数:		Buf	-	读取后数据保存缓冲区首地址
//				Len	-	读取长度
// 返回值:		无
//=============================================================
void FS_ReadingFile(unsigned int *Buf, unsigned int Len)
{
	unsigned int i;
	Len <<= 1;
	if(Len >= (SD_BLOCKSIZE - CurOffset))
	{
		SD_ReadingBlockData((unsigned long int)(SD_BLOCKSIZE - CurOffset), (unsigned char *)Buf);
		SD_ReadFinished();
		if(CurFileSec < CurFileEndSec)
			CurFileSec++;
		i = SD_BLOCKSIZE - CurOffset;
		CurOffset = Len - i;
		i >>= 1;
		SD_ReadNewBlock(CurFileSec);
		SD_ReadingBlockData((unsigned long int)CurOffset, (unsigned char *)&Buf[i]);
	}
	else
	{
		SD_ReadingBlockData((unsigned long int)Len, (unsigned char *)Buf);
		CurOffset += Len;
	}
 }
//=============================================================
// 语法格式:	void FS_CloseOpenFile()
// 实现功能:	结束读文件操作
// 参数:		无
// 返回值:		无
//=============================================================
void FS_CloseOpenFile()
{
	SD_DropData(SD_BLOCKSIZE - CurOffset);
	CurOffset = 0;
	SD_ReadFinished();
	CurFileSec = 0;
	CurFileStartSec = 0;
	CurFileEndSec = 0;
	CurOffset = 0;
	CurFileOffset = 0;
}

//=============================================================
// 语法格式:	void FS_EndEncode(unsigned int Low, unsigned int High)
// 实现功能:	将语音文件的长度写入到该文件的起始地址处
// 参数:		Low - 文件长度的低字
//				High- 文件长度的高字
// 返回值:		无
//=============================================================
void FS_EndEncode(unsigned int Low, unsigned int High)
{
	unsigned char Buf[512];
	FS_CloseWriteFile();
	SD_ReadBlock(g_FileListArray[g_FileNum -1].StartSec, Buf);
	Buf[0] = Low & 0xff;
	Buf[1] = Low >> 8;
	Buf[2] = High & 0xff;
	Buf[3] = High >> 8;
	SD_WriteBlock(g_FileListArray[g_FileNum -1].StartSec, Buf);
	Status = IDLE;
}

⌨️ 快捷键说明

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