sd卡spi驱动(3)--FatFs移植

移植需要的操作

移植最基础的 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 卡第一个扇区的数据是有效的
sd卡spi驱动(3)--FatFs移植_第1张图片

但是在读其他扇区的时候,全是 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 中的内容

你可能感兴趣的:(sd卡spi驱动(3)--FatFs移植)