USB——域,包,事务及传输

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 规范文档中提供的包的描述

USB——域,包,事务及传输_第1张图片

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)
在这里插入图片描述

示例

USB——域,包,事务及传输_第2张图片
上述抓包数据中,共有三次控制传输过程

第一次 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

批量传输

  • 令牌包 + 数据包 + 握手包
    USB——域,包,事务及传输_第3张图片

控制传输

  • 令牌包 + 数据包 + 握手包
    USB——域,包,事务及传输_第4张图片

中断传输

  • 令牌包 + 数据包 + 握手包
    USB——域,包,事务及传输_第5张图片

等时传输

  • 令牌包 + 数据包
    USB——域,包,事务及传输_第6张图片
    等时传输并没有应答包,数据是否正确,可以由数据包的 CRC 校验来确认。至于出错的数据如何处理,由软件来决定。

你可能感兴趣的:(USB,USB,包,事务,传输)