三、USB协议通信过程

三、USB 协议通信过程

USB 协议学习目录

点击标题可跳转到对应的网络文章

目录


一、概述

USB 通信是一个Host 主导、分层推进 的过程。从用户视角看,只是"插入即用";但从协议视角,内部经历了物理检测 → 速度协商 → 设备枚举 → 正常通信四个大阶段。
物理连接
速度识别
设备枚举
正常通信

各阶段核心任务

阶段 核心任务 通信主体
物理连接 Hub 检测端口电平变化 Hub ↔ Host
速度识别 D+/D- 上拉电阻 + chirp 协商 Device ↔ Hub
设备枚举 获取描述符、设置地址、加载配置 Host ↔ Device (EP0)
正常通信 按传输类型进行数据交换 Host ↔ Device (各端点)

二、物理连接与速度识别

2.1 设备插入检测

USB Host Hub 端口 USB Device USB Host Hub 端口 USB Device 插入,D+/D- 上拉电阻生效 检测到端口电平变化 状态变化中断 (Status Change Interrupt) 查询端口状态 (GET_PORT_STATUS) 返回: 设备已连接 (C_PORT_CONNECTION=1)

检测原理 :Hub 端口的 D+/D- 线通过 15kΩ 下拉电阻 接地。当设备插入时,设备端的 1.5kΩ 上拉电阻 会将 D+ 或 D- 拉高,Hub 检测到电平跳变即知有设备插入。

2.2 速度识别机制

D- 上拉
D+ 上拉




设备插入
D+ 还是 D- 上拉?
Low Speed

1.5 Mbps
是否支持 High Speed?
Full Speed

12 Mbps
Chirp 协商
Hub 是否回应 Chirp?
High Speed

480 Mbps

Chirp 协商过程(高速识别)
Hub 高速设备 Hub 高速设备 Chirp 协商 (Reset 期间) Bus Reset (>10ms) Chirp K (持续 1~7ms) Chirp KJ 交替序列 检测到 Hub Chirp,切换为高速模式 断开 D+ 上拉,启用高速终端

速度 识别方式 上拉电阻位置 上拉电阻值
Low Speed D- 上拉 D- 1.5kΩ
Full Speed D+ 上拉 D+ 1.5kΩ
High Speed Chirp 协商 D+ (先上拉后断开) 1.5kΩ

三、设备枚举(Enumeration)

枚举是 USB 通信中最关键、最复杂的初始化阶段。Host 通过一系列控制传输,逐步识别并配置设备。

3.1 枚举全景流程

设备插入 + 速度识别
步骤1: Hub 报告状态变化
步骤2: Host 复位设备
步骤3: 获取设备描述符(前8字节)
步骤4: 分配并设置地址
步骤5: 获取完整设备描述符(18字节)
步骤6: 获取配置描述符(前9字节)
步骤7: 获取完整配置信息
步骤8: 设置配置
步骤9: 加载驱动
设备就绪,正常通信

标红的步骤(2、4、8)是设备状态切换点,会改变设备的 USB 状态机。

3.2 枚举步骤详解

步骤 1:Hub 报告状态变化
  • Hub 检测到端口电平变化后,在状态变化端点(中断 IN)向 Host 发送通知
  • Host 轮询 Hub 的状态变化端点,发现某端口有设备插入
步骤 2:Host 复位设备

USB Device Hub USB Host USB Device Hub USB Host SET_FEATURE(PORT_RESET) 拉低 D+/D- 超过 10ms (SE0) 进入 Default 状态 端口复位完成 GET_PORT_STATUS PORT_ENABLE=1, PORT_RESET=0

  • 复位后,设备进入 Default State ,地址 = 0,仅能通过 控制端点 EP0 通信
  • 最大包大小:首次通信使用 8 字节(因尚未获取设备描述符)
步骤 3:获取设备描述符(前 8 字节)

USB Device USB Host USB Device USB Host GET_DESCRIPTOR 控制传输 关键字段: bMaxPacketSize0 SETUP: GET_DESCRIPTOR(Device, 8字节) DATA: 设备描述符前8字节 ACK

目的 :获取 bMaxPacketSize0(EP0 最大包大小),后续通信将按此大小分包。

c 复制代码
// 设备描述符前 8 字节
byte[0]: bLength = 18       // 描述符长度
byte[1]: bDescriptorType = 1 // 设备描述符
byte[2-3]: bcdUSB            // USB 版本号
byte[4]: bDeviceClass        // 设备类
byte[5]: bDeviceSubClass     // 设备子类
byte[6]: bDeviceProtocol     // 设备协议
byte[7]: bMaxPacketSize0     // ← 关键: EP0 最大包大小
步骤 4:分配并设置地址

