最近在学习以及总结FATFS文件系统的过程中遇到了一个问题,利用f_mount
函数将文件系统进行挂载的时候,返回FR_DISK_ERR。跟进去返回值如图所示。
/* 文件操作返回值(FRESULT)*/
typedef enum {
FR_OK = 0, /* (0) 操作成功 */
FR_DISK_ERR, /* (1) 在底层磁盘I/O层发生了严重错误 */
FR_INT_ERR, /* (2) 断言失败 */
FR_NOT_READY, /* (3) 物理驱动器无法工作 */
FR_NO_FILE, /* (4) 未找到文件 */
FR_NO_PATH, /* (5) 未找到路径 */
FR_INVALID_NAME, /* (6) 路径名格式无效 */
FR_DENIED, /* (7) 访问被拒绝,可能是由于禁止访问或目录已满 */
FR_EXIST, /* (8) 访问被拒绝,可能是由于禁止访问 */
FR_INVALID_OBJECT, /* (9) 文件/目录对象无效 */
FR_WRITE_PROTECTED, /* (10) 物理驱动器写保护 */
FR_INVALID_DRIVE, /* (11) 逻辑驱动器号无效 */
FR_NOT_ENABLED, /* (12) 卷没有工作区 */
FR_NO_FILESYSTEM, /* (13) 不存在有效的FAT卷 */
FR_MKFS_ABORTED, /* (14) f_mkfs()由于任何参数错误而中止 */
FR_TIMEOUT, /* (15) 无法在规定的时间内获得访问卷的许可 */
FR_LOCKED, /* (16) 根据文件共享策略拒绝操作 */
FR_NOT_ENOUGH_CORE, /* (17) 无法分配LFN工作缓冲区 */
FR_TOO_MANY_OPEN_FILES, /* (18) 打开的文件数> _FS_LOCK */
FR_INVALID_PARAMETER /* (19) 给定的参数无效 */
} FRESULT;
输出FR_DISK_ERR的原因根据枚类型可以看出是在底层磁盘I/O层发生了严重错误。
从f_mount函数跟进去到get_ldnumber(&rp),再跟进去,发现是
在指定的逻辑驱动器上查找并初始化文件系统对象的时候发生了错误。
与上面错误类型一致 都是在磁盘 I/O 层发生错误" 意味着在与磁盘输入/输出相关的操作中发生了问题或错误。在文件系统和存储设备的上下文中,磁盘 I/O 层通常涉及从物理存储介质(如硬盘、闪存或SD卡)读取或写入数据。
在编写文件系统或磁盘访问功能时,磁盘 I/O 层的错误可能由多种原因引起,包括:
硬件问题: 与物理存储设备有关的问题,例如磁盘驱动器故障或连接故障。
介质问题: 存储介质的问题,例如硬盘上的坏道或存储卡上的损坏。
文件系统损坏: 磁盘上文件系统结构的损坏,导致读取或解释数据时出现困难。
访问违规: 在没有必要的权限或违反存储协议的情况下尝试对磁盘执行操作。
通信错误: 软件(应用程序或文件系统)与硬件之间的通信问题。
对硬件、介质等进行检查都没问提,接下来对指定的逻辑驱动器上初始化文件系统的函数进行检查
DSTATUS disk_initialize (
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{
uint16_t i;
DSTATUS stat;
// int result;
switch (pdrv) {
case SD_CARD :
// result = ATA_disk_initialize();
// translate the reslut code here
return stat;
case SPI_FLASH :
SPI_FLASH_Init();
/* 如果不确定flash是否为低功耗模式 此处可以加一句唤醒 */
SPI_Flash_WAKEUP();
return disk_status(SPI_FLASH);
}
return STA_NOINIT;
}
只有简单的几句,IO问题的话,应该是flash初始化的问题。
//在外部SPI Flash挂载文件系统,文件系统挂载时会对SPI设备初始化
//初始化函数调用流程如下
//f_mount()->find_volume()->disk_initialize->SPI_FLASH_Init()
放在main函数中,打印success,按道理初始化应该正常。
试了很多方法,都没找到问题,偶然看到这样一段话:
通常情况下,在初始化后,可以立即读取设备的ID。设备ID通常是设备的一部分,用于标识设备型号或制造商信息。读取设备ID的操作通常是一个简单的查询,不涉及对设备状态的修改。
然而,具体取决于你使用的设备和初始化过程。在某些情况下,设备可能需要一些时间来完成初始化并准备好响应读取ID的命令。这种情况通常在设备规格或数据手册中有详细说明。如果有需要等待一段时间,你可能需要在初始化后等待一小段时间再尝试读取ID。
总体而言,如果设备规格或文档没有明确说明需要等待的时间,你可以尝试在初始化后立即读取ID,并查看是否能够成功获取正确的设备ID。
尝试加上了一个小延迟
问题成功解决!!!
但是我在手册中也没看到说要延迟啊~
果然科学的尽头是玄学,有没有懂得小伙伴可以给个解释呢?