USB 批量/块传输方式
2020-09-15
12765
403
批量传输一般用于批量的和非实时的数据传输,通俗的来说就是用于数据量大但对时间要求又不高的场合的一种传输方式,类似用于USB打印机和USB扫描仪等等。
批量传输使用批量传输事务,一次批量传输事务分为三个阶段:令牌包阶段、数据包阶段、握手包阶段。
批量传输分为批量读和批量写,批量读使用批量输入事务,批量写使用批量输出事务。注意:不论输入还是输出都是以主机为参考的。
对于批量传输,如果启动批量传输,如果USB总线中有多余的总线带宽,批量传输会立即执行,但当带宽比较紧张时,批量传输会把带宽让给其它传输类型。所以批量传输的优先级相对其它传输优先级比较低。
批量传输数据包
- 只有全速和高速设备可以使用批量传输,低速模式不支持批量传输。
- 高速模式固定为512个字节;
- 全速模式最大包长可在8、16、32、64字节中选择;
- 超高速设备数据包最大长度为1024字节,批量传输端点应在其端点描述符中设置最大的数据包负载大小为 1024 字节。它还指定端点可以接受或者发送到超高速总线的突发大小。对于批量端点允许的突发大小应在 1 至 16 范围。
批量功能端点必须传输数据字段小于或等于 1024 字节的数据负载。如果批量传输有比之更多的数据,在突发事务交易的所有数据的有效载荷必须为 1024 字节长度,除了突发的最后一个数据有效载荷,它可能包含剩余数据。
如果传输的数据量大于端点所支持的最大数据包长度,USB主控制器会把该数据按最大数据包长度分为多个批量数据包进行传输,最后一个批量传输长度可以小于或等于最大包长度。
批量输出流程:
批量传输数据流传输包括IN传输和OUT传输,分别对应于数据的读和写,其也分为3个阶段,分别为为令牌阶段、数据段和握手段。
对于批量传输的最后一个IN事务:
- 如果USB主机收到的数据长度小于端点支持的最大包长度,那么USB主机认为数据已经接收完成。
- 如果USB主机收到的数据长度等于端点支持的最大包长度,需要额外的0数据的包,告诉USB主机数据已经接收完成。
比较全批量传输,速PING
令牌阶段
- 主机发送BULK令牌包,令牌包中包含设备地址、端点号和数据方向。
数据段
握手端设备
- 数据包正确,并有足够的空间保存数据:设备返回ACK握手包或NYET握手包(只有高速模式才有NYET握手包,它表示本次数据接收成功,但是没有能力接收下一次传输)。
- 数据包正确,但是没有足够的空间保存数据:设备返回NAK握手包。主机收到NAK,延时一段时间后,再重新进行批量输出事务。
- 数据包正确,但端点处于挂起状态:设备返回一个STALL握手包。
- 数据包错误:设备不返回任何握手包,让主机等待超时。
- CRC错误或位填充错误:设备不返回任何握手包,让主机等待超时。
USB批量传输抓包分析
USB批量读数据
由于批量读数据,是设备给主机传输数据,所以是数据阶段是IN事务。
USB批量写数据
因为是主机给设备传输数据,所以是数据阶段是OUT事务,如下图。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936