admin管理员组文章数量:1571939
问题1:fatfs 目录下无法创建文件
例如:使用 res = f_open(&file,"0:/LOG/text.txt",FA_OPEN_ALWAYS |FA_WRITE )创建txt文件,结果:res=FR_OK 。进入U盘模式查看,却发现LOG文件夹下面,没有text.txt文件
事故原因:LOG目录可用扇区为0,text.txt无法写入LOG目录下。如图:
扇区1:正常记录了LOG目录的信息,有文件2021-1-5.csv,2021-1-6.csv...
扇区2-8:也是LOG目录的信息区,但都被0xff填满。在fat12文件系统中,0xff表示占用,0x00才表示空闲。可是w25q128擦除结果却是0xff,所以此时LOG目录的2-8扇区被判断为占用,整个LOG目录没有空闲扇区可以记录text.txt文件信息。因此导致了test.txt文件无法在LOG目录下面创建。
解决办法:将0xff变成0x00即可
问题2:fatfs U盘容量突然被占用
现象:U盘总容量12M,只写入几百kb的文件信息,容量却只剩1M
原因:FAT表中的簇信息被异常擦除,如图:
fatfs容量统计原理是统计FAT表下面空闲的簇(即:0x000)的数量,来计算空闲容量的,总容量也是计算FAT表下面有多少个簇。
在这个图中,实际已用空间不到1M,实际却显示了10.2MB已用,消失的9.2MB就是被异常擦除成0xff的扇区。
解决办法:将0xff扇区恢复成0x00,即可以恢复容量
修改(ff.c)如下:
static
FRESULT move_window (//文件系统索引信息加载函数
FATFS* fs, /* File system object */
DWORD sector /* Sector number to make appearance in the fs->win[] */
)
{
FRESULT res = FR_OK;
unsigned char flag;
unsigned short i;
char str[64];
if (sector != fs->winsect) { /* Window offset changed? */
#if !_FS_READONLY
res = sync_window(fs); /* Write-back changes */
#endif
if (res == FR_OK) { /* Fill sector window with new data */
if (disk_read(fs->drv, fs->win, sector, 1) != RES_OK) {
sector = 0xFFFFFFFF; /* Invalidate window if data is not reliable */
res = FR_DISK_ERR;
}
//--------校验---------------
flag=1;
for(i=0;i<512;i++)
{
if(fs->win[i]!=0xff)
{
flag=0;
break;
}
}
fs->winsect = sector;
if(flag==1)//整页都是0xff,则全写为0x00
{
printf("整页都是0xff,异常修复[%ld]\r\n",fs->winsect);
for(i=0;i<512;i++)fs->win[i]=0;
//W25QXX_Write(fs->win,(fs->winsect)*512,512);
}
}
}
return res;
}
版权声明:本文标题:STM32 FATFS文件系统之FAT12问题集锦 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1726057694a1053471.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论