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.

[参考译文] CC3220SF:使用 SimpleLink 7.10的 SDHostSetExpClk ()无限循环(使用 SimpleLink 3.40不是问题)

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1359256/cc3220sf-sdhostsetexpclk-infinite-loop-using-simplelink-7-10-not-a-problem-using-simplelink-3-40

器件型号:CC3220SF
主题中讨论的其他器件: SysConfig

大家好、我们有一个基于 CC3220SF IC 的相当成熟的硬件和固件平台。 该硬件和固件平台自2020年起基本保持稳定、可运行在 SimpleLink CC32XX SDK 3.40上开发的基于 TI-RTOS 的应用。 今年、我已经使用 TI-RTOS7和 TIClang 将我们的固件升级到 SimpleLink CC32XX SDK 7.10。 大多数情况下、一切都很好。 但是、我看到在各种任务中存在一个零星但一致的问题、我们在这些任务中调用了 SD_open (CONFIG_SD_0、NULL)。 我们有六个调用 sd_open (...)的读取/写入/初始化任务 由于各种原因、当 sd_open(...)时、这些任务中的任何一个都可能会挂起 调用会触发以下无限循环故障、我需要帮助来解决。

这是一种零星但通常重复的模式、这种模式会导致 sdhost.c 中的无限循环、行647和设备的硬锁定:

,例如:

72 SDHandle = SD_open (CONFIG_SD_0、NULL);

SDHostCC32XX_open ()位于 SDHostCC32XX.c:550 0x0101D062:

549 /*保存 clkPin 停止状态;在 LPDS 期间设置为逻辑"0"*/
550 pin = PinConfigPin (hwAttrs->clkPin);

initHw ()位于 SDHostCC32XX.c:1127 0x0101A472:

1119 /*
1120 *将卡时钟配置为400kHz、以进行卡初始化以及
1121 *验证过程。 这样做是为了确保与
1122 *旧版 SD 卡。 完成此操作后、卡时钟将为
1123 *重新配置为设置的操作值。
1124 */
1125 MAP_SDHostSetExpClk (hwAttrs->baseAddr、MAP_PRCMPeripheralClockGet (PRCM_SDHOST)、SD_ID_FREQ_400KHZ);
1126
1127 MAP_SDHostIntClear (hwAttrs->baseAddr、
1128 SDHOST_INT_CC | SDHOST_INT_TC | DATAERROR | CMDERROR | SDHOST_INT_DMWR | SDHOST_INT_DMARD |
1129 SDHOST_INT_BRR | SDHOST_INT_BWR);

SDHostSetExpClk ()位于 sdhost.c:647 0x102048D0:

647 while (! (HWREG (ulBase + MMCHS_O_SYSCTL)& 0x2)
648{
649
650}

我已经在 E2E  中搜索了这个问题的可能解决方案(即、Google 中的网址:e2e.ti.com SDHostSetExpClk)、但之前报告的三个问题都没有为我提供解决这个问题的有用提示。

有关此问题的一些附加信息:

a)我们切勿取出或插入 uSD 卡;
b)我们不使用 SDFatFS,只是打开 uSD 卡进行二进制数据读写;
c)在启用或关闭 NWP 时出现问题;
d)无论电源策略是启用还是禁用,都会出现此问题;
e)发生这种情况时、我可以确认器件持续处于电源策略禁用模式、因此与其他人报告的 LPDS 或休眠问题无关;
f)有人建议添加 PRCMMCUReset (X)、但我看不出如果我们在电源策略持续禁用的情况下运行时仍然遇到此问题、它有何相关性;
g)我们只使用 Samsung USD 卡,无论是 Samsung 64 GB (MB_ME64GA/AM)还是 Samsung 128 GB (MB_ME128GA/AM);使用任一 USD 容量时出现问题
h)我们使用 SysConfig 在 SimpleLink 7.10内部版本中配置 CC3220SF、而 CC3220SF 是使用静态编码文件在 SimpleLink 3.40内部版本中配置的

