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.

[参考译文] TM4C1294KCPDT:USB 集成 DMA,生成超大全速数据包

Guru**** 2548110 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1076386/tm4c1294kcpdt-usb-integrated-dma-generating-oversize-full-speed-packets

部件号:TM4C1294KCPDT

我有一个项目使用 TiaWare/usbib/设备库驱动处理器的 USB 引擎,将其作为一个带有两个端点(一个在中,另一个在外)的批量设备。 我已让代码直接正确处理 USB FIFO。 我正在尝试让系统使用集成 DMA 引擎在 In 端点上发送数据,但我偶尔会收到超大的全速数据包(> 64字节)。 此故障通常在成功发送1000个块(每个块中有几百个字节)后发生。

我应该从哪里开始寻找错误? 发生故障的数据块与上述任何数据块之间没有明显的区别,只不过数据块中最后发送的数据包大于64字节。

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

    您好 Peter,

    正如查尔斯提到的,我们没有找到 USB + DMA 示例。 从我调查的结果来看,用于 DMA 的 USB 库挂钩不是很好地组合在一起,范围有限。 由于对此功能的请求有限,而且进一步开发此功能的复杂性,我们最终将精力集中在其他更广泛应用的应用程序上,以改进相关资料并发布应用程序注释,因此我们不会在近期内寻求支持。

    对于您的特定问题, DMA +批量模式没有任何挂钩。 这很可能是因为 使用 USBLibDMA API 管理 DMA 接口而导致的结果,但这些 API 实际上仅适用于 MSC 和 Audio 接口。 USB 磁带库本身不支持将 DMA 与批量和 CDC 一起使用,并且尝试在不添加这些挂钩的情况下使用 DMA 似乎通常会导致错误。

    我猜问题的根本原因是在 usbdbulbe.c 中发生的,如果您将文件添加到项目中,您将能够使用断点调试各个函数。

    此致,

    拉尔夫·雅各比

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

    感谢查尔斯的努力。 这是我发现的。

    我的代码实际上非常有效——在失败前,我获得了几百到几千次成功的批量传输。 使用 USB 分析器,我可以看到故障模式是一种以大于64字节数据包结尾的批量传输。 错误传输的总字节数正确,只是 USB 引擎尝试传输太多字节作为最终数据包。 例如,400字节块可能被传输为3x64字节数据包,然后是208字节数据包。 该数据块应先以6x64字节数据包的形式发送,然后再以16字节短数据包的形式发送,以终止该数据块。 故障不是块长度的函数-我看到许多块大小与故障块在故障前正确发送的大小相同。

    很难想象什么会导致偶尔超大的最终数据包由似乎只有硅产生。 不幸的是,我可能在一段时间内偷盗 DMA/Endpoint 寄存器,但我很难想象我会如何导致这一结果。 我在发生故障后检查了端点配置寄存器是否正确,方法是使用 CCS 调试器对它们进行调查,而不会发现任何红色标记。

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

    你好,拉尔夫,

    我的代码几乎可以工作,主要绕过 TI 库代码(这需要在 USBDeviceIntHandlerInternal 中删除 DMA 处理)。 我已经删除了我正在使用的应用程序代码,以简化通过网络发送的数据的生成。 我目前的怀疑是,我打算在上一次 USB 传输完成之前开始新的 DMA 传输。

    如果问题得到解决,我将发布至少一些代码片段以驱动批量 DMA 传输。

    PS:我现在已使用 Firefox 对此线程编写了两份答复, 但无法发送其中任何一份(单击“答复”按钮将关闭“答复”编辑窗口,但无法成功发送答复)。 绝望驱使我尝试 Edge。

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

    嗨 Peter,

    好的,这肯定有助于使它变得更简单。 我想知道您是否可以计算 DMA 开始传输的数量与完成的 USB 传输的数量,然后看看是否不同步? 将是两个单独的测量区域,您可以定期输出结果。 只是考虑如何根据您对假定问题的描述来调试该问题,这也是我最初的猜测。 您是否认为有任何 NAK 或重试可能在发生,这可能是 USB 传输在触发下一个 DMA 传输之前未完成的原因? 只是想一下什么可能会导致巴士延迟一点。

    此致,

    拉尔夫·雅各比

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

    你好,拉尔夫,

    我正在发送的数据块已经有序列号,因此我用简化的代码知道我已经丢失了前几个数据块。 我使用逻辑分析器和拖转输出线路,因此我知道 DMA 代码何时在做生意。 我还会监控(使用逻辑分析器)一个串行调试输出,该输出打印诊断信息,我有一个 USB 分析器,以便可以看到数据通过线传输。 逻辑分析器(Saleae Logic 16 Pro)和 USB 分析器(ellisys USB Explorer)都允许我设置任意时间0,因此我可以关联两者收集的数据,以便从外部大致了解情况。 我看不到 USB 的集成 DMA,USB FIFO 和 USB 引擎之间的通信,因此我很难弄清楚我可能会做些什么来导致64字节数据包问题。

    我确实在预期的位置看到了 NAK 和 ZLP。 原则上,在最后一个数据块处理完毕之前,代码将停止发送下一个数据块,但“原则”和“实践”之间存在差距!

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

    嗨 Peter,

    我自己真的没有具体的想法,从数据表的角度来看这一点只是为了帮助更好地集思广益。 我对 DMA <--> FIFO <--> USB 引擎内部运行情况不是很了解,我们可能正在查看相同的方框图。

    您使用的是哪种 DMA 模式,即0或1? 对于模式0,此段被提及:

    对于在请求模式0下运行的 Rx 端点,DMA 请求行将变为
    当数据包在端点 FIFO 中可用时为高,通常在末尾为低
    开始处理最后一个字节中的第8个字节的循环(发生两次减去的传输)
    在传输前一个包含此字节的时钟周期)。 请求行的 IF 值也很低
    CPU 清除 USB 接收控制和状态端点 n 低的 RXRDY 位
    (USBRXCSRLn)寄存器。

    这是迄今为止我所读到的唯一一件事,它让我想到了可能与这个特定问题相关的事情。

    此致,

    拉尔夫·雅各比

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

    你好,拉尔夫,

    我购买了 TIVA C 系列开发套件,并参与了 MSC 示例项目。 这可以按预期工作,并且正在使用批量 DMA 传输,因此至少硅能工作(确实可以预期,但可以放心地得到确认)。 但是,这确实给了我一些传输时间,与我以前的非 DMA 解决方案相比,后者的 传输速度与示例项目中的 DMA 传输速度一样快,并且接近使用全速(12MHz) USB 时的传输速度。 因此,这促使我现在搁置 DMA 解决方案,更难了解我们真正的瓶子颈部的位置。

    最终我会回到 DMA 代码,因为它从处理器中卸载了相当一部分工作,最终我们希望这种处理能力用于其他目的,但现在 DMA 无法解决我们的问题。 我很确定我的问题与在上一个 USB 传输完成之前设置另一个 DMA 传输有关,但我 无法 找到问题代码,因此我将在第二天留下问题。

    感谢您对 MSC 的暗示。 这至少让我重新评估了自己在做什么!

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

    嗨 Peter,

    感谢您的更新,我很高兴 MSC 帮助您更好地发现系统问题。 我认为,DMA 未被广泛请求的原因之一是不需要达到这些速度,因此 主要好处就是卸载。

    供参考:此线程可能会在您再次采集 DMA 之前锁定,但您可以使用“提出相关问题”来引用它,因此当您再次采集 DMA 调查时,我们将在此处看到以前的历史记录。 同时,我会将您最近的回复标记为此特定主题的“解决方案”。

    此致,

    拉尔夫·雅各比