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 各种类传输为目标即可。

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
USB HID(Human Interface Device)是一种用于连接计算机和外部人机交互设备(如键盘、鼠标、游戏手柄等)的通信协议USB HID协议定义了数据传输的格式和规范,使得外部设备可以与计算机进行通信和交互。 USB HID协议使用了报告描述符(Report Descriptor)来定义设备的功能和数据格式。报告描述符包括输入报告和输出报告,分别用于接收计算机发送的数据和向计算机发送数据。每个报告都有特定的格式,包括报告ID、数据位宽、数据类型等,用于描述设备的功能和数据结构USB HID协议通过使用标准的USB传输层,实现了设备与计算机之间的通信。设备通过发送相应的报告给计算机,来告诉它设备当前的状态和用户操作。计算机则可以根据设备的报告数据,进行相应的处理和响应。 USB HID协议支持灵活的数据传输方式,可以通过中断传输和控制传输实现设备与计算机之间的数据交换。中断传输具有周期性的特点,用于实时传输设备的状态信息和用户操作;而控制传输则用于设备和计算机之间的命令和控制信息的传递。 USB HID协议的优势在于它是一个通用的协议,适用于多种不同类型的人机交互设备。它简化了设备的开发和驱动的编写,提高了设备的兼容性和易用性。同时,USB HID协议也支持多个设备同时连接到计算机,实现多设备的同时交互。 总之,USB HID协议是一种用于连接计算机和外部人机交互设备的通信协议,通过定义数据格式和传输规范,实现了设备与计算机之间的通信和交互。它的优势在于灵活、通用和易用,能够支持多种不同类型的设备,并提供了无缝的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值