1、基本概念

  • 一次传输(控制、批量、中断、同步):由多个事务(Transaction)组成。
  • 一个事务(IN、OUT、SETUP):由一个或多个包(Packet)组成。

USB 数据在主机软件与 USB 设备特定的端点之间传输,主机软件与特定端点之间的关联叫做管道(Pipes)。一个 USB 设备可以拥有多个管道。


2、包 (Packet)

包(Packet)是 USB 系统中信息传输的基本单元,所有数据都必须打包后才能在总线上传输,且包只能在帧内传输。高速 USB 总线的帧周期为 125μs,全速与低速 USB 总线的帧周期为 1ms。帧的起始由专门的 SOF 包标识,帧尾为 EOF(EOF 不是一个包,而是一种电平状态,期间不允许传输数据)。

注意:虽然高速 USB 总线与全速/低速 USB 总线的帧周期不同,但 SOF 包中帧编号的递增速度是一样的。因为在高速 USB 系统中,SOF 包的帧编号实际取的是计数器的高 11 位,最低 3 位作为微帧(Microframe)编号未展示在帧号里,因此帧编号的递增周期同样为 1ms。

USB 总线上的传输时序如下:

USB 总线帧结构与包传输时序示意图

  • 包是 USB 总线上数据传输的最小单位,不能被打断或干扰,否则会引发错误。
  • 若干个数据包组成一次事务传输;一次事务传输也不能被打断,属于同一次事务的几个包必须连续,不能跨帧完成。
  • 一次完整的传输由一次或多次事务传输构成,可以跨帧完成。

USB 包由五部分组成:同步字段(SYNC)、包标识符字段(PID)、数据字段、循环冗余校验字段(CRC)和包结尾字段(EOP),基本格式如下图:

USB 包(Packet)基本格式与字段组成

2.1 PID 类型 (即包类型)

PID 编码表(Token 令牌类与 Data 数据类)

PID 编码表(Handshake 握手类与 Special 特殊类)

2.2 Token Packets (令牌包)

Token 令牌包格式定义(Token Format)

此格式适用于 IN、OUT、SETUP、PING,对应的传输方向如下:

PID 数据传输方向
IN Device -> Host
OUT Host -> Device
SETUP Host -> Device
PING Host -> Device(探测设备是否有空间接收数据)

2.3 Start-of-Frame (SOF) Packets

SOF 包由 Host 周期性发送给 Device:

  1. 对于全速(Full-Speed)总线,每隔 1.00 ms ± 0.0005 ms 发送一次。
  2. 对于高速(High-Speed)总线,每隔 125 μs ± 0.0625 μs 发送一次。

SOF 包构成如下图所示:

SOF 帧起始包格式(SOF Packet Format)

全速帧(1ms)与高速微帧(125μs)时序关系

2.4 Data Packets (数据包)

Data 数据包格式(Data Packet Format)

共有四种类型的数据包:DATA0、DATA1、DATA2 和 MDATA,通过 PID 区分。其中 DATA0 和 DATA1 用于实现数据翻转同步(Data Toggle Synchronization)。

2.5 Handshake Packets (握手包)

Handshake 握手包格式(Handshake Packet Format)

  • ACK:对于 IN 事务,由 Host 发出;对于 OUT、SETUP 和 PING 事务,由 Device 发出。
  • NAK:对于 IN 事务,在数据阶段由 Device 发出;对于 OUT 和 PING 事务,在握手阶段由 Device 发出。Host 从不发送 NAK 包。

3、事务 (Transaction)

USB 总线上完成一次数据接收或发送的处理过程称为事务处理(Transaction)。一个事务由一系列 Packet 组成,具体包含哪些包取决于事务类型,通常由以下包构成:

  • 一个 Token Packet(令牌包)
  • 可选的 Data Packet(数据包)
  • 可选的 Handshake Packet(握手包)
  • 可选的 Special Packet(特殊包)

3.1 输入 (IN) 事务处理

输入事务处理表示 USB 主机从总线上的某个 USB 设备接收一个数据包的过程。

  • 正常的输入事务处理:

正常情况下的 IN 事务处理流程

  • 设备忙时的输入事务处理:

设备忙时的 IN 事务处理(返回 NAK)

  • 设备出错时的输入事务处理:

设备出错时的 IN 事务处理(返回 STALL)

3.2 输出 (OUT) 事务处理

输出事务处理表示 USB 主机把一个数据包发送到总线上某个 USB 设备的过程。

  • 正常的输出事务处理:

正常情况下的 OUT 事务处理流程

  • 设备忙时的输出事务处理:

设备忙时的 OUT 事务处理(返回 NAK)

  • 设备出错时的输出事务处理:

设备出错时的 OUT 事务处理(返回 STALL)

3.3 设置 (SETUP) 事务处理

  • 正常的设置事务处理:

正常情况下的 SETUP 事务处理流程

  • 设备忙时的设置事务处理:

设备忙时的 SETUP 事务处理(返回 NAK)

  • 设备出错时的设置事务处理:

设备出错时的 SETUP 事务处理(返回 STALL)


4、USB 传输类型

USB 协议定义了 4 种传输类型:

  • 控制传输 (Control Transfer)
  • 批量传输 (Bulk Transfer)
  • 中断传输 (Interrupt Transfer)
  • 同步传输 (Isochronous Transfer)

4.1 控制传输 (Control Transfer)

