主题中讨论的其他器件: 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 存在问题。
谢谢。
戴夫