fatfs 两个文件_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 卡第一个扇区的数据是有效的

4cdd1402577cded63bcbcfacc89f0d80.png

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值