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.

[参考译文] TM4C129DNCPDT:SYSCLK 频率降低的 USB

Guru**** 2529900 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/944438/tm4c129dncpdt-usb-with-reduced-sysclk-frequency

器件型号:TM4C129DNCPDT

我们有一个配置了480MHz PLL 频率和120MHz 系统时钟的 Tiva 129。  为了在特定时间降低功耗、我们希望将 SYSCLK 降低到低得多的值、同时保持所有其他(包括 USB)正常运行。 在此期间、我们知道 I/O 和处理器负载将大幅降低。  

将 Tiva 上的 USB 用作 CDC 器件。

PLL 保持在480MHz、我们更改了 SYSDIV 和 MEMTIME0、如手册第5.3节末尾所示。 这可以根据需要工作、当从120MHz 更改为30MHz 时、我们可以看到节能效果良好、一切都很可靠。

我们希望使用更低的速率并节省更多电量。  例如、当下降至12MHz 时、USB 变得不可靠。  (我们使用的是 CDC 器件驱动程序)。  当以人类进入速率从终端仿真器输入字符时、终端仿真器中的某些字符要么未接收、要么未回显(回显是我们的代码、在所有速率下都是可靠的)。 此外、当 char 丢失时、处理器似乎卡在 USB 驱动程序中的某个位置(来自 TI)。  闪烁的 LED 指示处理器仍在运行、并且中断继续被处理。  

断开(逻辑上、非物理上)和重新连接终端仿真器通常会显示一些"卡住"的输出和响应、并且还会指示有时错过了一些输入字符。  在这种情况下、重新连接在 Linux 下显示相同的器件名称、因此我们知道总线上没有发生器件重新枚举。  (在 Linux 下使用 CoolTerm)。

TIvAware USB 库自述文件指示修订版本2.1.0.12573。

查找有关这方面或类似经验的建议、或者在使用 USB 时是否有 SYSCLK 的下限。  同样、PLL 保持在480、因此 Tiva 中的 USB 控制器应该正常。

谢谢、此致、


