This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1290NCZAD:USB 发送缓冲区大小问题、通用 USBBufferWrite

Guru**** 2511985 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/823786/tm4c1290nczad-problems-with-usb-transmit-buffer-size-general-usbbufferwrite

器件型号:TM4C1290NCZAD

你好。 我正在尝试通过 USB 为我的器件设置数据传输。 我具有此功能、并将其传输到 LabWindow CVI GUI。

它基于计时器、设置为600Hz。 在每次调用 USBBufferWrite 之前、我都会设置一个标志来阻止来自计时器的任何其他传输。 然后、 在我的 TX 处理程序中发生 USB_EVENT_TX_COMPLETE 事件时、我清除该标志。 这样、我就设置了一个阻塞传输(虽然阻塞可能不是正确的字、但它不允许在缓冲区中同时进行多个传输)。 我将发送一个数据结构、因此我知道它的确切大小(310字节)。

将我的 TX 缓冲区大小设置为结构的确切大小是不够的、但是、最后几个字节没有将其设置到 USB 主机(在本例中为计算机/GUI)(仅显示309个字节)。 这对我来说很好、因为我只是将缓冲区大小增加到了下一个2 (512)的功率、并且传输数据工作正常(至少同样、尚未达到600Hz)。 不过、如果有人回答了为什么不起作用、我会很乐意听到。

然后、我尝试将速度提高到600Hz、偶尔它会变得不同步、并且不会从 USBBufferWrite 发送完整字节数。 这对我来说是没有意义的、因为它应该被阻断、因此 TX 缓冲区应该足够容纳每次310个字节?

请注意、清除标志的唯一位置是在 USB_EVENT_TX_COMPLETE 中、调用 USBBufferWrite 的唯一位置是该计时器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Alexander、

     我会将您的问题转交给我们的 USB 专家。 他目前正在旅行,因此请期待他的答复有所延迟。  

     在全速(12Mb/s 或1.5Mb/s)时、考虑到传输过程中的相关开销、每毫秒最大字节为1216。 我从 Jan Axlson 的 USB 完整书中得到了1216个字节。 您尝试以600Hz 的速率传输512字节(基于您的缓冲区大小)、 这将转换为大约320字节/毫秒或320字节/帧。 我认为它在理论上的限制范围内。 但是、我并不感到惊讶的是、MCU 中引入了其他延迟、例如缓冲区管理或中断导致的延迟。 我认为 PC USB 主机可能还会为其他传输保留一些带宽。 不确定您是否有 USB 分析仪来判断瓶颈的位置。 这将极大地确定问题。 如果您没有 USB 分析仪、您能否分辨出什么频率(500Hz 或其他频率) 可以可靠地进行传输。 这将为我们的专家分析提供宝贵的信息。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我从我的代码中删除了大部分内容(可能会产生干扰的其他中断)。 就像这样、它以600Hz 的频率运行了16个小时、在 GUI 结束时、它有10个重复同步(意味着它错过了每个消息开头的4个同步字中的一部分)。 但在固件方面、它始终使用 USBBufferWrite 写入全部字节。 我可以确定当我使用 USBBufferWrite 并将该字节数传递给 USB 控制器时、它是否可以顺利地传递给主机?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Alexander、

     很高兴您取得了一些进展。 除了偶尔重新同步之外、它看起来基本上是正常工作的。 在我看来、重新同步问题与 USBBufferWrite 无关、而是需要研究的硬件问题。 主机和器件之间的同步将由硬件管理。 您是否可以在 LaunchPad 上使用相同的程序重复相同的重新同步问题? 您可以在您拥有的不同电路板上重复同样的问题吗? 如果您更换 USB 电缆会怎么样?

     我也不确定您是在全速模式还是高速模式下运行。 您说4个字节的同步字段。 对于全速、它仅为一个字节。 请参阅下面的全速同步字段 KJKJKK。 4字节同步用于高速 USB。 如果您有高速 USB、则必须使用外部 USB PHY、因为 MCU 内部的内部 PHY 不支持高速。 如果是这种情况、您将需要检查外部 PHY、并希望从您看到的解同步问题的供应商处寻求一些支持。 这是否正确理解了您的工作条件?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我所指的同步是我自己创建的一个数据包标头、它在开始时有4个同步字。 GUI 读取数据包并查看前4个字节、以查看它们是否为 Sync_words。 我正在使用内部 USB 控制器、没有外部 PHY。

    我的设置:

    我有一个复合 DFU/CDC 器件。 CDC 设置为  

      注:波特率=3686400

    然后、我生成的每条消息在开头都有一个 msg_header。

    目前无法在 Launchpad、其他电路板或其他电源线上进行测试。 我明天可以尝试一下。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Alexander Wardlow"]注意,清除标志的唯一位置是在 USB_EVENT_TX_COMPLETE 中,调用 USBBufferWrite 的唯一位置是该计时器

     我通过   布尔开关清零/置位、使用更大的缓冲器(4096KB)尝试了相同的基本流量控制。 它 在几次传输(UBS 写入缓冲器)中工作正常、然后每次崩溃。 布尔开关无法从事件消息回调中正常工作的原因没有逻辑意义。 主机/客户端端点0 控制似乎是异步的。 据说 TX 完成不用于其他 USB 协议用途、不开个玩笑!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在其他板上尝试过它、结果相同。 这里的主要问题似乎是、由于某种原因、我的布尔值/开关应能防止所有传输同时发生、似乎无法正常工作。 同样感谢 BP101对其进行测试。  

    我在发送时暂停了电路板并检查了缓冲器。 它从一个帧的一部分末尾开始、然后是另一个帧、大部分是三分之一。 我不明白这个缓冲器怎么会有超过1帧、但确实如此。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Alexander、

    [引用 USER="Alexander Wardlow">我能否确定当我使用 USBBufferWrite 并将该字节数传递给 USB 控制器时、它是否会顺利地传递给主机? [/报价]

    这可能取决于事务的大小。 不久前、我们发现了因应用程序无法事先告知 usblib 数据包中正在传输的字节数量、usblib 有一个奇怪的地方、 由于库认为零长度数据包已完成数据传输、因此偶尔会错误地发送零长度数据包。 这是因为如果最后一个数据包是最大大小的数据包、则应按照 USB 标准发送零长度数据包。 但是如果数据加载速度太慢、那么 usblib 会提前发出一个数据、因为它不知道何时应该完成传输。

    虽然这似乎没有造成任何真正的问题、但有几个其他客户过去曾看到过这种行为、但我们直到最近才了解这种行为的原因、而且从未对其应用程序产生负面影响。

    这可能是导致您正在观察的重新同步的行为。

    如果使用 USBBufferWrite、则应能够通过将此调用放在 USBBufferWrite API 之前来避免发生这些 ZLP。

    while (USBDCDCTxPacketAvailable (txBuffer.pvCBData)=0); 

    看看这是否解决了重新同步问题。