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 通信挂起、出现 USBD_STATUS_BUFFER_溢出 错误

Guru**** 2605765 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/748017/tm4c1233h6pge-usb-communication-hangs-with-usbd_status_buffer_overrun-error

器件型号:TM4C1233H6PGE

大家好、

我们使用 TI 微控制器 TM4C1233设计了定制板。
微控制器的 USB 模块可通过一个输入和一个输出管道编程为大容量器件。
电路板固件的 USB 部分基于 TI Tiva 批量示例、PC 端使用 WinUSB 驱动程序顶部的 Lmusbdll.dll 接收数据。

在极少数情况下、PC 应用程序挂起、Microsoft 消息分析器显示 USBD_STATUS_BUFFER_溢出 错误。 之后、LmUsbdll 错误处理会连续调用 WinUSB Abort Pipe 函数、而不会成功。

TivaWare USB Bulk 类驱动 程序在 USB_RX_ERROR_FLAG 中定义了 USBERR_DEV_RX_溢出 标志、但 TM4C1233数据表指出从未为 Bulk 器件设置此标志。

如果上述陈述属实、除了完成应用 程序和控制器重置之外、还可能建议一些纠正措施、有人还能不能提出建议?

非常感谢您的参与

此致

Peeter

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

    根据我所做的研究、我没有看到任何数据表不正确的迹象。

    是否确定大容量器件未设置为等时模式?

    您能否尝试并确认 TM4C 是否通过 USB 分析仪报告了该错误? (据我所知、您提到的 MS 分析仪不像 USB 分析仪那样看待 USB 线?)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    感谢您的快速回答。

    Microsoft Message Analyzer 是一个纯软件工具、它可能不会查看 USB 线路、而是从驱动程序收集信息。

    e2e.ti.com/.../Overrun.pdf

    我已附上溢出事件的 MMA 捕获屏幕截图。

    屏幕截图显示 PC 和设备正在使用批量管道进行通信。 正常情况下、这可以正常工作、PC 按预期接收数据包。 但是、USBD_STATUS_BUFFER_溢出 会返回到应用程序 BULK_IN 请求中。 然后,LmUsbdll 尝试通过发出 abort_pipl 而从错误中恢复,但没有成功。 控制器未响应。

    控制器应采取什么措施? 调用 USBDevEndpointStatusClear 还是调用 USBFIFOFlush 就足够了、还是应该重新初始化整个 USB 模块?

    此致、

    Peeter

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

    我认为不需要再次初始化 USB 模块。

    我想说、如果您可以丢失缓冲区中的任何数据(我不明白为什么不会丢失数据、因为您不知道数据处于什么状态)、则应考虑您注意到的两个操作。 首先、我肯定会建议使用 FIFO 刷新来清除 FIFO、否则任何后续的数据包都可能导致进一步的错误。 完成此操作后、我将添加一个端点状态检查、只有当仍然是 USBERR_DEV_RX_溢出 错误时、我才会清除端点状态。 您可能还需要考虑 RX 缓冲区的 USBBufferFlush、以清除环形缓冲区。

    为此、我建议您确保应用中的 RxHandler 具有为 USB_EVENT_ERROR 定义的状态、然后使用该状态检查 USBERR_DEV_RX_溢出 标志、如果设置了该状态、则执行这些操作并查看该状态是否解决了问题。

    使用这些 API 处理错误应该能够释放足够的 USB 堆栈以接收请求、然后恢复与 PC 的通信。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    感谢您提出宝贵的建议。 我将尝试跟随他们。

    由于错误很少发生、因此这需要一些时间。

    此致、

    Peeter