USB协议详解第24讲(USB包-控制传输包详解)
1.控制传输包结构
控制传输由三个阶段组成,设置阶段、可选的数据阶段、状态阶段,其中设置阶段由1个SETUP事务组成,数据阶段由0个或者多个IN/OUT事务组成,状态阶段由1个IN/OUT事务组成,其中每个阶段事务包结构有所不同,下图可以直观看出控制传输写传输的包结构组成。
2.设置阶段包详解
设置阶段由1个设置事务组成,SETUP事务由SETUP令牌包、DATA0数据包、ACK握手包组成。如下图所示。
2.1 SETUP令牌包
从上图可以知道SETUP PID为1101B,则补码校验为0010,在链路上传输先低后高则为,1011_0100(0xB4),下图为SETUP包的链路波形图。
2.2 DATA0 数据包
从上图可以知道DATA0 PID为0011B,则补码校验为1100,在链路上传输先低后高则为,1100_0011(0xC3),下图为DATA0数据包的链路波形图。
Setup Data就是DATA0数据包里面的8个字节的数据Data,包含主机的很多设置信息(数据传输方向、数据类型、目标类型、附加数据、数据阶段传输的数据长度等等),这8个字节含义如下,我们一一解析。
2.2.1 bmRequestType(向谁请求)
D7:传输方向
- 0 = 主机至设备;
- 1 = 设备至主机;
D6..5:命令类型
- D6D5=00:标准请求命令;
- D6D5=01:类请求命令;
- D6D5=10:用户定义命令;
- D6D5=11:保留。
D4..0:接受者类型
- 0=设备;
- 1=接口;
- 2=端点;
- 3=其它
- 4-31 保留
这个域表明此请求的特性。特别地,这个域表明了第二阶段控制传输方向。如果wLength域被设作0的话,表明没有数据传送阶段,那Direction位就会被忽略。
USB说明定义了一系列所有设备必须支持的标准请求,这些请求见下面表。另外,一个设备类可定义更多的请求,设备厂商也可定义设备支持的请求。
请求可以到设备、设备接口、设备端结点(endpoint)上。当指定的是接口或端点(endpoint)时,wIndex域指出哪个接口或端点。
2.2.2 bmRequest(什么请求)
此字段指定特定的请求类型,bmRequestType****字段中的Type和bmRequest可组合出不同设置,不能的设置,wValue、wIndex、wLength不同,不同设置数据阶段返回的数据含义也不同。
bmRequest请求类型表。
描述符类型表。
2.2.3 wValue
此域用来传送当前请求的参数,随请求不同而变。
2.2.4 wIndex
该字段的内容根据请求而有所不同。它用于将参数传递给设备,特定于请求。
当bmRequestType的Recipient字段为接口或端点时,wIndex域用来表明是哪一个接口或端结。
下图显示了用于指定端点时的wIndex格式。
Direction位(bit7)设置为0表示指定端点为OUT端点,设置为1表示指定端点为IN端点。
图9-3显示了用于指定接口时的wIndex格式.
2.2.5 wLength
wLength表明第二阶段的数据传输长度,第二阶段的数据传输方向由bmRequstType的Direction位指出。wLength域为0则表明无数据传输。在输入请求下,设备返回的数据长度不应多于wLength(但是可以少于),在输出请求下,wLength指出主机发出的真实的数据量。如果主机发送多于wLength的数据,设备会作出未知响应。
2.3 ACK数据包
3.可选的数据阶段包详解
数据阶段由0个或者多个IN/OUT事务组成。
3.1 如果第一阶段指定数据传输方向为设备到主机
如果第一阶段指定读(传输方向为设备到主机),则数据阶段会由连续的多个IN事务组成,事务和包协议结构如下图。
3.2 如果第一阶段数据传输方向为主机到设备(数据长度大于0)
如果第一阶段指定写(传输方向为主机到设备),则数据阶段会由连续的多个OUT事务组成,事务和包协议结构如下图。
3.3 如果第一阶段数据传输方向为主机到设备(数据长度为0)
如果第一阶段指定数据传输方向为主机到设备,并且长度为0,则无第二数据阶段,事务和包协议结构如下图。。
4.状态阶段包详解
状态阶段由1个OUT/IN事务组成。
4.1 如果第二阶段指定数据传输方向为设备到主机
如果第二阶段指定数据传输方向为设备到主机,则主机接收完毕数据后,主机请求一个OUT事务告诉设备数据的接收状态。
4.2 如果第二阶段指定数据传输方向为主机到设备(数据长度大于0)
如果第二阶段指定数据传输方向为主机到设备,则主机发送完毕数据后,主机请求一个IN事务请求设备数据接收状态。
4.3 如果第二阶段指定数据传输方向为主机到设备(数据长度为0)
如果第二阶段指定数据传输方向为主机到设备,请求传输数据长度为0,则主机发送完令牌包后,主机请求一个IN事务请求设备数据接收状态。