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.

[参考译文] CC3235S:未对齐的 SD 卡命令失败

Guru**** 2539500 points
Other Parts Discussed in Thread: CC3235S, BOOSTXL-SHARP128, CC3200

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1009350/cc3235s-unaligned-sd-card-commands-fail

器件型号:CC3235S
主题中讨论的其他器件: BOOSTXL-SHARP128CC3200

我们有一个定制板、其中包含通过 GPIO 连接的 SD 卡 CC3235S。
在 SD 卡通信中、我们面临一个严重问题、其中一些命令(写入)会冻结(从不返回) SD 卡或返回 SD_STATUS_ERROR。
我们已将错误跟踪到 SDHostCC32XX.c 中的 SDHostCC32XX_WRITE 实现:如果缓冲区未按字对齐、则调用会失败(否则会出现第716行中的"if (!(((((uint_fast32_t) buf)& 0x03))"条件)。 我们正在使用 FreeRTOS 和4.x Simplelink SDK (甚至尝试过5.x、但没有成功)。

我们已经通过使用直接 SD 访问排除了 FatFS 问题。 我们还尝试了 SD 卡的多种不同尺寸和品牌、但没有成功。 遗憾的是、我们手头没有用于 Launchpad 的具有 SD 插槽的 Booster Pack、无法在我们的定制板之外的平台上重现问题。

我们提供了一个最小测试用例(请参阅随附的文件)来重现问题。 请您查看并帮助我们隔离并解决此问题吗? 我们非常感谢您的任何帮助。

e2e.ti.com/.../sdcard-issue.zip

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

    您好!

    您提到的字对齐检查是 CC32xx 器件的 DMA 外设的一项要求、它要求字对齐访问。 但是、即使 写入不是字对齐、否则{}情况仍应执行写入。 因此、在您的测试中、未对齐的 SD 卡命令是否在未使用 DMA 的情况下失败? 字对齐写入是否失败?

    此外、为了澄清错误是否始终如一地重现、或者在遇到错误之前是否需要几次尝试?

    我可以使用 BOOSTXL-SHARP128来测试您的代码、很快就会这样做、但知道运行代码时会有什么用处。

    此致、

    Michael

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

    您好!

    [引用 userid="300198" URL"~/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1009350/cc3235s-unaligned-sd-card-commands-fail/3730537 #3730537"]因此,在测试中,未对齐的 SD 卡命令是否在未使用 DMA 的情况下失败?

    是的。

    [引用 userid="300198" URL"~/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1009350/cc3235s-unaligned-sd-card-commands-fail/3730537 #3730537"]字对齐写入是否失败?

    我还没有看到通过 DMA 进行字对齐写入时发生崩溃、尽管它们可能是罕见的、完全是巧合。

    [引用 userid="300198" URL"~/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1009350/cc3235s-unaligned-sd-card-commands-fail/3730537 #3730537"]

    此外、为了澄清错误是否始终如一地重现、或者在遇到错误之前是否需要几次尝试?

    [/报价]

    是的、随附的测试用例每次都在多个定制板上中断。

    [引用 userid="300198" URL"~/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1009350/cc3235s-unaligned-sd-card-commands-fail/3730537 #3730537"]我有 BOOSTXL-SHARP128可用于测试您的代码,很快就会执行此操作,但知道运行代码时的预期结果将会很有帮助。[/quote

    这将非常有帮助、谢谢。

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

    您好!

    感谢您关注您的信息。 在我使用硬件重现您的问题时、我会记住这一点。

    此致、

    Michael

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

    您好!

    我们最终获得了 Booster Pack、并且也能够再现问题。 因此、我们非常确信 这是 Simplelink SDK 中的一个错误、而不是我们的硬件问题。 我们使用了 sDraw 示例(drivers/sDraw /)来重现此错误:

    在 sDraw 示例中添加以下代码(甚至是我最初作为测试代码添加的简化版本):

    static void sdcard_test(Display_Handle display, SD_Handle sdcard_handle)
    {
        int result;
        uint32_t n_sectors, sector_size;
    
        n_sectors = SD_getNumSectors(sdcard_handle);
        sector_size = SD_getSectorSize(sdcard_handle);
    
        Display_printf(display, 0, 0, "n_sectors=%lu, sector_size=%lu\n", n_sectors, sector_size);
    
        uint8_t buffer[513] = { 0 };
    
        // Aligned buffer -> OK
        result = SD_write(sdcard_handle, buffer, 0, 1);
        Display_printf(display, 0, 0, "Aligned write: %d\n", result);
    
        // Misaligned buffer -> crash
        result = SD_write(sdcard_handle, buffer+1, 0, 1);
        if(result != SD_STATUS_SUCCESS) {
            Display_printf(display, 0, 0, "Failed to write to SD card, error=%d\n", result);
        } else {
            Display_printf(display, 0, 0, "done\n");
        }
    }

    并将其称为  sdcard_test (display、sdHandle);就在 spla.c 中的"Display capacity information"块之后、在带 Booster Pack 的 Lanchpad 上执行:对齐的写入始终成功(前提是地址实际对齐)、未对齐的写入失败。

    请注意、上述测试代码失败后、示例的其余代码通常不起作用。

    有趣 的是、我们观察到两种不同的故障行为:有时呼叫会永远挂起、而其他时候(~10秒后)我们最终得到了 SD_STATUS_ERROR 响应。

    您能否确认硬件上的问题? 我们非常感谢您在解决此问题方面提供的任何帮助。

    谢谢!

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

    您好!

    感谢您使用 sharp128 BoosterPack 执行这些测试。

    我目前在 SD 卡设置方面遇到一些设置问题、因此无法立即测试您的代码。

    如果您怀疑 SimpleLink SDK 可能是导致错误的根本原因、您可能可以尝试使用 CC3200 SDK 中的原始 SDhost 示例。 该 SDK 是在 SimpleLink SDK 之前编写的、因此我们可以看到它是否会改变您看到的行为。

    https://www.ti.com/tool/CC3200SDK

    安装后、导入并构建 sdhost 示例。 这是一个非常基本的 SD 访问示例、您可以使用它进行测试。 注意事项:

    1.检查 pinmux.c 以确保您的引脚配置与您在 CC3235示例中使用的配置相同。 默认情况下、它们应该相同。

    不能直接刷写生成的二进制文件。 相反、您需要使用调试器手动将生成的.out 加载到 CC3235。 您可以这样做:

    1.使用 View->Target Configurations 打开目标配置窗格、然后导航到您的 CC3235项目之一、右键单击并单击"Launch Selected Configuration"。 您应该会看到调试视图启动、但没有加载任何二进制文件。

    2.使用 Run->Connect Target 获取调试器使用 JTAG 连接到 CC3235。 然后,使用 Run->Load->Load Program 打开二进制加载菜单。 从此处单击 Browse project、转至 CC3200 sdhost 示例、然后选择 built sdhost.out

    从此处单击确定、它会将 CC3200二进制文件加载到您的 CC3235。 然后、您可以照常单击 Resume 按钮来运行程序。 由于 CC3200和 CC3235共享相同的 ARM Cortex M4内核和硬件外设、因此运行时不会出现任何兼容性问题。

    请告诉我 sdhost 示例是否适用于未对齐的写入、或者您是否遇到相同的问题。

    此致、

    Michael