控制传输由 2~3 个阶段组成:

  1. 建立阶段 (Setup Stage)
  2. 数据阶段 (Data Stage,无数据控制传输没有此阶段)
  3. 状态阶段 (Status Stage)

每个阶段都由一次或多次事务传输(Transaction)组成。控制传输主要用于设备枚举阶段读取描述符和下发配置,驱动软件也可使用控制传输实现特定命令交互,其数据传输不允许丢失。

4.1.1 建立阶段

主机向 USB 设备发起请求或下发配置参数。建立阶段包含 SETUP 令牌包、紧随其后的 DATA0 数据包以及 ACK 握手包,用来定义本次控制传输的请求内容(即数据阶段是 IN 还是 OUT、需要传输多少字节的数据,都在建立阶段设定好)。

控制传输建立阶段(Control SETUP Transaction)时序流程

4.1.2 数据阶段

用来传输主机与设备之间的负载数据。根据数据传输方向,控制传输分为 3 种类型:

  1. 控制读取(读取 USB 描述符)
  2. 控制写入(配置 USB 设备)
  3. 无数据控制
  • 控制读取(Control Read):将数据从设备读到主机(如读取设备描述符)。对每个数据包而言,主机先发送 IN 令牌包请求读数据,设备通过 DATA1/DATA0 数据包将数据回传给主机。主机正确接收后回复 ACK;若主机忙则回复 NAK;发生错误则回复 STALL。
  • 控制写入(Control Write):将数据从主机传到设备(如发送配置信息)。对每个数据包而言,主机先发送 OUT 令牌包,紧接着通过 DATA1/DATA0 数据包将数据传给设备。设备正确接收后回复 ACK;若设备忙则回复 NAK;发生错误则回复 STALL。

控制传输读写序列(控制写入、控制读取与无数据控制)

4.1.3 状态阶段

用来汇报整个控制传输过程已顺利结束。状态阶段的传输方向必须与数据阶段相反(原来是 IN 事务,状态阶段就用 OUT 事务;原来是 OUT 事务,状态阶段就用 IN 事务):

  • 对于控制读取:主机发送 OUT 令牌包,随后发送 0 长度的 DATA1 包,设备回应 ACK、NAK 或 STALL 握手包。
  • 对于控制写入:主机发送 IN 令牌包,设备返回表示完成的 0 长度 DATA1 包,主机回应 ACK、NAK 或 STALL 握手包。

4.2 批量传输 (Bulk Transfer)

用于传输大量数据,要求数据准确无误,但对实时性没有严格要求,常用于打印机、U 盘等大容量存储设备。

一次批量传输(Transfer)由 1 次到多次批量事务(Transaction)组成。硬件层通过错误检测、握手包反馈和超次重传确保可靠传输:

  • PID 翻转同步:发送端按 DATA0-DATA1-DATA0-... 交替翻转的顺序发送数据包。只有收到 ACK 确认传输成功后才会翻转 PID 发送下一包;若接收端连续收到两个相同 PID(例如连续两个 DATA0),则判定后一个是前一个包的重传。
  • 错误重试限制:USB 允许连续 3 次以内的传输错误并自动重试,一旦成功则将错误计数器清零;若连续失败超过 3 次,Host 判定该端点异常(STALL),放弃传输任务。

批量事务由三种包组成(IN 事务或 OUT 事务):

  1. Token(令牌包)
  2. Data(数据包)
  3. Handshake(握手包)

批量事务处理格式(Bulk Transaction Format)

  1. IN 事务(IN Transaction)握手响应:
    • ACK:表示 Host 正确无误地接收到数据。
    • NAK:指示设备暂时无法返回数据(如设备忙)。
    • STALL:指示设备端点挂起,需要 Host 软件介入处理(如设备出错)。
  2. OUT 事务(OUT Transaction)握手响应(若收到的数据包存在 CRC 校验错误,Device 不发送任何握手包):
    • ACK:Device 已正确接收数据包,通知 Host 可以按序发送下一包。
    • NAK:Device 已正确接收数据包,但因临时状况(如缓冲区满)通知 Host 稍后重传。
    • STALL:指示 Device 端点已停止,通知 Host 不再重传。
  3. Bulk 读写序列(由一系列 IN 事务或 OUT 事务组成):

批量传输读写序列(Bulk Reads and Writes Sequences)

4.3 中断传输 (Interrupt Transfer)

中断传输由 IN 或 OUT 事务组成,常用于主机定期轮询设备是否有数据需要传输(如鼠标、键盘)。

  • 中断传输在流程上除不支持 PING 令牌外,其余机制与批量传输一致,同样采用 DATA0/DATA1 PID 翻转机制保证收发端数据同步。
  • 主机在排定任务时,会根据中断端点描述符中指定的查询间隔周期性发起中断传输。
  • 中断传输具有较高的优先级,仅次于同步传输。

中断事务处理格式(Interrupt Transaction Format)

4.4 同步传输 (Isochronous Transfer)

同步传输适用于必须以固定速率或在指定时刻送达、且可以容忍偶尔出错的实时数据流,常用于麦克风、音响喇叭、UVC 摄像头等音视频设备。

同步传输只包含两个包阶段:

  1. Token(令牌包)
  2. Data(数据包)

由于没有握手包(Handshake),同步传输不支持重传机制,也不支持 PID 翻转,属于不可靠传输;但在主机排定总线带宽和事务传输时,同步传输享有最高的优先级。

同步事务处理格式(Isochronous Transaction Format)

站内搜索

没有找到内容!