USB2.0 事务
2021-11-30
5734
4
一个USB事务一般包含三个包:
- 令牌包,指名了该事务的传输的类型,包括目标设备的地址和端点。
- 数据包,有些事务可以没有数据,数据的长度不得超过该端点的最大包大小。
- 握手包,对有数据或无数据传输的结果进行反馈,如SET_ADDRESS请求就无数据包。
从以上的解释可以看到,一个USB事务是一次数据的可靠传输,数据的可靠性使用握手包来实现。
USB事务与传输
在USB的概念中还有另一个叫做传输,传输我们分为控制传输、同步传输、批量传输和中断传输。
这里以控制传输为例,对于控制传输,一般是都有一个叫做传输类型的字段,这个在USB请求中叫做bRequest,关于更多的USB请求可见:
- USB 标准请求:http://www.usbzh.com/article/detail-417.html
- USB标准请求、类特定请求总结:http://www.usbzh.com/article/detail-690.html
我们知道,控制传输使用的是端点0来进行数据传输的,所以这个地址我们在设备端IN端点地址是0x80,OUT端点地址是0x00。
我们知道,端点0(包括输入输出)的数据长度一般不会太多,USB2.0高速的最大为64字节,所以对于像获取描述符特别是数据量大的描述符如配置描述符,是需要分事务传输的。即一次传输包含多个事务,分别为SETUP事务、IN事务(0)、IN事务(1)…IN事务(N)直到把所有的配置描述符内容传输完成。
这里我们看一个例子,该设备的设备描述符内容如下:
可以看到,端点0的最大长度为8字节。
所以在获取配配置描述符的前9个字节的时候,是需要3个有效的事务来完成数据传输,第一个事务用来传输SETUP令牌包,第二个使用IN令牌包传输8个字节,第三个事务使用IN令牌包传输1个字节。
- 事务169是使用SETUP事务,用来由主机发设备发送获取配置描述符,数据使用DATA0来携带。
- 事务170是使用IN事务,由于端点0最大长度为8字节,所以这个IN事务返回配置描述符的前8个字节。
- 事务171是IN事务,返回请求的配置描述符9个长度中的最后一个字节。
- 关于事务224,可以参见:USB数据长度为0的DATA/IN事务 http://www.usbzh.com/article/detail-624.html
USB事务的总结:
- USB事务是根据端点大小的进行数据传输的最小的可靠传输单元。
- USB传输由于需要传递的数据一般会大于端点大小,所以一数据传输会分成几个事务,而且USB所有数据传输都是由主机发起的,所以最前面也有一个令牌事务。
- USB事务保证了单次数据传输的可靠性,而多个事务(包括发送与接收数据)组成了一次可靠的USB传输,在控制传输中叫请求,在中断传输、批量传输或者同步传输中叫一个完整的数据包。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936