This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294NCPDT:无法将较大的文件写入 SD 卡

Guru**** 2322270 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/586835/tm4c1294ncpdt-failed-to-write-larger-files-onto-sd-card

器件型号:TM4C1294NCPDT

大家好、

我用一个小示例来验证我的应用程序中的 FatFS。 环境如下所示:

  • FreeRTOS 7.x
  • FatFs
  • 具有 FAT32文件系统的 SD 卡,512字节分配大小
  • 通过 SPI 访问 SD 卡
  • 这两个器件都来自 TI 提供的 TivaWare

以下是示例代码,就在 main()后面:

静态 uint32_t dument[512];
静态库::存储("test"、fa_create_always | fa_write);

for (uint32_t cycle = 0;cycle < 40000;++cycle){
for (uint32_t index = 0;index < 512;++index){
dummy[index]= index;
}

(reinterpret_storage) (虚拟),2048)=0){
中断;
}
storage.close()

; 

Storage 类是包含 FatFS API 的精简包装程序、因此您可以假设 API 调用直接就位。

我的问题是、如果"虚拟"与 SD 卡的分配大小相等(甚至更小)、但在上面的情况下、我从 ff.c 中的 remove_chain ()中得到了"FR_INT_ERR":

while (clst < fs->n_fatent){/*不是最后一个链接? //
nxt = get_fat (fs、clst);//获取群集状态*/
if (nxt ==0) break;//空群集? //
if (nxt ==1){res = FR_INT_ERR;break;}//内部错误? //
if (nxt == 0xFFFFFFFF){res = FR_DISK_ERR;break;}//磁盘错误? * 

有人能帮我、我出了什么错?

此致、

Norbert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您是否尝试覆盖每次写入的内容? 在每个周期循环中、您不想将写入指针提前到下一个2kB 块?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    否 内部循环仅填充虚拟数据的容器、然后我想存储到 SD 卡中。 外部循环打算创建一个80 MB 的文件。

    此致、
    Norbert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Nobert:

      storage.write()是否会在每次2k 写入结束时将写入指针递增2k。 我想在每次2k 写入后使用 f_lseek()来推进指针。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    正如我想指出的那样,这个写入方法只是一个包装程序,它直接调用 FatFS API 的 f_write()方法。 在每次 f_write()调用后,我是否也调用 f_lseek()?

    此致、
    Norbert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     这是我的理解。 请参阅以下说明。

    f_lseek

    f_lseek 函数移动打开文件对象的文件读取/写入指针。 它还可用于扩展文件大小(群集预分配)。

    说明

    打开文件对象中的文件读/写应答器指向下一个读/写操作要读取/写入的数据字节。 它作为读取/写入的字节数前进。  f_lseek 函数在不对文件执行任何读/写操作的情况下移动文件读取/写入指针。

    在此处查看详细信息。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    在写入期间无需 f_lseek 来移动文件指针。 它已自动执行读/写操作。

    不过,问题似乎已得到解决。 此外、我尝试总结我所做的事情。

    • 我在 Windows 上使用了"simple" disk -> properties -> format 工具在 SD 卡上创建分区、这会留下一些未分配的空间。 我使用 gparted 格式化 SD 卡
    • 我的 FatFS 配置使用512 B 作为_MAX_SS、因此它似乎也是文件系统的正确选择
    • LFN 支持已关闭
    • CODA 页面支持已设置为1 (ASCII 代码页)

    我的项目涉及更多任务、因此我没有时间发现和验证、这是解决我的问题的最小步骤、但我希望、它可以在将来帮助别人。

    此致、

    Norbert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴您的问题得到了解决、您提供了一些提示。