控制传输分为三个步骤:设置阶段、可选的数据阶段和状态阶段。
- 设置阶段:必须包含 1 个控制信号(称为 SETUP 事务),用于告知设备后续操作类型。
- 数据阶段(可选):可能包含 0 个或多个数据包传输。如果需要传输数据,设备会通过 IN 或 OUT 信号完成数据交换。
- 状态阶段:必须包含 1 个确认信号(IN 或 OUT 事务),用于确认操作完成。
每个步骤的数据包格式都有所不同,整体流程就像先"设定任务-执行操作(可选)-最后确认"的过程。

设置阶段:事务
USB 传输数据时,信息会被分成不同的“包”来发送,但这些包必须按固定顺序组合成“事务”才能正常传输。一个事务通常由 3 种包组成:
- 令牌包:由主机(比如电脑)最先发出,相当于“开始指令”,告诉设备接下来要做什么。
- 数据包:实际传输数据的包。数据方向由前面的令牌包决定,可以是主机→设备,也可以是设备→主机。
- 握手包:由接收数据的一方最后发送,表示“收到且没问题”。如果设备还没准备好接收,会发送一个叫 NAK 的信号。
简单来说:主机先发指令(令牌包)→双方按指令传输数据(数据包)→接收方最后确认是否成功(握手包)。这样三个步骤组成了完整的数据传输过程。
设置阶段由 1 个设置事务组成,SETUP 事务由 SETUP 令牌包、DATA0 数据包、ACK 握手包组成。如下图所示。

1、令牌包

从上图可以知道 SETUP PID 为 1101B,则补码校验位 0010,在链路上传输先低后高则为,1011_0100(0xB4),下图为 SETUP 包的链路波形图。

2、DATA0 数据包
控制传输由三个阶段组成,设置阶段、可选的数据阶段、状态阶段,其中设置阶段由 1 个 SETUP 事务组成,数据阶段由 0 个或者多个 IN/OUT 事务组成,状态阶段由 1 个 IN/OUT 事务组成,其中每个阶段事务包结构有所不同,下图可以直观看出控制传输的包结构组成。


可选的数据阶段包详解
一、如果第一阶段指定数据传输方向为设备到主机: 如果第一阶段指定读(传输方向为设备到主机),则数据阶段会由连续的多个 IN 事务组成,事务和包协议结构如下图:

二、如果第一阶段数据传输方向为主机到设备(数据长度大于 0): 如果第一阶段指定写(传输方向为主机到设备),则数据阶段会由连续的多个 OUT 事务组成,事务和包协议结构如下图。
三、如果第一阶段数据传输方向为主机到设备(数据长度为 0):
状态阶段包详解
状态阶段由 1 个 OUT/IN 事务组成:
一、 如果第二阶段指定数据传输方向为设备到主机 如果第二阶段指定数据传输方向为设备到主机,则主机接收完毕数据后,主机请求一个 OUT 事务告诉设备数据的接收状态。

二、 如果第二阶段指定数据传输方向为主机到设备(数据长度大于 0) 如果第二阶段指定数据传输方向为主机到设备,则主机发送完毕数据后,主机请求一个 IN 事务请求设备数据接收状态。
三、如果第二阶段指定数据传输方向为主机到设备(数据长度为 0) 如果第二阶段指定数据传输方向为主机到设备,请求传输数据长度为 0,则主机发送完令牌包后,主机请求一个 IN 事务请求设备数据接收状态。