USB协议传输结构

  USB作为数据通信标准,固件可分为枚举配置和类协议部分,枚举配置实现USB主机对设备的枚举和配置,类协议实现设备各自的数据传输。
  usb2.0协议chapter8 protocol layer

1 USB协议传输结构

  • 集合关系:传输类型 -> 事务 -> 包 -> 域
    • 传输类型: 控制、中断、同步、批量
    • 事务: IN、OUT、SETUP
    • 包: 令牌包、数据包、握手包
    • 域: 同步序列域、包标识域、地址域、端点域、帧号域、数据域、CRC校验域

注:
1、 USB基本数据结构是包,而包由不同的域构成,而不同的包又组成不同的传输类型。
2、 USB总线发送是LSB在前,MSB最后。

1.1

1.1.1
同步序列域(SYNC):

位于一个包的最开始处,8bit,固定0000 0001
这里写图片描述

1.1.2
标识域(PID):

  在同步域之后,标明包类型。8bit,LSB四位为标识码,MSB四位为标识码的反码。类型见下图。
这里写图片描述
  USB 协议1 .1 中, 定义了10 种不同类型的包。USB 协议2 .0 中则定义了全部16 种标识域。如下图所示,标橙色为2.0所有。
这里写图片描述

1.1.3
地址域(ADDR)

  由主机分配唯一地址,7bit,由于地址0保留用作初始化,因此地址最多有127个,也是usb结构中最大127个设备的原因。
这里写图片描述

1.1.4
端点域(ENDP):

  4bit,端点0必须作为控制端点,端点可被定义为IN、SETUP、OUT、PING端点,所有设备必须支持端点0作为默认的控制管道。低速设备最大支持3个管道,1个0端点和2个其他端点(可以是都是控制,一个控制一个中断也可以是两个中断)。高速全速支持最大16个输入输出管道。
这里写图片描述

1.1.5
帧号域(FRAM)

  11bit,每个帧都有一个特定帧号,帧号域最大容量为0x7FF
这里写图片描述

1.1.6
数据域(DATA)

  在不同的传输类型中,数据域的长度不同(0到1024Byte),但是必须为整数个字节的长度。
这里写图片描述

1.1.7
校验域(CRC)

  对令牌包和数据包中非PID域进行校验,令牌包使用CRC5(5bit),数据包使用CRC16(16bit)。

1.2
包(Packet)

  包( Packet )是最基本的USB 的数据单元, 由一系列的域组成。如前PID域所述, USB 中定义了4 种类型的包, 即令牌包、数据包、握手包和特殊包。
包是USB总线上数据传输的最小单位,不能被打断或干扰,否则会引发错误。若干个数据包组成一次事务传输,一次事务传输也不能打断,属于一次事务传输的几个包必须连续,不能跨帧完成。一次传输由一次到多次事务传输构成,可以跨帧完成。

1.2.1
令牌包( Token Packet )

IN、OUT、SETUP包结构是一样的,如下图
这里写图片描述
帧起始包机构,如下图
- frame:全速设备一帧1.00 ms ±0.0005 ms
- microframe:高速设备一帧125 μs ±0.0625 μs。
帧的起始由一个特定的包(SOF 包)表示,所有高速和全速还有hub都会收到SOF包,但是不会引起任何作用
这里写图片描述

split传输特殊令牌包(Split Token)

  在主机控制器和 HUB之间执行,通过分离传输,可以允许全速/低速设备连接到高速主机。分为start-split transaction (SSPLIT)和complete-split transaction (CSPLIT)。具体可看USB2.0协议8.4.2。

1.2.2
数据包(Data Packets)

  USB 发送数据包的时候, 如果一次发送数据长度大于端点容量时候, 就要把数据分成几个包, 分批发送。如果第一个数据包被确定为DATA0 , 那么第二个发送的数据包就应该是DATA1⋯⋯如此交替下去。而数据的接收方在接收数据时检查其类型是否是DA TA0、DATA1 交替的, 这是保证数据交换正确的机制之一。
但是当处于同步传输中,所有的数据包都是DATA0。
这里写图片描述
  所有的四个数据包用于高带宽高速同步端点,三个数据包(MDATA DATA0,DATA1)用于split事务传输。
所有数据包都是整数发送,CRC校验不包括PID域。允许数据包最大大小为低速8Byte,全速1023Byte,高速1024Byte。

1.2.3
握手包(Handshake Packets)

这里写图片描述

ACK

  • 标识域PID 被正确接收;
  • 并且没有发生数据位错误;
  • 没有发生数据域的CRC 校验错误等。
    一般由接收到数据的一方发出,主机和设备都可以发送
    ACK。