USB Device USB Host USB Device USB Host SET_ADDRESS 控制传输 (无数据阶段) 设备状态: Default → Address SETUP: SET_ADDRESS(new_addr) DATA0: ZLP (零长度包) ACK

  • Host 从地址池(1~127)中分配一个唯一地址
  • 设备收到 SET_ADDRESS 后,在 Status 阶段完成后 才切换地址
  • 设备进入 Address State
步骤 5:获取完整设备描述符(18 字节)

使用新地址重新获取完整的 18 字节设备描述符:

c 复制代码
typedef struct {
    uint8_t  bLength;            // 18
    uint8_t  bDescriptorType;    // 1
    uint16_t bcdUSB;             // USB 版本 (如 0x0200 = USB 2.0)
    uint8_t  bDeviceClass;       // 设备类
    uint8_t  bDeviceSubClass;    // 设备子类
    uint8_t  bDeviceProtocol;    // 设备协议
    uint8_t  bMaxPacketSize0;    // EP0 最大包大小
    uint16_t idVendor;           // VID
    uint16_t idProduct;          // PID
    uint16_t bcdDevice;          // 设备版本
    uint8_t  iManufacturer;      // 厂商字符串索引
    uint8_t  iProduct;           // 产品字符串索引
    uint8_t  iSerialNumber;      // 序列号字符串索引
    uint8_t  bNumConfigurations; // 配置数量
} USB_DeviceDescriptor;
步骤 6:获取配置描述符(前 9 字节)

USB Device USB Host USB Device USB Host 关键字段: wTotalLength SETUP: GET_DESCRIPTOR(Configuration, 9字节) DATA: 配置描述符 ACK

目的 :获取 wTotalLength(配置总长度,包含所有子描述符)。

c 复制代码
typedef struct {
    uint8_t  bLength;             // 9
    uint8_t  bDescriptorType;     // 2
    uint16_t wTotalLength;        // ← 关键: 配置总长度
    uint8_t  bNumInterfaces;      // 接口数量
    uint8_t  bConfigurationValue; // 配置值
    uint8_t  iConfiguration;      // 配置字符串索引
    uint8_t  bmAttributes;        // 属性 (自供电/远程唤醒)
    uint8_t  bMaxPower;           // 最大功耗 (×2mA)
} USB_ConfigurationDescriptor;
步骤 7:获取完整配置信息

根据 wTotalLength 一次性获取完整的配置描述符集:
配置描述符
接口描述符 1
接口描述符 2
端点描述符 1-1
端点描述符 1-2
端点描述符 2-1
HID 描述符
CDC 功能描述符

获取到的描述符按顺序排列:

  1. 配置描述符(9 字节)
  2. 接口描述符 0(9 字节)
  3. 接口 0 的附属描述符(HID/CDC 等)
  4. 接口 0 的端点描述符(7 字节 × N)
  5. 接口描述符 1(9 字节)
  6. ...
步骤 8:设置配置

USB Device USB Host USB Device USB Host SET_CONFIGURATION 控制传输 设备状态: Address → Configured SETUP: SET_CONFIGURATION(configValue) ZLP ACK

  • 设备进入 Configured State
  • 各非零端点被激活,可以开始进行正常数据传输
步骤 9:加载驱动

Host 根据以下信息匹配驱动:

  • 优先匹配:VID + PID(厂商自定义)
  • 次优先匹配:设备类/子类/协议(通用驱动,如 HID、UVC)

四、控制传输(Control Transfer)

控制传输是 USB 中唯一必须实现的传输类型,用于配置、命令和状态查询。枚举阶段的所有通信都基于控制传输。

4.1 控制传输三阶段

Setup 阶段

(必须有)

1个SETUP事务
Data 阶段

(可选)

1~N个IN/OUT事务
Status 阶段

(必须有)

1个IN/OUT事务

Setup 阶段

  • 使用 SETUP 事务
  • 发送 8 字节的 Setup 数据包(bmRequestType + bRequest + wValue + wIndex + wLength)
  • 总是由 Host 发起,方向为 Host → Device

Data 阶段

  • 可选,取决于请求是否需要传输数据
  • 方向由 bmRequestType 的 Bit7 决定:0=Host→Device (OUT),1=Device→Host (IN)
  • 数据量大于端点最大包大小时,使用多个事务分包传输

Status 阶段

  • 总是使用 与数据阶段相反方向 的零长度包(ZLP)来确认
  • 如果无 Data 阶段,Status 使用 IN 方向(Device → Host 的 ZLP)