作为参考、在 SysConfig 中、在 SimpleLink 7.10下按如下方式配置了 SD、使用与我们在基于 SimpleLink 3.40的固件中使用的配置相同的设置:

配置 SD_0
名称:CONFIG_SD_0
使用 FatFS:未选中
时钟速率:8000000
接口类型:SD 主机
SD 实现:(灰显) SDHostCC32XX
中断优先级:1 -最高优先级

引脚多路复用:
SD 主机外设:SDHost0
CLK 引脚:GP16/7
CMD 引脚:GP17/8
数据引脚:GP15/6
DMA TX:任意(uDMA_CH15)
DMA RX:任意(uDMA_CH14)

其他依赖项:

DMA 片上 DMA 资源分配
DMA 执行:(灰显) UDMACC32xx
DMA 错误函数:dmaErrorFxn
中断优先级:1 -最高优先级

功率驱动器
电源实施:(灰显) PowerCC32XX
启用策略:未选中
策略函数:PowerCC32XX_SleepPolicy
策略初始化函数:PowerCC32XX_initPolicy
输入 LPDS 挂钩函数:
恢复 LPDS 挂钩函数:
启用网络唤醒 LPDS:已选中
在 LPDS 期间保持调试处于活动状态:未选中
启用 GPIO 唤醒 LPDS:未选中
启用 GPIO 唤醒关断:已检查
唤醒 GPIO 源关闭:GPIO4
唤醒 GPIO 类型关断:LOW_LEVEL
RAM 保持屏蔽 LPDS:SRAM_COL_1、SRAM_COL_2 +2
LPDS 的延迟:20000
IO 保持关断:GRP_1

停止引脚引脚停止状态(仅限相关状态)
引脚6:WEAK PULL_DOWN_STD
引脚7:WEAK PULL_DOWN_STD
引脚8:WEAK PULL_DOWN_STD

有没有任何线索表明、当我们在使用基于 SDK 3.40和 TI-RTOS 的固件的情况下使用很多器件(相同的 PCB 版本、相同的 CC3220SF IC、相同的 Samsung USD 卡)时、这种情况会在 SimpleLink 7.10下突然发生。

这是我们解决问题的一个示例、因为它会反复发生、在各种工作模式下硬锁定器件、最显著的是在采样模式下、当我们需要对各种传感器数据进行完美保真度时。 看门狗恢复不是一个实用的解决方案、因为它会给我们的最终用户带来不可接受的用户体验、在用户无法访问设备的情况下(例如水下和野外环境)、样本数据经常中断、而且部署成本非常高。 最后、我们无法轻松回到使用基于 SimpleLink 3.40的固件、因为我们已经进行了大量依赖于 SimpleLink 7.10 SDK 的其他固件更新(例如、MQTT 和 AWS 支持)、所有这些更新都能够很好地工作。 只有 SimpleLink 7.10下的 SDHost 存在问题。