Tim

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

    Tim、您好!

    我没有尝试使用 USB 降低系统时钟速度、但根据您所描述的情况、30MHz 正常、12MHz 不正常、并且您看到输入缺失、 我怀疑微控制器运行速度太慢、无法在超时发生前处理 USB 堆栈中的 API。

    您可以执行一些检查以确保配置不会出现问题:

    SysTick 是否仍在1毫秒内运行?

    您是否 使用 USBLIB_Feature_CPUCLK 通过 USBDCDFeatureSet API 将新的时钟值传递给 USB 堆栈?

    如果所有这些都正常、我强烈怀疑 USB 堆栈在超时发生前没有得到足够的 CPU 周期。 我们尚未试验 USB 的最低时钟速度、建议 USB 始终以120MHz 的频率运行、 我实际上没有一个设置来评估整个应用环境中堆栈的稳定性、我可以放心地为您提供最小时钟速度的绿色限制。 我建议您对系统进行评估和应力测试、以了解在30MHz 或更低频率下的下限是什么。

    您可能还需要尝试将库文件添加到项目中、以查看卡在哪个 API 中、然后尝试调整 USB 库。 为此、您需要取消链接 usblib.lib 并手动将所需的.c 文件添加到项目中。 这使您可以查看 USB 堆栈以进行进一步调试。

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

    感谢您的快速响应、Ralph。

    关于 FITY_CPUCLK、这不在 usblib 的器件部分中使用; 它似乎在主机部分而不是器件部分中使用。  

    我们正在使用库文件、并且我已经能够对它们进行检测。  中断速率、延迟和响应时间看起来不错、但仍在研究中。

    由于 SYSCLK 较慢、SysTick 递减计数的速率较慢。  但是、USB 器件驱动程序似乎只通知硬件 PLL 频率(在器件模式下)、而不通知系统时钟频率。  USB 控制器继续以1KHz 的速率产生 SOF 中断、但有一些差异。

    另一个软件可能会在这个慢时钟速率下引入过多的中断延迟; 我还在研究这一点。  

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

    Tim、您好!

    老实说、我 以前没有研究过 USBDCDFeatureSet 的细节、因此看起来您是对的、只有主机使用它。

    我想知道将 SysTick 标准化为1毫秒是否有帮助。 我认为这应该是可能的。 API 应使用要配置的时钟值。

    SysTickPeriodSet (g_ui32SysClock / SYSTICKS_PER_second);
    

    基于这一点、我认为它应该仍然以1毫秒的时间运行。 除非您只是指 IT 更新的实际计数更慢? 我认为应用程序中的任何内容都不会使用计数、因此如果使用该计数、则没关系。

    您是否在30MHz 时也出现1KHz 中断速率的变化? 如果没有、这可能是一个指示器。

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

    我在驱动程序中看不到与 SysTick 的依赖关系。  此外、由于所有 计时器都适用于30MHz 及更高频率的 SYSCLK、并且由于我们的应用和环境不使用 SysTick (我们在不同的计时间隔中使用3个其他 TI 计时器)、我建议 USB 驱动器不依赖于 SysTick。 我可以找到的唯一参考位于 DFU 中、我们不使用该器件、其中软件在更新固件之前禁用并重新启用 SysTick 中断。

    我注意到、无论我们为 SYSCLK 使用什么值(120MHz、30MHz 等)、我们都以1ms 的间隔记录 SOF 中断、这是由我们使用的其他 TI 计时器测量的(当我们更改 SYSCLK 时、代码确实会更改这些计时器的倒计时值)。  

    但是、如果您可以指向使用 SysTick 的库中的某个位置、我们将很乐意对其进行初始化并使用它。  我没有看到这样的地方、所以听起来像是"猜测"、 但如果我对此有误、请务必纠正。

    此致、

    Tim

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

    其他一些信息: 我已将 TIVAWare USB 驱动程序更新为版本2.2.0.295;行为没有变化。  

    我还介绍了 SysTick 并使用了相当高的时钟速率(5129个节拍/秒): 这可确保中断速率为高电平、不是1ms 的倍数。  ISR 只是决定延迟(因为 SysTick 会继续递减计数)。  延迟源为1)软件在某些地方必须禁用中断、以及2)还有其他需要处理的中断(计时器、UART)。  

    120MHz 下的测试显示平均延迟为2uSec、最大延迟为7uSec。

    15MHz (USB 开始出现行为错误)下的测试显示平均延迟为2 μ s、最大延迟为194 μ s。  

    在30MHz 时、平均延迟为2 μ s、在没有 USB 活动的情况下最大为33uSec、在有 USB 活动的情况下最大为135uSec。

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

    Tim、您好!

    我对 USB 层进行了更多深入探究、您就知道 SysTick 了。 我之前从未深入探讨过、但我对 USB 库使用 SysTick 的印象不正确。 在这方面、我没有亲自写 USB 库、但在过去三年里、我一直在全力支持它。 遗憾的是、它被设计成不必要的复杂、很难通过它进行跟踪、以便真正了解内幕揭秘。

    194微秒的延迟不足以破坏总线上的实际 USB 通信。

    您是否在 LaunchPad 上测试过此功能? 我有一个 USB 分析器、因此我可以重新创建测试、然后查看 USB 分析器、看看我是否注意到任何内容、例如丢包等

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

    您好 Ralph、

    无需道歉; 我们都是第一次深入探讨这一点、USB 驱动程序始终都公平参与其中。

    这是我们的目标系统、该系统已经存在了几年。  它具有相当多的功能、因此将子集移植到 launchpad 或评估板不是一个简单的选择、但我们应将其保留在桌面上。  

    BTW、我们的板还具有 EPI 之外的 SDRAM; 作为实验、我更改了我们的软件、以确保 USB 缓冲器位于中间 SRAM 而不是 SDRAM 中; 这没有什么不同。

    谢谢、

    Tim

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

    您好、Tim、

    因此、我尝试使用我们的 LaunchPad 示例重新创建它、但我甚至没有取得像您一样多的进展。 在60MHz 时、似乎工作正常、但在30MHz 时、TM4C LaunchPad 已无法进行 Windows USB 枚举。 我认为 Windows 对它发送的命令数量要求很高、这样就不会让我感到很紧张、但考虑到您看到的情况、它没有我预期的那么稳健。

    但鉴于在 LaunchPad + Windows 10设置中 USB 接口已经停止工作了、我想说、如果您获得了30 MHz 的可靠工作频率、那么您可能已经处于良好的状态并接近极限。

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

    我 很好奇:当它出现故障时、您是否对故障模式有深入了解?

    -处理器是否已停止?

    -处理器是否锁定、永久处理中断?

    或者、Tiva 端的状态机制是否只是因为它掉了一些东西/看不到什么而混淆了下一步?

    我感兴趣的是、较快的时钟速率可能无法消除该问题、而只是将其发生的可能性降低到 USB 不会引起故障的频率。

    Tim

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

    Tim、您好!

    MCU 正在运行并且未锁定、我可以暂停、它位于应用程序的主 while (1)循环中、断点正常工作。

    在30MHz 时、TM4C 会看到来自主机 PC 的数据包、但它不对它们做出响应。 我在 USB 总线上看到 ACK、但看不到后续数据输出。

    当时钟速度设置为15MHz 时、USB 接口似乎未正确启用。 我的 USB 分析仪甚至不会触发查看任何流量、因为 PC 甚至不会注意到已连接 USB 设备。

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

    Tim、您好!

    根据外设硬件设计、30MHz 似乎是最低系统频率:

    也就是说、由于我无法使它在我的末尾以30 MHz 的频率工作。。。。。 我强烈建议您以30MHz 的频率对系统进行压力测试、以确保它在所有情况下都能可靠地工作。 鉴于30 MHz 甚至不会在 Windows 中进行枚举、我有理由担心它的可行性。

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

    拉尔夫

    这是什么文档?  我的 Tiva 手册没有详细介绍 USB 控制器寄存器的内容。  此外、我们是内部 phy、仅为 fs (而非 ULPI)、因此、就内部 phy 与外部 ULPI phy 的使用而言、上面的描述似乎有点模糊。

    此致、

    Tim

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

    Tim、您好!

    数据表的 USB 章节受 NDA 协议保护。 如果您转到 USB 部分、则会有一个文档链接、您可以在其中同意 NDA 条款并下载数据表。

    链接 为:http://www.ti.com/lit/pdf/spms416

    这将为您提供完整的章节、您可以在其中找到该信息。 搜索 USB 时钟结构、因为该图像来自不同的器件数据表、因此可能与段编号不匹配。