4.2 标准请求详解

bmRequestType (1B) 0 7 bRequest (1B) 8 15 wValue (2B) 16 31 wIndex (2B) 32 47 wLength (2B) 48 63 Setup 数据包结构(8 字节)

bmRequestType 字段解析

字段 含义
Bit7 数据传输方向 0 Host → Device
1 Device → Host
Bit6~5 请求类型 0 标准请求 (Standard)
1 类请求 (Class)
2 厂商请求 (Vendor)
3 保留
Bit4~0 接收者 0 设备 (Device)
1 接口 (Interface)
2 端点 (Endpoint)
3 其他 (Other)

标准请求码

请求 数据方向 功能
GET_STATUS 0 IN 获取设备/接口/端点状态
CLEAR_FEATURE 1 - 清除特性
SET_FEATURE 3 - 设置特性
SET_ADDRESS 5 - 设置设备地址
GET_DESCRIPTOR 6 IN 获取描述符
SET_DESCRIPTOR 7 OUT 设置描述符
GET_CONFIGURATION 8 IN 获取当前配置
SET_CONFIGURATION 9 - 设置配置
GET_INTERFACE 10 IN 获取接口
SET_INTERFACE 11 - 设置接口
SYNCH_FRAME 12 IN 同步帧

典型控制传输示例:GET_DESCRIPTOR(Device)
USB Device USB Host USB Device USB Host Setup 阶段 Data 阶段 (IN 方向) Status 阶段 (OUT 方向) SETUP: bmRequestType=0x80, bRequest=0x06, wValue=0x0100, wIndex=0, wLength=18 DATA0: ACK IN DATA1: 设备描述符 (18字节) ACK OUT: ZLP ACK


五、事务层(Transaction)通信

事务是 USB 通信的最小执行单元,由 2~3 个包(Packet)组成。

5.1 SETUP 事务

USB Device USB Host USB Device USB Host TOKEN: SETUP DATA0: 8字节 Setup 数据 HANDSHAKE: ACK

特点

  • 总是由 Host 发起
  • 总是使用 DATA0 PID(首次传输)
  • 设备必须应答 ACK(不能 NAK 或 STALL SETUP 包)

5.2 IN 事务

USB Device USB Host USB Device USB Host alt [设备有数据] [设备暂无数据] [设备错误] TOKEN: IN DATA0/DATA1: 数据 HANDSHAKE: ACK HANDSHAKE: NAK HANDSHAKE: STALL

数据同步机制

  • 使用 DATA0 / DATA1 交替 PID 进行切换同步
  • 发送方切换,接收方期望下一个,双方一致则 ACK
  • High Speed 还引入了 DATA2 / MDATA 用于分裂传输

5.3 OUT 事务

USB Device USB Host USB Device USB Host alt [接收成功] [设备忙] [端点挂起] TOKEN: OUT DATA0/DATA1: 数据 HANDSHAKE: ACK HANDSHAKE: NAK HANDSHAKE: STALL


六、四种传输类型的通信过程

6.1 控制传输

已在第四章详细讲解,此处不再赘述。

应用场景:设备枚举、配置命令、类特定请求

6.2 批量传输(Bulk Transfer)

USB Device USB Host USB Device USB Host 批量读 (IN) IN DATA0: 数据包1 ACK IN DATA1: 数据包2 ACK IN DATA0: 数据包3 (短包/ZLP = 传输结束) ACK

特点

  • 使用 批量端点(Bulk Endpoint)
  • 保证数据正确性(CRC 校验 + ACK 握手),但不保证带宽
  • 大数据量时效率高,利用总线空闲时间传输
  • 传输结束标志:短包 (小于最大包大小)或 ZLP(零长度包)

6.3 中断传输(Interrupt Transfer)

USB Device USB Host USB Device USB Host 中断 IN (周期性轮询) alt [有新数据] [无数据] loop [每 bInterval 毫秒] IN DATA: 按键/鼠标移动 ACK NAK

特点

  • Host 周期性轮询 (由 bInterval 决定周期)
  • 不是硬件中断,而是"有保证的轮询间隔"
  • 保证最大延迟:Low Speed ≤ 18ms, Full Speed ≤ 10ms, High Speed ≤ 125μs
  • 数据量小,适合键盘、鼠标等人机交互设备

6.4 同步传输(Isochronous Transfer)

USB Device USB Host USB Device USB Host 同步 IN (实时音频/视频) 无握手! 无重传! loop [每帧/微帧] IN DATA: 音频帧/视频帧 IN DATA: 下一帧

