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.

[参考译文] TM4C123GE6PM:USB 器件-批量-双缓冲数据包帮助

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1179154/tm4c123ge6pm-usb-device---bulk---double-buffering-packet-help

器件型号:TM4C123GE6PM

您好!

在阅读有关器件模式下 USB 控制器的数据表时、我注意到端点分配了4K 的 ram/fifo 以及单缓冲/双缓冲模式。  当总线不忙于数据传输时、我尝试使用批量传输来使用允许的最大可用带宽。  这提高了数据包的吞吐量、因为批量传输每帧可发送超过一个64字节的数据包。  因此、我想使用批量模式、以便在 USB 2.0器件模式下在 MCU 上获得最佳吞吐量。

尽管如此、我还是很担心、并有一些问题。

1.数据表/UG 指出为端点分配的 FIFO 空间为4K。  这是否意味着所有活动端点都将共享该 RAM、或者如果需要、每个端点都可以拥有自己的4K 缓冲器?

2.如18.3.1.2节及其后所述的双缓冲模式意味着只能将2个数据包(2个64字节的块)装载到端点缓冲区中。  这是否意味着带宽限制为每帧发送2个大容量数据包?  这似乎非常糟糕、因为如果帧中有足够的未使用带宽、批量传输的目的是发送(我认为)大约19个数据包?  我觉得我缺少了一些东西、因为这实际上只是2x HID 的吞吐量提高、这非常慢。   

3.根据上面的问题#2,是否有办法将多个数据包加载到端点 FIFO 中,以便能够最大程度地利用批量数据包(当然取决于总线)?  我从主机方面的理解是、如果有空间、主机将继续为当前传输获取更多数据包、 并且器件必须确保这些数据包立即可用。  这很重要、因为(我认为)如果有可用空间、MCU 无法中断以获取该帧的额外数据-从我的研究中、似乎其他数据包必须位于 FIFO 中。

非常感谢您的帮助!

