在使用FatFS时,f_open返回FR_NO_FILESYSTEM,经调试发现未能正确读取第一扇区内容
时间:10-02
整理:3721RD
点击:
在单步调试时,找到错误位置首先,进入f_open,在f_open中有find_volume函数,在这个函数中,从0扇区读取fat所占扇区大小、每个扇区字节数、fat个数、根目录位置等有关信息,并且如果该函数返回值不是FR_OK,将直接退出f_open函数;
进入find_volume函数,在find_volume函数中有这样一行代码:
fmt = check_f( fs, bsect );并且根据返回值,也就是fmt的值,来确定是否为fat文件系统;
然后进入check_fs函数,发现先进行move_window操作,然后判断结尾是否为0XAA55,开头的跳转指令是否是0XEB 0X** 0X90,然后判断是否找到FAT或是FAT3字样;
在move_window函数中,主要实现了fs->win[]中的数据回写,然后重新读取指定扇区的内容,结果,问题就出来这里,在读取0扇区的内容时,读取的内容错误,因此就导致了在check_fs函数中判断扇区结尾是否是0XAA55时,发生了错误,反回了3,然后在find_volume函数中,判断fmt时,返回了FR_NO_FILESYSTEM;
但是,在单独调用disk_read函数时,并没有出现数据错误的问题,并且和win_hex中查看的数据相同;
很不理解问题出现的可能原因是什么?
进入find_volume函数,在find_volume函数中有这样一行代码:
fmt = check_f( fs, bsect );并且根据返回值,也就是fmt的值,来确定是否为fat文件系统;
然后进入check_fs函数,发现先进行move_window操作,然后判断结尾是否为0XAA55,开头的跳转指令是否是0XEB 0X** 0X90,然后判断是否找到FAT或是FAT3字样;
在move_window函数中,主要实现了fs->win[]中的数据回写,然后重新读取指定扇区的内容,结果,问题就出来这里,在读取0扇区的内容时,读取的内容错误,因此就导致了在check_fs函数中判断扇区结尾是否是0XAA55时,发生了错误,反回了3,然后在find_volume函数中,判断fmt时,返回了FR_NO_FILESYSTEM;
但是,在单独调用disk_read函数时,并没有出现数据错误的问题,并且和win_hex中查看的数据相同;
很不理解问题出现的可能原因是什么?
不会添加图片
f_open
find_volume
check_fs
move_window
同样的问题,小编解决了吗