特点

  • 无握手包(无 ACK/NAK),无重传机制
  • 带宽预留:在枚举时就分配固定带宽
  • 适合对实时性要求高、可容忍少量丢包的场景(音频、视频)
  • 使用同步端点(Isochronous Endpoint)

四种传输类型对比

特性 控制传输 批量传输 中断传输 同步传输
可靠性 低(无重传)
带宽保证 10%预留 有上限 预留固定带宽
延迟 不确定 不确定 有保证 实时
数据纠错 CRC+ACK CRC+ACK CRC+ACK CRC only
方向 双向 单向 单向 单向
典型应用 枚举/配置 U盘/打印机 键盘/鼠标 摄像头/音频

七、帧与微帧调度机制

7.1 帧结构

SYNC (8 bit) 0 7 PID = 0xA5 (SOF) 8 15 Frame Number (11 bit) 16 26 CRC5 (5 bit) 27 31 SOF 包结构 (11位帧号)

速度 帧周期 帧号范围 每帧微帧数
Full Speed 1 ms 0~2047 1
High Speed 125 μs (微帧) 0~2047 8

7.2 帧内调度优先级

SOF 包

帧开始
中断传输

最高优先级
同步传输

带宽预留
控制传输

10%预留
批量传输

剩余带宽

调度规则

  1. 每帧/微帧以 SOF 包 开始
  2. 中断传输和同步传输优先调度(有带宽保证和延迟要求)
  3. 控制传输最多占用 10% 的帧带宽
  4. 批量传输使用剩余带宽

八、USB 3.x 通信差异

8.1 物理层变化

特性 USB 2.0 USB 3.0+
信号线 半双工 (D+/D-) 全双工 (SSTX/SSRX)
传输方向 分时复用 同时收发
广播机制 广播到所有设备 路由到目标设备
链路训练 需要链路训练 (LTSSM)

8.2 USB 3.0 链路状态机(LTSSM)

SS.Disabled

SuperSpeed 禁用
SS.Inactive
Rx.Detect

检测对端接收器
Polling

链路训练
U0

正常工作状态
U1

轻度省电
U2

深度省电
U3

挂起/休眠
Recovery

恢复训练

8.3 USB 3.x 通信流程差异

USB3 Device USB3 Hub USB3 Host USB3 Device USB3 Hub USB3 Host USB 3.0 枚举差异 同时保持 USB 2.0 连接 LTSSM 链路训练 训练完成,进入 U0 获取描述符 (SuperSpeed) USB 2.0 Reset (如果支持)

  • USB 3.0 设备同时有 USB 2.0 和 USB 3.0 两套信号线
  • 如果 USB 3.0 连接失败,自动降级到 USB 2.0
  • USB 3.0 使用 流控制(Credit-based)代替简单的 ACK 握手

九、完整通信流程总览

阶段3: 正常通信
控制传输

配置/命令
批量传输

U盘/打印
中断传输

键盘/鼠标
同步传输

音频/视频
阶段2: 设备枚举
复位设备
获取设备描述符(8B)
SET_ADDRESS
获取完整描述符
SET_CONFIGURATION
阶段1: 物理连接
设备插入
Hub 检测电平变化
报告 Host
速度识别

Low/Full/High


十、参考资源

资源 说明
USB 2.0 Specification 官方协议规范,第5章、第8章、第9章
USB in a Nutshell 经典入门教程,枚举流程详解
USB Complete Jan Axelson 著,最全面的 USB 开发参考书
USB 3.2 Specification SuperSpeed 通信细节
usb.org USB-IF 官方网站,白皮书与规范
相关推荐
smallerxuan6 小时前
七、USB协议中的事务
usb·usb协议·usb事务
smallerxuan12 小时前
五、USB协议中的请求
usb·usb协议·usb请求
smallerxuan12 小时前
八、USB协议分析与调试实战
usb·usb协议分析·usb协议·usb协议调测
smallerxuan13 小时前
四、USB协议中的描述符
usb·usb协议·usb描述符
ZenasLDR3 天前
Type-C接口水冷散热器
接口·芯片·usb
ZenasLDR12 天前
LDR6600适配器PD协议芯片
接口·芯片·usb
斐夷所非22 天前
USB 接口 | 硬件协议、系统架构、驱动开发与功耗调试
usb
混分巨兽龙某某24 天前
基于CH32L103的USB转I2C/SMBUS的调试助手项目(代码开源)
usb·ch32·wch·i2c/smbus
ZenasLDR1 个月前
Type-C接口OTG转接器LDR6021Q
接口·芯片·usb