USB CDC 冻结(主机到设备传输)

问题描述 投票:0回答:1

我的设置

我尝试在 GD32F405(=STM32)微控制器上使用 USB FS 主机。我使用 CMSIS 并直接对寄存器进行操作。

我有 Android 设备,默认情况下作为 VCP(虚拟 COM 端口)工作,并且有一个应用程序在此 Android 设备上运行,该应用程序促进了一个足够简单的协议,需要一台设备以 STX-ETX 发送包裹字节并接收 ACK 符号作为包裹确认返回。两个设备轮流通信。如果包裹未得到确认,则应在超时后重新发送。

设备描述符看起来非常基本:CDC 类、子类 0、协议 0、一项配置。

CDC描述符中有3个端点:BULK IN、BULK OUT和IRQ IN。我仅使用 BULK 数据包并使用 64 字节数据包交换原始数据(大小在端点描述符中列出)。

问题:

在通信的某个点上存在断点,Android 设备停止从主机接收数据。在数据包级别,我看到来自设备的 USB 数据包 ACK(已设置中断标志)、DPID 已正确翻转等,但如果我足够努力地接收答案并多次重复请求,我会在 OUT 操作期间收到 HALT 标志。感觉就像有类似 ZeroWindow 的事件,因为 Android 设备不执行读取操作。

这个问题随机发生 - 我在“发送者”和“响应者”角色中都检测到了它 - 有时系统在我这边重新传输时冻结,有时我收到请求的垃圾邮件(我的确认丢失)。

我尝试过的事情

我尝试与 BULK IN 并行轮询 IRQ 端点,但在第一次轮询期间我仅收到几次传输,而不是仅收到静默 (NAK)。

我尝试将每个数据包的有效负载限制为 63 字节,以强制使用“最后一个数据包”,但没有成功。在某些情况下,即使是 20 字节长的请求也会出现同样的问题,所以我认为这不是奇数包问题。

迄今为止唯一有效的解决方案

为了修复系统,我只需重新初始化 USB 设备(发送总线复位信号、设置地址并选择配置)。系统开始工作,设备再次响应,但缓冲区似乎已被刷新。接下来的几分钟内会发生同样的问题。

如果我将同一设备连接到 Linux PC 并用请求淹没它,则不会发生类似的问题。

相同的 MCU 设置可以与另一个 CDC 设备(基于 STM32)很好地配合,因此这应该是一个与实现相关的问题。

可能是什么问题?如何尝试解决类似问题?

usb stm32 cdc mcu
1个回答
0
投票

谢谢你的橡皮鸭!

希望这对某人有帮助:

我发现一个问题。该设备有一个未记录的“功能” - 它仅在 DTE 1-0-1 转换后清除缓冲区,因此我必须在每个请求之前发送假的“设备不存在”几毫秒。因此,我发送两个 SET_CONTROL_LINE_STATE 请求:

(Boot)
SET_CONTROL_LINE_STATE(3)
write something, wait for the answer
... (in polling)
SET_CONTROL_LINE_STATE(0)
SET_CONTROL_LINE_STATE(3)
write some request
... (in polling)
(here are next requests)

我一点也不喜欢这样,但这是迄今为止唯一的解决方案。我已经联系了 Android 应用程序的软件开发人员,他们说这可能是“Android 相关问题”,不会得到解决。

要阅读的应用注释(包含请求格式): https://www.silabs.com/documents/public/application-notes/AN758.pdf

© www.soinside.com 2019 - 2024. All rights reserved.