使用带有TI Starterware的FatF写入SD卡导致的损坏

时间:2015-11-28 15:27:39

标签: embedded sysbios

我的测试代码以SD卡上的大型现有文件test.dat开头,测试执行此操作:

f_open(&fp, "test.dat", FA_OPEN_ALWAYS|FA_READ|FA_WRITE);
f_write(&fp, bufferOfZeros, 4096, &ioBytes);

似乎直截了当。

f_write的结果是SD卡损坏。

我已在我的嵌入式设备上跟踪EDMA以观看FatFs读/写请求。 f_open读取请求都是健康的,它们可以正确找到文件和FAT表。

f_write首先将第一个扇区读入暂存缓冲区,非常好。然后它将零填充到暂存缓冲区中,非常棒。在memcpy为512个零之后,它需要提交扇区并移动到下一个扇区。

此时代码混淆了。它将零的临时缓冲区写入FAT表!!

ff.c / f_write()中的违规代码是:

        if (fp->flag & FA__DIRTY) {     /* Write-back sector cache */
            if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK)
                ABORT(fp->fs, FR_DISK_ERR);
            fp->flag &= ~FA__DIRTY;

这里,fp-> buf是零的扇区缓冲区,但是fp-> dsect是FAT扇区(8318),而不是文件数据扇区(10240)!哎呀。在disk_write()fp-> buf匹配fp-> sect。

这似乎是一个基本用例,我很震惊地看到这一点。

我希望世界上有人有任何人在使用FatF之前解决过这样的问题吗?

1 个答案:

答案 0 :(得分:1)

Clifford是正确的 - 这是我的问题,我知道这样一个简单的用例必须有效。

我把测试改为

f_open(&fp, "test.dat", FA_OPEN_ALWAYS|FA_READ|FA_WRITE);
f_write(&fp, pattern, 512, &ioBytes);
f_lseek(&fp, 0);
f_read(&fp, zeroedBuffer, 512, &ioBytes);

这揭示了一个缓存问题。 f_read操作成功,DMA完成正常,但是zeroedBuffer保持不变,因为L0没有被刷新。因此,FatFs看到了正确值和陈旧值的混合。我修复了EDMA缓存,现在一切正常。

另一项学习,TI Starterware附带R0.4b。我从那开始,它返回了令人困惑的FR_RW_ERROR。我向上移动到R0.11a并获得了更好的错误反馈。

有人知道FatFs的单元测试吗?