2

我正在编写一个简单的虚拟串口设备来报告旧的串口。至此,我能够枚举设备并发送/接收字符。

在从主机到设备的不同数量的批量输出传输之后,端点似乎放弃并停止传输数据。在 PC 端,我收到一个写入错误,从 USBlyzer 跟踪判断,音乐停止在一个档位 (USBD_STATUS_STALL_PID)。但是,我的代码从未故意在该端点上发出 STALL 条件,并且生成的状态标志永远不会被设置。

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

请注意,即使在我开始发送“大量”数据之前,该设备似乎也可以长时间正常工作。据我所知,设备枚举/配置似乎也成功完成。哦,在此之后,批量输入端点继续正常工作。

作为记录,我使用的是标准的 Windows usbser.sys 驱动程序和 XMega128A4U µP。我还在多台 Windows Vista 和 7 机器上看到了相同的行为。

有什么想法我做错了什么,或者我可能会进行哪些进一步的测试来缩小范围?

USBlyzer 日志, USB CDC 堆栈, 测试项目

4

2 回答 2

3

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

我想这个故事的寓意是在假设您对更高级别的协议有问题之前检查基础知识。同样回想起来,硬件 USB 分析仪本来是值得投资的,当出现问题时,软件替代品似乎大多会吐出通用错误代码或根本不吐出任何东西。

于 2012-11-24T22:31:56.457 回答
2

停止输出端点可能会发生在主机端的输出缓冲区溢出时。您确定设备确实获取了它通过输出端点接收的数据 - 如果是这样,它获取数据的速度至少与发送到设备的数据一样快吗?

请注意,即使在我开始发送“大量”数据之前,该设备似乎也可以长时间正常工作。

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

于 2012-11-12T20:49:02.847 回答