移植需要的操作
移植最基础的 disk_status disk_initialize disk_read,现在先实现最简单的功能,disk_status 直接返回 0,disk_initialize 就 SD 卡的初始化,disk_read 就 SD 卡的读块
f_open 返回 FR_NO_FILESYSTEM 问题
一开始在移植完 SD 卡底层函数之后,发现 FatFs 在 f_open 的时候回返回 FR_NO_FILESYSTEM
具体报错在 f_open() -> mount_volume() -> find_volume() -> check_fs() 函数中,具体代码如下
if (ld_word(fs->win + BS_55AA) != 0xAA55) return 3;
这个部分的代码是为了验证 SD 卡是否是 FAT 的格式,在这个地方首先是检测 SD 卡的第一个块最后两个字节不是 0xAA55 ,这是一种签名值,为了验证扇区数据的有效性
通过抓取波形可以看出,SD 卡第一个扇区的数据是有效的
但是在读其他扇区的时候,全是 0,而且写了之后再重新读出来的也还是 0
最后找到了原因,就是上一章节说的,大容量存储卡是通过块寻址的,但是我一开始使用的是字节寻址,所以寻址错误,在纠正寻址错误后,文件系统工作正常
测试程序
FATFS FatFs; /* Work area (filesystem object) for logical drive */
int main (void)
{
FIL fil; /* File object */
FRESULT fr; /* FatFs return code */
UINT br = 0;
f_mount(&fs, "", 0);
fr = f_open(&fil, "test.txt", FA_READ);
if (fr) return (int)fr;
f_read(&fil, buf, buf_size, &br);
f_close(&fil);
return 0;
}
在 SD 卡中存放一个 test.txt 文件,运行这段程序,就会打印 test.txt 中的内容