USB 域,包,事务及传输
- 域组成包
- 包组成事务
- 事务组成传输
字节序
LSB
概览
域
通常来说有八个
- SYNC
- PID
- ADDR
- ENDP:
- FRAME
- DATA
- CRC
- EOP
多个域组成包,USB 的包分为四大类
- token:令牌包
- data:数据包
- handshake:握手包
- special:特殊包
多个包组成不同的事务,事务通常有三个
- setup 事务
- out 事务
- in 事务
多个事务组成传输,共有四类传输
- 批量传输:bulk transaction
- 控制传输:control transaction
- 中断传输:interrupt transaction
- 等时传输:isochronous transaction
域
如下图所⽰,USB 通常有八个,即同步域 (SYNC)、包标识 (PID)、地址域 (ADDR)、端点域 (ENDP)、帧号域 (FRAME)、数据域 (DATA),校验域 (CRC),包结束 (EOP)。
注意,并不是每个 USB 包都包含上述的八个域,也就是说有些包只包含其中的⼏个域。
SYNC | PID | ADDR | ENDP | FRAME | DATA | CRC | EOP |
---|---|---|---|---|---|---|---|
8/32 bits | 8 bits | 7 bits | 4 bits | 11 bis | 0-1024 bytes | 5/16 bits | — |
-
SYNC
同步域主要是通知对⽅数据传输开始,并提供同步时钟。对于低速设备和全速设备,同步域使⽤的是 00000001(⼆进制数);对于⾼速设备使⽤的是 00000000 00000000 00000000 00000001。 -
PID
包标识主要⽤于标识包的类型,由 8 位组成:低 4 位是 PID 编码,⾼ 4 位是校验字段,是对低 4 位取反得到,USB 中各种包是通过 PID 字段来区分 -
ADDR
由于接⼊ USB 总线的设备可能有多个,因此需要引⼊地址域,以便于区分当前通信的设备是哪个设备。地址域包含 7 个数据位,最多可以指定 128 个地址,地址 0 ⽤作缺省地址,不分配给 USB 设备。对于 USB 总线上的每个设备,地址唯⼀ -
ENDP:
端点域⽤于指定 USB 总线上某个设备的⼀个端点号,包含 4 个数据位;全速 / ⾼速设备最多可以含有 16 个端点,低速设备最多含有 3 个端点。所有 USB 设备都必须含有⼀个端点号为 0 的端点,⽤于主机与设备间交换基本信息。除端点 0 外,其余的端点都是具体 USB 设备所特有的。地址域和端点域组合,明确了主机与设备间通信的通道。 -
FRAME
帧号字段⽤于指出当前帧的帧号,它仅在每帧 / 微帧开始的 SOF 令牌包中被发送,其数据位⻓度为 11 位,每传输⼀帧,主机就将其加 1。全速设备每毫米产生一个帧,高速设备每 125us 产生一个微帧,即每毫秒 8 个微帧 -
DATA
数据字段包含主机和 USB 设备间需要传输的数据,以字节为单位,最⼤⻓度为 1024,⽽实际⻓度取决于传输的具体情况。 -
CRC
校验域主要是为了校验通信数据的正确性。USB 令牌包和数据包中都使⽤了 CRC。但是,CRC 是发送⽅在进⾏位填充之前产⽣的,这样要求接收⽅在去除位填充之后,再对 CRC 字段进⾏译码。信息包中的 PID 字段本⾝含有校验,所以 CRC 计算不包含有 PID 部分。令牌包的 CRC 采⽤的是 5 位 CRC,数据包中的数据字段使⽤的是 16 位 CRC -
EOP
全速 / 低速设备的 EOP 是一个大约 2 个数据位宽度的单端 0(SE0) 信号,高速设备的 EOP 使用故意的位填充错误来表示
一个包被分成不同的域
包
域组成包
包 (Packet) 是 USB 系统中信息传输的基本单元,所以传输的数据都是以包为基本单位的
USB 的包分为四大类
- token:令牌包
- data:数据包
- handshake:握手包
- special:特殊包
下图为 USB2.0 规范文档中提供的包的描述
token 令牌包
令牌包有 4 种
- OUT
- IN
- SOF
- SETUP
SOF 令牌
SYNC | PID | FRAME | CRC5 | EOP |
---|---|---|---|---|
8/32 bits | 8 bits | 11 bis | 5 bits | — |
OUT 令牌 IN 令牌及 SETUP 令牌
SYNC | PID | ADDR | ENDP | CRC5 | EOP |
---|---|---|---|---|---|
8/32 bits | 8 bits | 7 bits | 4 bits | 5 bits | — |
OUT 令牌,IN 令牌及 SETUP 令牌的数据包格式是一样的
data 数据包
数据包有 4 种
- DATA0
- DATA1
- DATA2
- MDATA
SYNC | PID | byte0 | byte1 | … | byte N | CRC16 | EOP |
---|---|---|---|---|---|---|---|
8/32 bits | 8 bits | 1 byte | 1 byte | 1 byte | 1 byte | 16 bits | — |
不同速度的数据负载
- low speed:8 bytes
- full speed:1023 bytes
- high speed:1024 bytes
handshake 握手包
握手包有 4 种
- ACK
- NAK
- STALL
- NYET
SYNC | PID | EOP |
---|---|---|
8/32 bits | 8 bits | — |
special 特殊包
握手包有 4 种
- PRE:token
- ERR:handshake
- SPLIT:token
- PING:token
事务
包组成事务
事务组成
事务是由 2 个或者 3 个 包组成:令牌包,数据包,握手包
- 令牌包用来启动一个事务,总是由主机发送
- 数据包传送数据,可以从主机到设备,也可以从设备到主机,方向由令牌包来决定
- 握⼿包的发送者通常为数据接收者,当数据正确接收后,发送握⼿包,设备也可以使⽤ NACK 表⽰数据未准备好
注意,SOF 只是指⽰⼀帧的开始,⽆有效数据,并不是⼀次事务;EOF 帧发送结束后的⼀种电平状态,也不是事务
setup 事务
setup 事务处理并定义了 Host 与 Device 之间的特殊的数据传输,它仅适⽤于 USB 控制传输的建⽴阶段。如下图所⽰,设置事务通常有三种状态,即正常设置事务、设备忙设置事务和设备出错设置事务,正确的设置事务包括令牌、数据和握⼿三个阶段。
正常设置事务(握手包为 ACK)
设备忙设置事务(握手包为 NACK)
设备出错设置事务(握手包为 STALL)
out 事务
out 事务是主机向 USB 设备的某个端点中发送数据的过程,如下图所⽰,⼀个输出事务有三种状态,即正常的输出事务、设备忙时的输出事务和设备出错时的输出事务。正确的输出事务包括令牌、数据和握⼿三个阶段
正常的输出事务(握手包为 ACK)
设备忙时的输出事务(握手包为 NACK)
设备出错时的输出事务(握手包为 STALL)
in 事务
in 事务是主机从 USB 设备的某个端点中获取数据的过程,如下图所⽰,⼀个输⼊事务有三种状态,即正常的输⼊事务、设备忙或⽆数据时的输⼊事务和设备出错时的输⼊事务,正确的输⼊事务包括令牌包、数据包和握⼿包三个阶段
正常的输⼊事务(握手包为 ACK)
设备忙或⽆数据时的输⼊事务(握手包为 NAK)
设备出错时的输⼊事务(握手包为 STALL)
示例
上述抓包数据中,共有三次控制传输过程
第一次 setup 事务
SETUP 令牌包 + DATA0 数据包 + ACK 握手包
- 令牌包数据:2D 00 10
PID | ADDR | ENDP | CRC5 |
---|---|---|---|
2DH(00101101B) | 7 bits | 4 bits | 5 bits |
PID[3:0]
为 1101B 即 SETUP 令牌,通知设备将要开始一个控制传输
- 数据包数据:C3 80 06 00 01 00 00 40 00 DD 94
PID | byte0 | byte1 | … | byte N | CRC16 | EOP |
---|---|---|---|---|---|---|
C3H(11000011B) | 80 | 06 | 00 | DD 94 | — |
PID[3:0]
为 0011B 即 DATA0 数据包,主机输出的数据为:80 06 00 01 00 00 40 00
- 握手包数据:D2
PID |
---|
D2H(11010010B) |
PID[3:0]
为 0010B 即 ACK 握手包
第二次 in 事务
IN 令牌包 + DATA1 数据包 + ACK 握手包
- 令牌包数据:69 00 10
PID | ADDR | ENDP | CRC5 |
---|---|---|---|
69H(01101001B) | 7 bits | 4 bits | 5 bits |
PID[3:0]
为 1001B 即 IN 令牌,通知设备将要输入数据
- 数据包数据:4B 12 01 10 01 00 00 00 08 11 77
PID | byte0 | byte1 | … | byte N | CRC16 | EOP |
---|---|---|---|---|---|---|
4BH(01001011B) | 12 | 01 | 08 | 11 77 | — |
PID[3:0]
为 1011B 即 DATA1 数据包,输入到主机的数据为:12 01 10 01 00 00 00 08
- 握手包数据:D2
PID |
---|
D2H(11010010B) |
PID[3:0]
为 0010B 即 ACK 握手包
第三次 out 事务
OUT 令牌包 + DATA1 数据包 + ACK 握手包
- 令牌包数据:E1 00 10
PID | ADDR | ENDP | CRC5 |
---|---|---|---|
E1(11100001B) | 7 bits | 4 bits | 5 bits |
PID[3:0]
为 0001B 即 OUT 令牌,通知设备将要输出数据
- 数据包数据:4B 00 00
PID | CRC16 |
---|---|
4BH(01001011B) | 00 00 |
PID[3:0]
为 1011B 即 DATA1 数据包,主机没有输出任何数据。
- 握手包数据:D2
PID |
---|
D2H(11010010B) |
PID[3:0]
为 0010B 即 ACK 握手包
传输
事务构成传输
下文中所有的图片来自 USB2.0 spec
批量传输
- 令牌包 + 数据包 + 握手包
控制传输
- 令牌包 + 数据包 + 握手包
中断传输
- 令牌包 + 数据包 + 握手包
等时传输
- 令牌包 + 数据包
等时传输并没有应答包,数据是否正确,可以由数据包的 CRC 校验来确认。至于出错的数据如何处理,由软件来决定。