谢谢!

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

    您好!

    [引用 userid="482605" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1179154/tm4c123ge6pm-usb-device---bulk---double-buffering-packet-help ]1. 数据表/UG 指出为端点分配的 FIFO 空间为4K。  这是否意味着所有活动端点都将共享该 RAM、或者每个端点可以根据需要拥有自己的4K 缓冲器?

    没错。 所有活动端点共享同一4K FIFO 存储器。  

    [引用 userid="482605" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1179154/tm4c123ge6pm-usb-device---bulk---double-buffering-packet-help ]2. 第18.3.1.2节及其后的双缓冲模式意味着您只能将2个数据包(2个64字节的块)加载到端点缓冲区中。  这是否意味着带宽限制为每帧发送2个大容量数据包?  这似乎非常糟糕、因为如果帧中有足够的未使用带宽、批量传输的目的是发送(我认为)大约19个数据包?  我觉得我缺少了一些东西、因为这实际上只是2个 HID 的吞吐量提高、这非常慢。[/引述]

    对于批量传输、全速传输的最大数据包大小为64字节。 这实际上符合 USB 规范。 如果您有要传输的千字节数据、它们将被分成多个64字节的事务、这些事务构成 USB 传输。 有关批量传输的详细信息、请参阅此链接。  

    https://www.beyondlogic.org/usbnutshell/usb4.shtml#Bulk

    [引用 userid="482605" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1179154/tm4c123ge6pm-usb-device---bulk---double-buffering-packet-help ]3. 根据上面的问题2 -是否有方法可以将许多数据包加载到端点 FIFO 中、以便能够最大程度地利用批量数据(当然取决于总线)?  我从主机方面的理解是、如果有空间、主机将继续为当前传输获取更多数据包、 并且器件必须确保这些数据包立即可用。  这很重要、因为(我认为)如果有可用空间、MCU 无法中断获取该帧的额外数据-从我的研究中、似乎其他数据包必须位于 FIFO 中。

    如果批量传输没有被更高优先级的传输(如等时传输或中断传输)中断、那么它将传输尽可能多的数据包(每包64字节)以利用带宽。 下面是从上述链接 I 共享的批量传输。  

    批量传输

    批量传输可用于大量突发数据。 此类示例可能包括发送到打印机的打印作业或从扫描仪生成的图像。 批量传输以数据有效载荷上的 CRC16字段的形式提供错误校正和错误检测/重新传输机制、确保数据的传输和接收无误。

    在分配所有其他事务后、批量传输将使用总线上的未分配备用带宽。 如果总线正忙于等时和/或中断、那么批量数据可能会缓慢地在总线上涓流。 因此、批量传输只能用于对时间不敏感的通信、因为不能保证延迟。

    批量传输

          • 用于传输大量突发数据。
          • 通过 CRC 进行错误检测、并保证交付。
          • 无法保证带宽或最小延迟。
          • 流管-单向
          • 仅限全速和高速模式。

    批量传输仅受全速和高速器件支持。 对于全速端点、最大批量数据包大小为8、16、32或64字节长。 对于高速端点、最大包长可达512字节。 如果数据有效载荷低于最大数据包大小、则不需要用零填充。 当批量传输传输所请求的数据的精确数量、传输的数据包小于最大端点大小、或者传输零长度的数据包时、视为已完成。

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

    您好、Charles、

    感谢您的回答。  长话短说、我想知道您是否可以将超过两个64字节的数据包加载到端点 FIFO 中进行 USB 全速批量传输?  数据表双缓冲说明让我认为您不能。  这很重要、因为我认为数据需要位于端点 FIFO 中、主机才能拉出多个数据包。  因此、如果我传输的数据包数量为100兆字节、我希望端点缓冲区保持满、以便主机始终拥有大量数据包、如果该帧中的空间允许、主机可以将其拉出。  不确定这是否非常清楚、但我的问题是、如果可能、我将无法加载/发送10个数据包、因为 MCU 仅支持从双缓冲区为每个端点加载两个数据包。

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

    您好、Robert、

     FIFO 用于 在 USB 传输 发送到总线时缓冲新数据。 如果您有10个数据包要发送、那么它将在先前的数据包被发送到总线时一次缓冲两个数据包。 无需缓冲10个数据包。 由于 FIFO 或任何存储器都受限、因此不可能一次全部缓冲 N 个数据包。  

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

    好的、但这里的问题是、批量传输的好处是您每次传输发送2个以上的数据包。  因此、如果 MCU 在每个事务处理结束时一次只能馈送2个数据包、那么批量传输就不会有太多的影响。  我只是在努力了解、使用这种架构、如果 Tiva 一次只能为批量端点发送两个数据包、那么 Tiva 如何利用批量端点的潜力。

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

    您好、Robert、

     我认为我们需要澄清什么是交易。 "传输"由一个令牌包、数据包和一个握手包组成。  请参阅我所指的 USB 链接。 在此事务中、批量传输配置的数据包为64字节。 如果您有10个数据包要传输、则此 USB 传输包含10个事务。  如果 只有一个端点配置为批量传输、您将在 USB 总线10上看到连续传输64字节数据包的事务。 当然、如果您有其他端点配置为等时传输或中断传输、它们可以中断批量传输、因为等时传输可保证 USB 协议的带宽。  

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

    以确保我们位于同一页面。 如果您认为一个事务可以包含2个或更多数据包、那么根据我的理解、这不是 USB 协议的工作方式。 例如、如果您认为 USB 事务包含一个令牌包-> 10个数据包(10 x 64 = 640字节)->握手包、则这不是定义的 USB 协议。  

    USB 协议

    USB 是轮询总线、在该总线中、主机发起所有数据交换。

    事务

    数据在所谓 的事务中传输。 通常、它们由三个数据包组成:

    1.  令牌包包含定义传输类型和方向、器件地址和端点的报头。
    2. 数据在 数据包中传输
    3. 传输的最终状态在 握手数据包中进行确认

    管道模型

    在传输过程中、数据可以从 USB 主机传输到 USB 设备、也可以从 USB 主机传输到 USB 设备。 传输方向在从 USB 主机发送的令牌包中指定。 然后、源发送一个数据包或指示它没有要传输的数据。 通常、目的设备用一个表明传输是否成功的握手数据包进行响应。

    数据包模型

    数据包

    可以 将数据包视为数据传输的最小元素。 每个数据包以当前传输速率传输一个整数字节数。 数据包以同步模式开始、然后是数据包的数据字节、最后是数据包结束(EOP)信号。 所有的 USB 数据包模式首先传输 最低有效位。 在数据包之前和之后、总线处于 空闲 状态。

    帧起始(SOF)数据包

    一个特殊的数据包是 帧起始 数据包(SOF)、它将 USB 总线分割成时间段。 每个管道在每个帧中分配一个插槽。 每1ms 在全速链路上发送一次帧起始数据包。 在高速时、1ms 帧被分成8微帧、每个微帧为125μs μ s。 帧起始数据包在每个微帧的开头使用相同的帧编号发送。 帧编号每1ms 递增一次。

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

    您好、Charles、

    我认为我的术语相当不清楚、在这里会引起混淆。  让我退一步、在花更多时间使用您提供的资源后重新评估我的问题。  这很有帮助、很可能我会感到困惑。   

    非常感谢您的帮助。  我会再回来,并在进一步检讨后公布。  

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

    您好、Charles、

    我想我理解、好消息是我感到困惑、Tiva 系列将起作用。  我将详细说明、以便您验证我是否正确理解了这一点。

    我最初担心吞吐量不必要地低、因为我认为数据包实际上是错误的交易。  因此、由于这个错误、我认为只有两个数据包(本应使用"事务")适合"帧"的1ms 轮询速率。  我认为1ms 时间块是一个帧。  这是一个链接、它似乎以与我相同的方式引用了"帧"。

    https://www.usbmadesimple.co.uk/ums_6.htm#frames_and_microframes

    总结一下我的困惑。  我认为 MCU 在一个帧中只能容纳2个 USB 2.0大容量数据包(64字节数据包)。  这是不正确的、我相信我现在看到了这是如何工作的、MCU 将能够处理好事情。

    如果我正确理解、MCU 将加载端点缓冲区、其中包含64字节的数据、以传输到主机(在此处的示例中)。  该数据成为总线上一个事务中的数据包。  如上所示、每个事务有3个数据包。  一旦发生这种情况( 主机读取端点)、就会引发一个中断、以在下 一次传输中使用更多数据重新加载端点缓冲区。  MCU 将有时间在每个事务中的数据包之间提取新的64字节块、事务将填充一个帧。   

    简而言之、MCU 会在每次事务后重新加载端点缓冲器、并且 MCU 会有足够的时间将下一个数据包的数据填充到缓冲器中。  如果帧内有空间、主机将继续发出读取事务、而 MCU 将继续为这些事务加载数据。   

    至于双缓冲、这只允许您为下一个事务的数据包保留一个额外的数据块。  因此、如果使用双缓冲、端点保存两个数据包(数据包数据)、这基本上意味着可以处理两个背靠背的数据传输?  如果这是真的、现在这是有道理的、我觉得数据包与事务相混淆。   

    因此、大数据传输(批量传输时尽可能高效)的大问题在于 MCU 只需为端点缓冲区提供服务(填充)数据即可支持数据传输。  主机将每帧使用尽可能多的事务。   

    如果此时我处于正确的轨道上、那么我的帖子是由于我认为双缓冲意味着每帧只能进行两次数据事务、而我现在看到的情况并非如此。   

    感谢 Charles 的支持!

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

    您好、Robert、

     您的理解是正确的。 很高兴一切都为您准备好了。