2017-09-22 83 views
0

这是我第一个使用WinUsb驱动程序和库的项目。WinUsb:写OUT管道导致IN管道中的数据损坏

我的主机运行WINDOWS 10,安装了所有更新。 我的高速设备运行三个数据端点: -OUT命令端点:主机使用它发送命令 -IN回复端点:主机收到每个命令的回复 -IN Stream端点:设备发送流数据, 1600字节与 周期10毫秒。

在主机应用程序中,有两个相关的主题: - 命令线程发送命令来命令管和 回复管收到回复 - 流线收集来自流管 非等待功能的数据被用于所有管道。

如果另一个线程被挂起,每个线程都可以完美工作。 但是,如果两个线程同时工作,则流数据在任意点出现损坏。

更多分析揭示了以下事实: - 损坏显示为连续的错误字节序列。 错误序列的长度大致对应于 命令和答复的长度。 - 错误的序列从与数据包边界无关的任意点开始。 - 错误的字节可能不同;有时候,他们都是零,有时他们看起来像垃圾。 - 时间分析表明,一旦命令发送到命令管道,就会发生损坏 。

效果消失如果我在线程之间实现同步,以便读/写操作及时分开。然而,这是不可接受的解决方案,我想要两个线程异步工作。 有人遇到过这种情况吗?

+0

没有什么理由怀疑这个图书馆,特别是考虑到它经常被敲打的频率以及它的功能有多少。设备固件出错的可能性更大。做什么都行。 –

+0

设备固件是我第一次猜测,特别是因为它也是我的项目的一部分。因此,我在传输之前和之后实施了对流缓冲区完整性的检查。没有发现问题。 –

+0

如果不是库或固件 - 那么只有硬件保留? –

回答

0

回答我的问题...

汉斯的意见是正确的,问题的根源在于固件。

有关设备固件开发人员的更多细节可能会很有趣,特别是如果他们像我一样使用Atmel Cortex M7系列。

在这个系列中,USB控制器包含用于端点缓冲的双端口RAM。 DPRAM仅由硬件分配和管理。固件通过设置端点控制寄存器中的ALLOC位来初始化分配。用户手册要求固件应按升序设置ALLOC位。在项目历史记录之后,我更改了端点描述符中的端点地址,但没有意识到此更改违反了DPRAM分配的升序。结果,端点缓冲区出现重叠,导致问题中描述的数据干扰。

修复了这个bug后,一切正常。