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.

[参考译文] TM4C1233H6PGE:在尝试流式传输数据时、USB 会停止将数据发送回主机。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1491072/tm4c1233h6pge-usb-stops-sending-data-back-to-host-when-trying-to-stream-data

器件型号:TM4C1233H6PGE

工具与软件:

 我目前的情况是需要以最快的速度流式传输数据。 但在这种数据爆炸的过程中,似乎 USB 缓冲区从最大可用空间(1024字节)变成0可用空间,并保持0可用空间,直到我尝试发回数据(直到360秒后)。  这里是我的硬件设置。 我有一个通过 USB 连接到 PC 的主控制器模块、还有一个通过 UART 连接到主控制器的下游从模块。 我让从模块进行数据收集、并将结果发送回主控制器。 我可以看到数据正在返回到主设备、我可以看到主设备然后将数据从 UART 缓冲区传输到 USB 缓冲区、但在某个时刻、通常在几秒钟内、当我将数据发送回 PC 时、主设备控制器停止发送数据。 我已经完成了一些调试并跟踪了它一直到 USBWRITEBUFFER 命令调用。 我发现,在那一点,似乎没有任何空间剩下的缓冲区,所以没有数据被发回。 在从模块停止发送回 UART 数据包之前、主控制器保持这种状态、USB 缓冲器上没有空间。 我做了一些时序分析、看起来主控制器在 UART 上接收到的每个数据包之间有大约120us 的时间。 现在、每个数据包的长度为8个字节。 看起来应该有足够的时间从 UART 缓冲区复制到 USB 缓冲区、并将数据发送回 PC。  

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

    Andrew、您好!

    Unknown 说:
    我有一个主控制器模块通过 USB 连接到 PC

    对于实验、如果您将主控制器直接连接到 PC、它是否会有所不同?

    Unknown 说:
    我已经做了一些调试并跟踪到 USBWRITEBUFFER 命令调用

    您能演示如何调用 USBBufferWrite 吗? 如果来自 UART 的数据包的长度是8字节、那么我认为您应该为 USBBufferWrite 的长度参数指定8字节、对吗?

    [报价 userid="586540" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1491072/tm4c1233h6pge-usb-stops-sending-data-back-to-host-when-trying-to-stream-data "]似乎有足够的时间从 UART 缓冲区复制到 USB 缓冲区并将数据发送回 PC。  [报价]

    您是否正在使用 CDC 类器件? CDC 类器件使用 USB 批量传输类型、默认为 管道上的最大64字节。  如果您使用 CDC 类示例、则 USB 缓冲区为256个字节、但您可以将其更改为更大的值。 缓冲区足够大、可以从 UART 接收几轮8字节有效载荷、每次调用 USBBufferWrite 时、将64字节发送到 PC。 我不确定为什么没有将数据发送到 PC。 由于您要将主控制器连接到集线器、因此您需要确定 PC 是否正在向主控制器请求数据。 集线器上还有多少其他器件? 是否有使用可占用 USB 带宽的等时传输的设备? 如果您有 USB 分析仪、那么我们很容易知道 USB 总线上正在发生什么。  

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

    尊敬的 Charles:  

    为了进行实验、如果您将主控制器直接连接到 PC 上、是否有区别?

    我不确定您的意思是什么。主控制器连接到 PC。 它通过扩展坞连接到 PC。 是否要从 PC 和主控制器之间卸下坞站?

    是的、我们始终指定要发送的字节数。 8个字节是我们每次发回的通常量。

    您使用的是 CDC 类设备吗? [报价]

    是的、我们正在使用 CDC 类器件、我也在使用 CDC 示例。 我试图将缓冲区从256增加到2048、这似乎没有改变行为。 可用的缓冲区空间开始接近完全可用的值减几个字节、然后在某一点处、可用的空间突然降至0并保持不变、直到我停止在 UART 上流式传输此数据。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定您的意思。主控制器连接到 PC。 它通过扩展坞连接到 PC。 是否要从 PC 和主控制器之间移除坞站?

    还有哪些 USB 设备连接到扩展坞? 您是否能够尝试直接连接到 PC 的 USB 端口。 我想知道是否有任何差异。  

    是的、我们使用的是 CDC 类设备、我也使用 CDC 示例。 我试图将缓冲区从256增加到2048、这似乎没有改变行为。 可用的缓冲区空间开始接近完全可用的值减几个字节、然后在某一点处、可用的空间突然降至0并保持不变、直到我停止将此数据流式传回 UART。

    主控制器是一个设备。 因此、它只会在主机(您的 PC)发起请求时发送数据。 PC 是否可能由于其他优先级(例如扩展坞上的其他设备)而没有请求主控制器?

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

    让我尝试直接插入 PC 并删除连接到 PC 的任何其他设备。 我相信主机仍在请求数据、至少这是我通过"Device Monitoring Studio"观看通信时看到的结果。 我将进行几次实验、然后回复给您。

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

    所以我尝试在没有坞站接口的情况下直接在我的 PC 上运行此操作、但我仍然会遇到此问题。 我想我已经在我的 USB 监控软件上捕捉到错误的时刻。 对于主机的读取请求、我看到通常在10到20左右、然后突然跳到9048。 下面是几个屏幕快照。 如果你要我上传更多的日志,请告诉我。

    这些是我最后收到的内容、即使我可以看到我的装置正在尝试发回更多数据

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看到的排队通常在10到20之间、然后突然跳到9048。

    我不知道为什么突然升到9048。 您能否诊断以下问题

    -如果你减慢 UART 的输入速度会怎样? 您的 UART 波特率是多少? 我建议先降低10倍、然后逐渐提高速度。 它有什么区别吗? 我想知道问题是否取决于 UART 输入带宽。

    -我想你确切地知道从 UART 发送什么。 您能否从 UART 端生成测试图形。 例如、发送从0.1.2.3、4开始的值的数据序列... USB 接口。 在 PC 端、您应该会收到相同的图形。 当您看到队列从24跳到9048时、您实际上会收到什么?  

    -您的 USB 显示器是哪种类型的软件实用程序? 当您看到队列突然跳到9048时、它实际上是接收9048字节的数据还是它仅接收24字节、但您的 USB 显示器出于任何原因误认为它接收9048。  

    -当 USB 监视器显示9048时,MCU USB 模块或 MCU UART 模块上是否检测到任何错误?

     -在 USB 初始化过程中,您能先清空缓冲区吗? 请清空 UART FIFO 和 USB 缓冲区这会有什么区别吗?

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

    - UART 波特率为1M。 降低吞吐量似乎有所帮助、但我最终仍然会看到同样的问题。

    -与测试模式,我似乎得到的东西回到顺序,但在某一点上,我停止接收数据,即使我没有完成发回它。

    -我正在使用 HDD Device Monitoring Studio。 我似乎实际上收到了这里显示的数据量。

    -没有 UART 错误,我没有发现任何 USB 错误,但我需要深入研究如何在 TI 处理器中检测 USB 错误,我才能确定。

    -我已经清除了初始化中的所有缓冲区。

    -是否可以将 USB 配置为同时支持多个类。 例如批量传输和等时传输? 如果需要将此数据流式传输回、这会帮助我吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    UART 波特率为1M。 降低吞吐量似乎有所帮助、但我最终仍会看到同样的问题。

    尽管没听说过、但1Mbps 相当高。 您的进度有多慢? 您知道 UART 到 USB 的传输波特率是多少、而不是您当前遇到的问题。 因为你说减速会有帮助,因此我的问题。  

    [报价用户 id="586540" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1491072/tm4c1233h6pge-usb-stops-sending-data-back-to-host-when-trying-to-stream-data/5735218 #5735218"]

    -与测试模式,我似乎得到的东西回到顺序,但在某一点上,我停止接收数据,即使我没有完成发回它。

    [报价]

    我想知道如果您更大地更改缓冲区大小、这会改善吗? 例如、从2048更改为8192。  

    [报价用户 id="586540" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1491072/tm4c1233h6pge-usb-stops-sending-data-back-to-host-when-trying-to-stream-data/5735218 #5735218"]

    -没有 UART 错误,我没有发现任何 USB 错误,但我需要深入研究如何在 TI 处理器中检测 USB 错误,我才能确定。

    [报价]

    好的。  

    [报价用户 id="586540" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1491072/tm4c1233h6pge-usb-stops-sending-data-back-to-host-when-trying-to-stream-data/5735218 #5735218"]

    -我已经清除了初始化中的所有缓冲区。

    [报价]

    好的。

    -如果可以配置 USB 以同时支持多个类。 例如批量传输和等时传输? 在流式传输此数据的情况下、这是否有助于我?

    这将是一个复合器件。 不过、我们没有这样的示例(批量传输和等时传输)。 您可以首先尝试等时传输、看看是否有所改善。  

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

    是否有可以用于快速试用的等时传输示例?

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

    Andrew、您好!

     我们没有任何  器件的同步传输示例。 但是、  主机有等时示例。 这些示例是为 DK-TM4C129X EVM 板开发的、但此电路板已停产。 这些示例可在以下位置找到:

    C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\dk-tm4c129x\usb_host_audio

    C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\dk-tm4c129x\usb_host_audio_in