ST意法半导体
直播中

敷衍作笑谈

10年用户 1023经验值
擅长:制造/封装 连接器 光电显示 接口/总线/驱动 RF/无线
私信 关注
[问答]

FATFS到f_mount()卡死怎么解决?

函数在使用f_mkfs初始化后,使用f_mount重新挂载时使用NULL取消挂载后,再重新挂载提示0x0C也就是无文件系统,调试进函数发现是在如下函数中返回了2导致的


static
BYTE check_fs (xa0 xa0 xa0 xa0 /* 0:Valid FAT-BS, 1:Valid BS but not FAT, 2:Not a BS, 3isk error */
xa0 xa0 xa0 xa0 FATFS* fs,xa0 xa0 xa0 xa0 /* File system object */
xa0 xa0 xa0 xa0 DWORD sectxa0 xa0 xa0 xa0 /* Sector# (lba) to check if it is an FAT boot record or not */
)
{
xa0 xa0 xa0 xa0 fs->wflag = 0; fs->winsect = 0xFFFFFFFF;xa0 xa0 xa0 xa0 /* Invaidate window */
xa0 xa0 xa0 xa0 if (move_window(fs, sect) != FR_OK)xa0 xa0 xa0 xa0 xa0 xa0 xa0 xa0 xa0 xa0 xa0 xa0 /* Load boot record */
xa0 xa0 xa0 xa0 xa0 xa0 xa0 xa0 return 3;

xa0 xa0 xa0 xa0 if (LD_WORD(&fs->win[BS_55AA]) != 0xAA55)xa0 xa0 xa0 xa0 /* Check boot record signature (always placed at offset 510 even if the sector size is >512) */
xa0 xa0 xa0 xa0 xa0 xa0 xa0 xa0 return 2;

xa0 xa0 xa0 xa0 if ((LD_DWORD(&fs->win[BS_FilSysType]) & 0xFFFFFF) == 0x544146)xa0 xa0 xa0 xa0 xa0 xa0 xa0 xa0 /* Check "FAT" string */
xa0 xa0 xa0 xa0 xa0 xa0 xa0 xa0 return 0;
xa0 xa0 xa0 xa0 if ((LD_DWORD(&fs->win[BS_FilSysType32]) & 0xFFFFFF) == 0x544146)xa0 xa0 xa0 xa0 /* Check "FAT" string */
xa0 xa0 xa0 xa0 xa0 xa0 xa0 xa0 return 0;

xa0 xa0 xa0 xa0 return 1;
}

而这个函数则是提示引导签名并不正确,求助。

回帖(2)

谢丹丹

2025-3-13 11:22:31
需要调用f_mkfs make一次,才能把FATFS的文件头写到memory。再check的时候才能正确。但前提是diskio里的驱动必须是正确的。
以下宏也要开启
define FF_USE_MKFS     1

扇区大小按照实际介质参数设置(FLASH一般是4k)
define FF_MIN_SS       4096 //512

define FF_MAX_SS       4096 //512
举报

凌晨3点睡

2025-3-17 17:40:32

在使用 FATFS 库时,f_mount() 卡死或返回错误码 0x0CFR_NO_FILESYSTEM,表示没有有效的文件系统)通常是由于以下原因之一:




  1. 文件系统未正确初始化



    • 在调用 f_mkfs() 格式化后,文件系统可能没有正确写入到存储设备中。

    • 确保 f_mkfs() 成功执行,并且没有返回错误。




  2. 存储设备问题



    • 存储设备可能存在问题,例如读写错误或坏块。

    • 检查存储设备的硬件连接和状态,确保其正常工作。




  3. 文件系统挂载参数错误



    • f_mount() 的挂载参数可能不正确,例如逻辑块地址(LBA)或分区号。

    • 确保 f_mount() 的参数与存储设备的实际配置一致。




  4. 文件系统损坏



    • 文件系统可能已损坏,导致无法识别。

    • 尝试重新格式化存储设备,并确保在格式化后立即挂载。




  5. FATFS 库版本问题



    • 使用的 FATFS 库版本可能存在 bug 或不兼容问题。

    • 尝试更新到最新版本的 FATFS 库。




调试建议




  1. 检查 f_mkfs() 的返回值



    • 确保 f_mkfs() 成功执行,返回值为 FR_OK(0)。




  2. 检查 f_mount() 的返回值



    • 如果 f_mount() 返回 FR_NO_FILESYSTEM,检查存储设备是否包含有效的文件系统。




  3. 调试 check_fs() 函数



    • check_fs() 函数中,检查 sect 参数是否正确,以及读取的扇区数据是否包含有效的 FAT 引导记录。




  4. 使用调试工具



    • 使用调试工具(如逻辑分析仪或调试器)检查存储设备的读写操作,确保数据正确写入和读取。




示例代码


以下是一个简单的示例,展示如何正确使用 f_mkfs()f_mount()


FATFS fs;
BYTE work[FF_MAX_SS]; /* Work area (larger is better for process time) */

/* Format the drive */
if (f_mkfs("", FM_FAT32, 0, work, sizeof(work)) == FR_OK) {
    printf("Format successful.n");
} else {
    printf("Format failed.n");
}

/* Unmount the drive */
f_mount(NULL, "", 0);

/* Mount the drive */
if (f_mount(&fs, "", 0) == FR_OK) {
    printf("Mount successful.n");
} else {
    printf("Mount failed.n");
}

总结


通过仔细检查文件系统的初始化、存储设备的状态以及 FATFS 库的使用方式,通常可以解决 f_mount() 卡死或返回 FR_NO_FILESYSTEM 的问题。如果问题仍然存在,建议进一步调试或尝试更新 FATFS 库。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分