谢谢。
戴夫

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

     我不知道类似的问题或修复。 因为司机太老了,所以帮助不是很容易。

    这 可能与 sys config 实现相关-请比较 3.40和7.10中的驱动程序初始化。  

    您是否在线程安全(例如受互斥体保护)上下文中使用了 SK_OPEN?

    可能7.10上的另一个时序 会导致某种竞态条件。

    您能否提供一个简单的项目 以便 我们尝试重现此示例(在 TI Launchpad 上)?

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

    你好 Kobi,谢谢你的答复。 我已附加一个 zip 工程 sdraw_CC3220sf_tirtos7_ticlang、其中的 for 循环可重复读取/写入/擦除操作千次。  在使用此 基于 SL7.10并添加了 for-loop 的 sdraw 工程时、我遇到了上述相同的问题。  

    仅供参考、 从 SL3.40迁移到 SL7.10 主要涉及将基于 SL3.40的源代码(最初基于 SL3.40的 out_of_box_CC3220SF)移动到 mqtt_client_over_TLS_1_3_CC3220SF_LAUNCHXL_tirtos7_ticlang 的空洞版本。 但是、sdraw_CC3220sf_tirtos7_ticlang 工程出现了与上述相同的问题、这意味着更大的问题、该问题并非特定于我们的应用程序源代码中的问题、而是更大的 SL7.10问题。  

    请参考使用 sd_open (...)的所有任务 SD_Close (...) 源代码中的逻辑总是在线程安全上下文中发生、通常使用 Semaphore_pend (sdActionSemHandle、BIOS_wait_forever)、在某些情况下还使用 Mailbox_pend (mbxHandle、BIOS_wait_forever)引入数据。 当其他线程请求与 SD 相关的操作时、它们通常具有一个 Semaphore_pend (sdActionCompleteSemHandle、BWF)、该值会暂停线程的操作、直到与 SD 相关的任务发出成功完成信标发布的信号。 无论我们是否使用该 SD 完整 SEM POST 逻辑、我们在使用 SL7.10时都会遇到问题。 由于附加的抽吸项目发生了这种情况、因此 这可能是一个 互斥量 /线程安全问题。

    我已将 SysConfig SD 配置与我们的 SL3.40配置进行了比较、并将这些配置完美地匹配在一起。 唯一的区别是中断优先级、该优先级现在与 SL3.40配置完全匹配。 我还将所有 SysConfig 中断优先级设置为最低、因为它们在我们基于 SL3.40的应用中、但这无法解决问题。

    您可能有的其他想法是最受欢迎的。 我担心、SL7.10中的某个器件可能会加剧一些潜在的硬件问题、而在 SL3.40中不存在该问题、但我看不到它可能是什么。

    谢谢。
    戴夫

    e2e.ti.com/.../sdraw_5F00_CC3220SF_5F00_LAUNCHXL_5F00_tirtos7_5F00_ticlang.zip

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

    我将尝试用您的代码再现。 我会让你知道我是否可以重现以及我们是否有任何修复。

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

    尊敬的 Kobi:

    有任何来自您身边的更新吗?

    最后、我们尝试了大量新事物、旨在测试可能的解决方案并排除可能的问题:

    1.我们安装了其他版本的 TI 驱动程序示例抽奖应用程序、包括:

    a. sdraw_CC3220SF_LAUNCHXL_tirtos7_ticlang、SL7.10 (附在上面;用于排除我们的应用)=与上文报告的问题相同

    b. sdraw_CC3220SF_LAUNCHXL_nortos_ticlang、SL7.10 (TIRTOS7 rule-out)=与上面报告的问题相同

    c. sdraw_CC3220SF_LAUNCHXL_tirtos_ccs、SL6.10.00.05 (SL7.10规则退出)和 TIRTOS7规则退出)=与上面报告的问题相同

    2.我们对硬件进行了多个 PCB 版本的测试,包括:

    a.连接到 micro-SD 分线板(PCB 修订版1.0器件的原型)并运行1 (a)的 CC3220SF LaunchPad =与上述问题相同

    b.运行上述1 (a)的 PCB 修订版1.0电路板=与上述报告的问题相同

    C.运行上述1 (a)的 PCB 修订版2.0电路板=与上述报告的问题相同

    d.运行上述1 (a)的 PCB 修订版2.2电路板=与上述报告的问题相同

    e.使用运行上述1 (a)的 CC3220SF 的新录音 PCB 修订版=与上述问题相同


    3.我们已经尝试了电池供电的设备以及台式供电的设备=和上面提到的一样的问题

    4、为了获得额外的规定、我还在 MacBook Pro 上使用 CCS 运行了1 (a)、(排除在上述所有测试中使用的 Dell XPS9530)=与上述报告的问题相同

    5.我没有排除的问题是,一些灵敏度的32GB, 64GB, 128GB 三星 USD 卡与 SL6.10+我们在上面的测试中使用的

    6.运行我们的原始应用程序(即 TI-RTOS 和适用于 CC32XX 的 SimpleLink SDK 3.40)时仍然没有问题。

    7.我已在有问题的 sdhost.c 代码部分之前和中间添加一些 usleep 延迟并进行了测试、但这样做并没有解决问题。 下一步是修改上述 sdhost.c 代码部分、如果"等待时钟稳定"循环连续出现10次故障、就可以使用两个嵌套循环引入带有时钟线复位的更智能的回退。  

    如果您有任何其他和/或更好的想法、我非常感谢您提供宝贵意见。

    谢谢。

    戴夫

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

    抱歉、我还没有看到这个。 可能在下周。

    是什么阻止您使用 SDK 3.40?

    您只能从7.10更新 SP 和主机驱动程序。

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

    我们 新推出的 以云为中心   的产品使用了 SDK 7.10的网络、OTA、 MQTT 和 HTTP 服务器实施。  SDK 7.10以云为中心的网络功能从 SDK 7.10的 mqtt_client_tls_1_3_tirtos7_ticlang 建模。 所有这些网络相关的 东西都很好,我为 AWS 支持添加的东西也很有效。 所有这些都可以正常工作后、我来回探索了如何处理写入 SD 卡的二进制数据的基于时间的索引、这样我们就可以从任何设备发出基于云的数据请求。 当 我开始对 传感器数据的一秒 SD 写入进行压力测试和批量读取记录数据以 流式传输到 AWS 后、这个 SD_open 错误揭示了它是一 个问题。 在我预计从 SDK 3.40升级到 SDK 7.10时会遇到的所有问题中,SD 主机功能的丧失并不是其中的一个。 尝试 将所有 这些 以云为中心的功能和网络功能向后集成 到 SDK 3.40似乎是一个不好的想法。

    所有待测试的硬件设备均已使用 SDK 7.10的最新 SP 进行了刷写、并且正在使用 SDK 7.10主机驱动程序。 我所做的抽奖 SDK 6.10测试是在单独的电路板上进行的一次性测试;我 在测试代码之前使用 SL6.10的 SP 对一次性电路板进行了解密。

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

    我认为 将示例移植回3.40可能会更容易一些(至少我会帮助这么做)。

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

    尊敬的 Kobi:

    附件为适用于 TI-RTOS 和 CCS 的 SimpleLink CC3220SF SDK 3.40 sdraw 工程的.zip 文件。  我已添加循环来执行写入/读取/比较/擦除操作的1000次非延迟迭代、与上面附上的 SDK 7.10 TIRTOS7 ticang 的 sdraw 示例完全相同。

    此处关联的 SDK 3.40项目始终运行至完成、重复完成全部1000次迭代、而不会出现任何类型的 usleep/sleep。 需要 UtilsDelay。 这与我们在使用 SDK 3.40并在一系列不同 PCB 版本上运行的旧版应用中观察到的行为一致。 我们已 通过 WiFi 成功通过这些设备传输数小时的数据、我相信在 TI-RTOS 环境中、SDK 3.40版本的 SDHOST 是可靠的。

    以下是所连接项目的最后几行输出、因为它成功完成了全部1000次迭代:

    --  


    SD_Close 完成。

    环路1000上的 SD_OPEN 完成。

    SD 卡上总共有125042688个扇区。

    读取/写入扇区大小为512字节

    卡总容量为62521344 KB

    正在写入阵列...

    正在读取阵列...

    从 SD 卡读取的数据符合预期值

    SD_Close 完成。

    --

    对于此 SDK 3.40工程、您可能需要将对终端的依赖性更新为适用于 SimpleLink CC32XX SDK 3.40的 tirtos_builds_CC3220SF_LAUNCHXL_release_ccs 工程的任何版本。 如果您没有此实用工具的版本、请告诉我、我可以在此处上传我的构建的.zip 文件。

    通过上面附加的基于 SL7.10的示例,我 永远无法  在 sd_open (...)之前完成超过60-70次的循环迭代 被调用并且 sdhost.c 在 sdhost.c:647 ("等待时钟稳定"无限循环条件)的 SDHostSetExpClk ()处卡在无限循环中。

    有趣的是、在 SL7.10示例中、如果我在迭代循环中的 SD_Close 之后插入一个 SLEEP (1)、则问题就不那么糟糕。 但是、将该   损耗减半需要 usSleep (500000)、会导致上述在60-70次迭代内出现常见的无限循环故障。 不知道为什么睡眠(1)比 usleep(500000)更有利,但可能有一些比赛条件发生在引擎盖下和一秒是足够的时间 避免比赛条件?  

    SDHOSTCC32XX.c 和 SDHOST.c 文件中的进一步更新 sdraw 项目:我还尝试了修改 SDHostCC32XX.c 和 sdhost.c 文件中  的代码来创建一系列重试循环、例如、让等待 PRCM 时钟到稳定循环10次重试尝试、在10次迭代循环中嵌套重试、在进入时钟稳定循环之前重置时钟、以及在循环中嵌套所有这些重试均已失败。 这是300咬苹果。 坏消息是这一切都不能修复 SDK7.10中 sdhost.c:647中的无限循环。

    谢谢。
    戴夫

    e2e.ti.com/.../sdraw_5F00_CC3220SF_5F00_SDK3.40_5F00_tirtos_5F00_ccs.zip

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

    好的。 我来试一下。

    请注意、即使我能够重现此问题、我也可能会 将 其报告给我们的驾驶员团队(因为它看起来不是一个简单的解决方法)。

    我希望他们不会快速响应。   

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

    好的、感谢更新。 我有各种各样的其他 SD 卡到达明天,并将测试看看这是不是一些奇怪的交互与三星 SD 卡和其他制造商的卡。 我将发布这些测试的结果、无论结果如何。

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

    好的。 谢谢。

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

    尊敬的 Kobi:

    今天、我运行测试、看看 sdhost.c 中的 sd_open 无限循环是否涉及来自不同制造商的 SD 卡。 我在两次测试之间运行了三次测试、其中禁用了 CC32XX 电源策略并且完成了断电。 每次测试都尝试了 SD_open (...)之间操作的1000次迭代 至 SD_Close (...) 说明中删除了 CC32XX SDK 7.10的 sdraw_CC3220SF_LAUNCHXL_nortos_ticlang 示例。 我使用了 nortos 版本来尝试排除 SDK 7.10中与 RTOS 相关的调度问题和/或竞争条件。 使用 SDK 7.10的 sdraw nortos 项目、所有制造商的 SD 卡都产生了如上所述的 sdhost.c 无限循环、并且在所有测试的 SD 卡上进行~5-30次迭代之间发生了故障。 这与中观察到的、我 使用上面发布的 sdraw_CC3220SF_LAUNCHXL_tirtos7_ticlang 运行的 Samsung SD 卡测试的结果一致。

    相反,我观察到三个连续100%的成功率测试每一张卡运行1000迭代 SD_open(...) 至 SD_Close (...) 适用于 CC32XX SDK 3.40 (昨天附加到该线程的项目)的 sdraw_CC3220SF_LAUNCHXL_tirtos_ccs 示例中的操作。

    显然、SDK 3.40不能正常工作、SDK 7.10不能正常工作。

    以下是不同制造商的 SD 卡的结果、其中采用了 SDK 7.10与 SDK 3.40的 sdraw 示例:

    SanDisk Ultra 128 GB MicroSD XC U1 A1 10:
    sdraw noRTOS SDK 7.10上~16-29次迭代之间的3次故障
    3x 成功、在 sdraw TIRTOS SDK 3.40上完成了1000次迭代

    SanDisk Ultra 64 GB MicroSD XC V30 I U3 A2:
    sdraw noRTOS SDK 7.10上~19-27次迭代之间的3x 故障
    3x 成功、在 sdraw TIRTOS SDK 3.40上完成了1000次迭代

    SanDisk Ultra 128 GB MicroSD XC V30 I U3 A2:
    sdraw noRTOS SDK 7.10上~14-31次迭代之间的3x 故障
    3x 成功、在 sdraw TIRTOS SDK 3.40上完成了1000次迭代

    Lexar 64GB MicroSD XC V30 I U3 A1:
    sdraw noRTOS SDK 7.10上~15-20次迭代之间的3次故障
    3x 成功、在 sdraw TIRTOS SDK 3.40上完成了1000次迭代

    PNY 64 GB MicroSD XC V30 I U3 A1:
    sdraw noRTOS SDK 7.10上~5-20次迭代之间的3次故障
    3x 成功、在 sdraw TIRTOS SDK 3.40上完成了1000次迭代

    Amazon Basics 64 GB MicroSD XC V30 I U3 A2:
    sdraw noRTOS SDK 7.10上~8-27次迭代之间的3x 故障
    3x 成功、在 sdraw TIRTOS SDK 3.40上完成了1000次迭代

    假设您可以复制并移交给司机团队、您能给我一些指导、说明"我不会期望他们快速回复"的回复意味着什么、例如、天、一周、一个月、 几个月? 我们现在有多个基于云的产品系列因此而受阻、TI 方面的长期延迟无法满足我们的产品时间表。

    谢谢。
    戴夫

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

    目前、我甚至无法重现、因为我不是参考 BoosterPack。

    我想时间 可以 在几周到几个月之间、但我们会努力推进。

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

    尊敬的 Kobi:

    我自己解决了这个问题、并提出了一个解决方案供 TI 考虑用于后续 CC32XX SDK 更新。 我已确认 SDK 3.40版本的 SDHostCC32XX.c 能够正常工作、下文描述的 SDK 7.10版本的 SDHostCC32XX.c SDK 7.10的补丁修复了我在此处报告的问题。

    对于 SDK 7.10、我使用 sdraw_CC3220SF_LAUNCHXL_tirtos7_ticlang、从 CC32XX SDK 7.10源树中导入了 sd.c/sd.h、sdhost.c/sdhost.h 和 SDHostCC32XX.c/SDHostCC32XX.h。 修复了使用这些本地 SD 相关.c 和.h 文件的路径问题后,我重新构建了该项目,并确认在使用 SDK 7.10中本地编译的 SD 相关文件时,该构建仍然导致了 sdhost.c 中的无限循环。

    在检查以确保在 SDK 3.40和 SDK 7.1中的 SDHostCC32XX.c 中调用函数的方式没有差异后、我从 CC32XX SDK 源树中将 SD3.40 CC32XX.c 和 SDHostCC32XX.h 导入 sdraw_CC3220SF_LAUNCHXL_tirtos7_ticlang、即我将 SDHostCC32XX.c 和 SDHostCC32XX.h 的 SDK 7.10版本替换为 SDK 版本。 我使用这两个文件的 SDK 3.40版本重新编译了工程(其他全部都是 SDK 7.10版本)、并且成功完成了1000次迭代 SD 操作、正如它们始终在从 CC32XX SDK 3.40导入的 sdraw_CC3220SF_LAUNCHXL_tirtos_ccs 项目中执行的那样。

    我将 SDHostCC32XX.c 与 SDK 3.40和 SDK 7.10不同,并注意到 initHw ()函数存在显著差异。 在 SDHostCC32XX.c 的 SDK 3.40版本中、1022-1024行进行了卡时钟的简单配置:

    1022 //配置卡时钟*/
    1023 MAP_SDHostSetExpClk (hwAttrs->baseAddr、
    1024   MAP_PRCMPeripheralClockGet (PRCM_SDHOST)、hwAttrs->clkRate);

    SDK 7.10中的 initHw()函数更复杂,增加了卡时钟(1100-1125)的大量修整:

    1100 /*存储当前时钟配置*/
    1101 clockcfg = HWREG (arcm_BASE + APPS_RCM_O_MMCHS_CLK_GEN);
    1102/*
    1103 *将 PLL CLK DIV 设置为8以获得80KHz 时钟频率。 为
    1104 *使用初始化流唤醒卡的要求
    1105 *是1ms 内的80个时钟周期。
    1106 */
    1107 HWREG (ARCM_BASE + APPS_RCM_O_MMCHS_CLK_GEN)|= PLL_CLK_DIV8;
    1108/*将时钟频率设置为80KHz 以用于初始化流*/
    1109 MAP_SDHostSetExpClk (hwAttrs->baseAddr、MAP_PRCMPeripheralClockGet (PRCM_SDHOST)、SD_INIT_FREQ_80KHZ);
    1110 /*启用 SD 初始化流*/
    1111 HWREG (hwAttrs->baseAddr + MMCHS_O_CON)|= sd_init_stream;
    1112 /*发出80个时钟周期的虚拟命令*/
    1113 send_cmd (handle、dummy、dummy);
    1114 /*结束 SD 初始化流*/
    1115 HWREG (hwAttrs->baseAddr + MMCHS_O_CON)&&~sd_init_stream;
    1116 /*将时钟 cfg 复位为初始 cfg */
    1117 HWREG (ARCM_BASE + APPS_RCM_O_MMCHS_CLK_GEN)= clockcfg;
    1118
    1119 /*
    1120 *将卡时钟配置为400kHz、以进行卡初始化以及
    1121 *验证过程。 这样做是为了确保与
    1122 *旧版 SD 卡。 完成此操作后、卡时钟将为
    1123 *重新配置为设置的操作值。
    1124 */
    1125 MAP_SDHostSetExpClk (hwAttrs->baseAddr、MAP_PRCMPeripheralClockGet (PRCM_SDHOST)、SD_ID_FREQ_400KHZ);

    如果卡时钟无法使用 SDK 7.10版本的 SDHostCC32XX.c 稳定,但确实使用了 SDK 3.40版本的 SDHostCC32XX.c,我怀疑第1100-1125行中的代码导致了本线程中描述的问题。 我删除了从 SDK 3.40导入的 SDHostCC32XX.c 和.h 文件、导入了这些文件 SDK 7.10版本的纯净副本、注释掉了1100-1125行、并从 SDK 3.40的 SDHostCC32XX.c 第1022-1024行添加了时钟配置代码。 使用此文件重建工程后、附加的 sdraw_CC3220SF_SDK7.10_tirtos7_ticlang_SDFix 工程会使用所有 SDK 7.10代码成功完成循环内 SD 操作的所有1000次迭代、但本段中描述的更改除外。

    我已经多次运行该项目、它始终会成功完成全部1000次迭代。 我认为这证实了 SDK 7.10的 SDHostCC32XX.c 中的时钟设置代码导致了在 sdhost.c 中产生无限循环的错误。 我不清楚在 SDK 3.40之后多久进行了此更改、但它可能会影响从 CC32XX SDK 4.10开始推出的其他 SDK。

    我已经将这个修订过的 SD 驱动程序折叠 到我们自己的应用程序  中,并且我没有在 sdhost.c 中遇到无限循环错误,因为这进一步确认了修复。

    作为一个供参考的用户,在 Power_setConstraint (...)的时间和位置上也有显著的差异。 and Power_releaseConstraint(...) 在 SDHostCC32XX.c 的 SDK 3.40和 SDK 7.10版本的差异中显示的代码。 我轻轻地遵循了这些 Power_*constraint(...)的逻辑 SDHostCC32XX.c 中的源代码函数、我相信它们与此处报告的错误无关。 也许有必要重新审视 Power_*constraint(...)在时间和位置上的变化 在整个 SDK 7.10版本的 SDHostCC32xx.c 驱动程序中调用;不清楚为什么在3.40和7.10之间进行了更改。

    我将此标记为已解决。

    此致!
    戴夫

    e2e.ti.com/.../sdraw_5F00_CC3220SF_5F00_SDK7.10_5F00_tirtos7_5F00_ticlang_5F00_sdFix.zip