2012-11-12 107 views
2

我正在写一个简单的虚拟串行端口设备来报告一个较旧的串行端口。通过这一点,我可以枚举设备并发送/接收字符。USB CDC设备失速

经过从主机到设备的大量数据传输后,终端似乎放弃并停止传输数据。在PC端,我收到一个写入错误,并根据USBlyzer曲线判断音乐停在一个档位(USBD_STATUS_STALL_PID)。然而,我的代码永远不会故意在该端点上发出STALL条件,而生成的状态标志永远不会被设置。

由于在发出请求和STALL之间经过的时间很短(< 300μs),它似乎是某种无效响应,而不是超时。在设备端,输出端点已准备就绪,缓冲区中的数据和正确的DATA0/1同步,但没有任何进一步发生。

请注意,设备即使长时间工作也能正常工作,直到我开始发送“大量”数据为止。就在我可以告诉设备枚举/配置也似乎完成成功。哦,并且在此之后,大容量端点继续正常工作。

为了记录我正在使用标准的Windows usbser.sys驱动程序和一个XMega128A4UμP。我也在多台Windows Vista和7台机器上看到相同的行为。

任何想法我做错了什么或进一步的测试我可能会运行缩小的东西?

USBlyzer logUSB CDC stacktest project

回答

3

为记录这最终竟然是一个振荡器问题。 (显然,即使选择了1,000Hz的USB帧,FLL的参考始终为1,024 Hz。这种轻微的时钟错误意味着,如果偶然包含一个太多的1比特的数据包,偶尔会有一个数据包被拒绝。)

我猜这个故事的寓意是在假设你对高层协议有问题之前检查基础知识。同样回顾一下,硬件USB分析仪本来就是一项有价值的投资,但软件替代品大多似乎吐出了一个通用的错误代码,或者在出现问题时根本没有。

2

失速的出端点上在主机一侧的输出缓冲器的溢出可能发生。您确定设备确实通过out-endpoint获取了它收到的数据吗?如果是这样的话,它至少可以像数据发送到设备一样快地获取数据?

请注意,即使长时间的 时间,设备似乎仍然正常工作,直到我开始发送“大量”数据为止。

这似乎是输出缓冲区溢出的提示。

+0

哦,我虽然有一个基于常规NACK的CDC设备流量控制机制。任何想法如何限制速度呢?如果USBlyzer日志被认为是可信的,那么设备在失速前大约30ms获取数据。 – doynax