Fatfs的版本是最新的R0.10c。
我目前用SPI的方式和SD卡通讯,在不断的摸索之后,读写终于正常了,虽然写卡的速度非常慢。
于是我继续添加其他功能,比如删除文件或文件夹。用的是fatfs官网的代码。
但每次删除完后,我把SD卡插到电脑上,检查磁盘都会显示检测到问题,然后自动修复了,并在SD卡里写入FOUNDxx文件夹。
有趣的是,我用以下函数删除文件或文件夹并不会返回错误。但为什么SD的文件系统却损坏了呢?
经查f_unlink函数在文件打开时可能导致卷损坏,但我的函数都会在打开文件之后关闭文件。
那么问题是, f_readdir和f_opendir会不会打开文件呢?从而导致删除文件时损坏文件系统。
检查磁盘的方法见链接:http://jingyan.baidu.com/article/a3a3f8118f24498da3eb8a48.html
FRESULT empty_directory(char *path)
{
UINT i, j;
FRESULT fr;
DIR dir;
FILINFO fno;
// path:Working buffer filled with start directory
#if _USE_LFN
fno.lfname = 0; // Disable LFN output
#endif
//f_chdir
fr = f_opendir(&dir, path);
if (fr == FR_OK)
{
for (i = 0; path; i++);
path[i++] = '/';
for (;;)
{
fr = f_readdir(&dir, &fno);
if (fr != FR_OK || !fno.fname[0]) break;
if (_FS_RPATH && fno.fname[0] == '.') continue;
j = 0;
do
{
path[i+j] = fno.fname[j];
}while (fno.fname[j++]);
if (fno.fattrib & AM_DIR)
{
fr = empty_directory(path);
if (fr != FR_OK) break;
}
//The file/sub-directory must not be opened, Fatfs官方资料
//or the FAT volume can be collapsed.
//It can be rejected with FR_LOCKED when file lock feature is enabled.
fr = f_unlink(path);
if (fr != FR_OK) break;
}
path[--i] = ' ';
f_closedir(&dir);
}
f_closedir(&dir);
return fr;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
两个FAT表看看
簇链表没有删除干净。SD插到电脑,用windows的cmd输入chkdsk f:f(盘符)可以检测磁盘错误。这种情况都是簇链表丢失。
一周热门 更多>