NACK

  • 在接到主机发来的OU T 命令后, 设备无法接收数据;
  • 接到主机的IN 命令, 但是设备没有数据发送给主机。
    NAK 只能由设备发送, 而不能由主机发送。

STALL

  • 设备无法发送数据;
  • 设备无法接收数据;
  • 不支持某一种控制管道的命令
    STALL 也只能是由设备来发送,NAK 是USB 的一种暂时状态, 当设备处于“ 忙”的工作状态时, 就会发送NAK。等到设备处于空闲状态。这时, 如果主机再要求设备发送或接收数据时, 设备不再返回NAK, 而是进行正常的数据传输。而STALL 与NAK 不同, STALL所表示的传送失败的意义更加严重。当在控制传输中出现STALL 后, 主机就会丢弃所有发给设备的控制命令, 而且要重新进行控制传输后, 才能停止STALL 状态。

NYET

ERR

1.3
事务

  事务分为IN,OUT,SETUP3个事务。每个事务由令牌包,数据包,握手包3个阶段构成。事务3个阶段如下:
  1)令牌包阶段:启动一个输入,输出或设置的事务。
  2)数据包阶段:按输入,输出发送相应的数据。
  3)握手包阶段:返回数据接收情况,在同步传输的IN事务和OUT事务中没有这个阶段。

1.3.1 事务的3种类型

IN事务:

  令牌包阶段–主机发送一个PID为IN的输入包给设备,通知设备要往主机发送数据。
  数据包阶段–设备根据情况会做出3种反应:
  a. 设备端点正常,设备往主机内发出数据,DATA0和DATA1交替发送。
  b. 设备正在繁忙,无法往主机发出数据包,此时发送NAK无效包,IN事务提前结束,到了下一个IN事务才继续。
  c. 相应设备端点被禁止,此时发送STALL错误包,事务提前结束,总线进入空闲状态。
  握手包阶段–主机在正确接收到数据后,就会向设备发送ACK包。

OUT事务:

  令牌包阶段–主机发送一个PID为OUT的输出包给设备,通知设备要接收主机数据。
  数据包阶段–主机交替发送数据DATA0和DATA1。
  握手包阶段–设备根据情况做出3种反应:
  a. 设备端点接收正确,设备向主机返回ACK包,通知主机可以发送新的数据,如果数据包发送了CRC校验数据,将不返回任何握手信息。
  b. 设备正在忙碌,无法从主机接收数据包就发送NAK无效包,通知主机再次发送数据。
  c. 相应设备端点被禁止,发送错误STALL包,事务提前结束,总线直接进入空闲状态。

SETUP事务:

  令牌包阶段–主机发送一个PID为SETUP的输出包给设备,通知设备要接收数据。
  数据包阶段–主机设备发送数据,注意这里只有一个固定为8个字节的DATA0包,其中就是标准的USB设备请求指令。
  握手包阶段–设备接收到主机的命令信息后,返回ACK包,此后总线进入空闲状态,并准备下一个传输。一般来说,在SETUP事务后面通常是一个IN或OUT事务构成的传输。

1.4
传输类型

USB 定义了4 种数据传输的类型:控制传输、中断传输、批量传输和同步传输。任何一种传输都是由上面的3 种事务所组成的,传输类型由一笔或者多笔事务完成。
USB 把事务分为IN、OU T 和SET UP 3 种类型, 但在每一种传输类型中, 这些相同事务结果并不是完全一样。比如,同步传输IN 事务和中断传输IN事务就有差别。

1.4.1
批量传输(Bulk Transactions)

  • 由IN 事务或OU T 事务构成
  • 翻转同步:发送端按DATA0-DATA1-DATA0-…顺序发送数据包,只有成功的事务传输才会导致 PID 翻转,发送端只有在接收到 ACK 后才会翻转 PID,发送下一个数据包,否则会重试本次事务传输。同样,若在接收端发现接收到到的数据包不是按照此顺序翻转的,比如连续收到两个 DATA0,那么接收端认为第二个 DATA0 是前一个 DATA0 的重传。
  • 没有固定传输速率,不占固定带宽
  • PING事务是USB2.0高速模式特有的,全速模式和低速模式没有
  • 全速和高速设备支持批量传输, 而低速设备不支持
    这里写图片描述

数据包大小

  • 数据包大小可设定为8、16、32、64字节,高速设备必须设定为512字节除了最后一个包

