STM32 FATFS文件系统之FAT12问题集锦

问题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;
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值