//======================================================
// 文件名称: 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;
}
FS.rar_SD 管理
版权申诉
51 浏览量
2022-09-24
15:35:28
上传
评论
收藏 2KB RAR 举报
寒泊
- 粉丝: 75
- 资源: 1万+
评论0