admin管理员组

文章数量:1530262

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

本文标签: 文件系统集锦Fatfs