1.4.2
中断传输(Inte r rupt T ransfer)

  • IN 事务或OU T 事务组成。
  • 除了不支持PING之外与批量传输一致
  • 主机根据中断端点描述符指定查询间隔发起中断传输。中断传输有较高的优先级,仅次于同步传输。
  • 没有固定传输速率,不占固定带宽
  • 全速设备可选轮询周期是1~255 ms , 低速设备轮询周期10~255 ms
    这里写图片描述

数据包大小

低速设备数据包大学1-8字节,全速1-64字节,高速1-1024字节

1.4.3
同步传输(Isochronous Transfer)

  • 只有IN和OUT事务
  • 没有握手包,总线优先保证占用带宽
  • 只使用DATA0
  • 数据包大小全速1-1023字节,高速1024字节
  • 低速设备不支持
    这里写图片描述
    全速设备的同步传输, 在1 个帧内, 可以包含1 笔IN 事务或OUT 事务, 而高速设备可以包含3 笔事务。总线将会优先保证同步传输的带宽, 甚至会因此而暂时中止批量传输的进行。

数据包大小

全速设备数据包的大小为0~1 023 字节, 而高速设备为1 024 字节

1.4.4
控制传输(Control Transfer)

  • 枚举阶段最主要的数据交换方式

结构

  • 初始设置阶段;
  • 可选数据阶段;
  • 状态信息阶段。

(1)初始设置阶段

这里写图片描述
上图可知,初始设置阶段也分为
令牌包阶段: 主机发送SETUP令牌包。
数据包阶段: 主机发送固定为8 个字节的DATA0 包, 并且有确定的结构, 将这8 个字节分配给5 种命令信息, 即bmRequestType、bRequest、wValue、wIndex 和wLength。具体看标准命令

这里写图片描述

(2)可选数据阶段

如果在上一步骤中的命令要求读/ 写数据的话, 就由这一步骤来具体交换数据。如果没有数据交换要求的, 这个步骤就可以省去。(由SETUP事务的数据包阶段发送的标准请求命令决定),当一个数据包阶段发送不了时候,就分多个数据包发送。
根据数据阶段的数据传输的方向,控制传输又可分为3种类型:
1) 控制读取(读取USB描述符)
2) 控制写入(配置USB设备)
3) 无数据控制

(3)状态信息阶段

  • 获取状态信息,由IN或OUT事务构成的传输
  • 传输方向相反,这里IN表示向设备里面传送数据,OUT表示数据向主机里送数据,这是为了和可选数据阶段向结合。
  • 数据包都是0长度

数据包大小

初始设置中, 1 个固定为8 字节大小的DATA0 包。可选数据步骤中, 低速设备,则数据包为8 字节; 全速设备数据包大小可以是8、16、32 和64 字节; 高速设备的数据包大小必须为64 字节。

2 数据流模型

2.1
端点( Endpoint )

  • 设备硬件上具有一定大小的数据缓冲区
  • 有惟一的地址和端点号
  • 端点0是设备的默认控制端点
  • 端点描述符中规定了端点所能支持的最大包长。
    控制传输:高速模式的最大包长固定为64个字节;全速模式可在8、16、32、64字节中选择;低速模式的最大包长固定为8个字节。
    批量传输:高速模式固定为512个字节;全速模式最大包长可在8、16、32、64字节中选择;低速模式不支持批量传输。
    同步传输:高速模式的最大包长上限为1024个字节;全速模式的最大包长上限为1023个字节;低速模式不支持同步传输。
    中断传输:告诉模式的最大包长上限为1024个字节;全速模式最大包长上限为64个字节;低速模式最大最大包长上限为8个字节。

2.2
管道( Pipe)

  • 管道就是主机与设备端点之间逻辑上的的连接
  • 管道的概念主要用于PC 上驱动程序和用户程序的编写

2.3
USB 数据传输过程

这里写图片描述
完整的数据传输过程: PC 上, 设备驱动程序通过调用USB 驱动程序接口USBD( USB Drive r Inter face) , 发出输入输出请求包IRP; 在USB 驱动程序接到请求之后, 调用主控制器驱动程序接口HCD( Host Cont roller Drive r Inte rface ) , 将IRP 转化为USB的传输。一个IRP 可以包含一个或多个USB 传输; 接着, 主控制器驱动程序将USB 传输分解为总线事务, 主控制器以包的形式发送给设备。这里各种驱动程序和IRP的概念, 都是基于PC 和其操作系统的, 当在设计嵌入式USB 主机的时候, 完全可以摆脱这种框架, 而仅以最简单的能够实现USB 各种类传输为目标即可。

发布了63 篇原创文章 · 获赞 32 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/hushiganghu/article/details/54906960