我已经为 Tiva TM4C1237编写了一个引导加载程序。 我使用 Python 程序对其进行测试。 我发现、经过专门调整的 USB 输出和输入事务组合始终如一地失败。
我正在使用小型 Python 程序 和 pyusb 通过 VID/PID 查找器件、并以交互方式发送 USB 请求以测试我的 Tiva 固件。 我可以向 EP0发送各种大小的输入和输出请求。 我发现这种交易组合始终失败:
- 到 EP0的输出事务、恰好是 max_packet_size 字节的任何(1..n)的倍数、后跟
- 到 EP0的输入事务、包含超过 max_packet_size 个字节。
在这些特定条件下、Out 交易成功、但随后的 In 交易将始终失败。 将任一事务大小偏离一个字节将防止发生故障。 发生故障后、后续的输入事务将经常继续失败、直到某个时候问题被清除、后续的输入事务将成功。
以下是一些特定的数值示例(max_packet_size 为64):
- 无论输入大小如何、这些都将成功、因为输出大小不是64的倍数:
- 输出63个字节、输入63个字节: 成功
- 输出63个字节、64个字节: 成功
- 输出63个字节、输入65个字节: 成功
- 输出100个字节、输入63 个字节: 成功
- 输出100个字节、64 个字节: 成功
- 输出100个字节、输入65 个字节: 成功
- 输出129个字节、输入512 个字节: 成功
- 无论输出大小如何、这些都将成功、因为输入大小不超过64:
- 输出64 字节、输入63字节: 成功
- 输出64 字节、输入64字节: 成功
- 输出128 个字节、64个字节: 成功
- 输出512字节、64字节: 成功
- 这些都失败了,因为输出正好是 n*64,其中 n=1、2、3、...,而输入超过64:
- 输出64 字节、输入65字节: 失败
- 输出64 字节、512 字节: 失败
- 输出128 字节、输出100 字节: 失败
- 输出512 字节、输入65 字节: 失败
经过进一步调查、我发现当发生输入故障时、是因为没有发生 USB 中断。
由于问题仅在非常特定的输出条件下发生、然后在中出现、我怀疑问题不在我的固件中。
我已经准备了一个最小 CCS 项目和 Python 程序来演示该问题、但该论坛不允许我附加这些文件、因此我不知道如何将它们提供给其他人。 我使用的是 CCS 版本11和 TivaWare_C_Series-2.2.0.295。