加载中...
USB 2.0 协议基础
发表于:2026-09-07 | 分类: 数字IC

USB 2.0 是 2000 年发布的高速串行总线规范,向下兼容 USB 1.1。本文从物理层、协议层、传输类型、设备模型到电源管理,梳理 USB 2.0 的核心机制。

一、概述

1.1 速率等级

速率 代号 传输率 线缆长度上限
低速 Low-Speed(LS) USB 1.0/1.1 1.5 Mbps 3 m
全速 Full-Speed(FS) USB 1.1 12 Mbps 5 m
高速 High-Speed(HS) USB 2.0 480 Mbps 5 m

1.2 拓扑结构

USB 总线为主机(Host)— 集线器(Hub)— 设备(Device)的树形拓扑:

  • 系统中只有 1 个 Host,负责发起所有事务;
  • 设备通过 Hub 级联接入,最多 7 层
  • 挂载设备最多 127 个(7 bit 地址,地址 0 保留给默认地址)。

1.3 最大包长

速率 控制 CTRL 批量 BULK 中断 INTR 等时 ISOC
LS 1.5 Mbps 8 - 8 -
FS 12 Mbps 8 / 16 / 32 / 64 64 64 1023
HS 480 Mbps 64 512 1024 1024

低速不支持批量与等时传输;控制传输在低速下最大包固定为 8。

二、物理层与电气特性

2.1 线缆与信号定义

USB 线缆共 4 根线:VBUS(5 V 电源)、D+ / D-(差分数据)、GND

USB 信号电平定义
USB 信号状态
差分信号说明

  • 差分 1 / 差分 0:D+ 与 D- 的差分电压表示逻辑状态;
  • SEO(Single-Ended Zero):D+ 与 D- 同时为低,用于表示 EOP(包结束)
  • J / K 状态:空闲态为 J,K 为 J 的反相;
  • EOP 期间线路回到 J 状态。

2.2 NRZI 编码与位填充

NRZI 编码

  • NRZI(Non-Return-to-Zero Inverted,反向不归零编码):逻辑 0 电平翻转,逻辑 1 电平保持
  • 位填充(bit-stuffing):为避免长时间无翻转导致接收端无法恢复时钟,当数据中出现连续 6 个 1 时,强制在第 6 个 1 后插入一个 0,使信号强制翻转。

2.3 速度协商

  • 上电后:FS 设备在 D+ 上拉 1.5 kΩLS 设备在 D- 上拉,主机据此识别速度;
  • 复位期间(SE0 ≥ 10 ms):具备高速能力的设备会先释放上拉,再以 Chirp K/J 序列与主机握手;
  • 握手成功则切换为 480 Mbps 高速,否则以 FS 工作。

2.4 供电

  • VBUS 额定 5 V(4.75 ~ 5.25 V),1 个单位负载 = 100 mA
  • 低功耗设备 ≤ 100 mA;高功耗设备在完成配置(SetConfiguration)后可取电 ≤ 500 mA;
  • 挂起(Suspend)状态电流降至毫安级以下(低功耗设备规范要求 ≤ 500 µA),可通过远程唤醒(Remote Wakeup)恢复。

2.5 帧与微帧

  • 全速:每 1 ms 一帧;高速:每 125 µs 一微帧;
  • 每个帧/微帧以 SOF 包开始,帧号(Frame Number)为 11 bit,每帧递增 1。

三、协议层

USB 包结构

3.1 包字段(域)

Sync 同步字段

所有包必须以同步字段开始,用于接收端与发送端时钟同步:

  • LS / FS:8 bitHS:32 bit
  • 最后两位指示 PID 字段的起始位置。

Sync 字段

PID 包标识符

  • PID 本身 4 bit,为避免误码将 4 bit 取反后重复,构成 8 bit 的 PID;
  • 后 4 位是前 4 位的取反。

PID 结构
PID 类型定义

常用 PID 列表:

PID 二进制值 含义
OUT 0001 主机→设备 令牌
IN 1001 设备→主机 令牌
SOF 0101 帧起始
SETUP 1101 控制传输 Setup 令牌
DATA0 0011 数据包 0(偶数包)
DATA1 1011 数据包 1(奇数包)
DATA2 0111 高速等时第 2 个微帧数据
MDATA 1111 高速等时第 3 个微帧数据
ACK 0010 接收成功确认
NAK 1010 设备暂不能收发
STALL 1110 端点停止,需主机干预
NYET 0110 尚未就绪(高速)
PRE 1100 低速前导
SPLIT 1000 高速分叉事务
PING 0100 高速流控探测
EXT 0000 扩展

ADDR 设备地址

  • 7 bit,可表示 0 ~ 127;
  • 地址 0 保留,设备复位后默认地址为 0,枚举时由 SET_ADDRESS 分配新地址。

ADDR 字段

ENDP 端点号

  • 4 bit,共 16 个端点(0 ~ 15);
  • 低速设备除默认管道(EP0)外最多再有 2 个端点(共 4 个)。

ENDP 字段

CRC 校验

  • 令牌包(Token):5 bit CRC
  • 数据包(Data):16 bit CRC

EOP 包结束

由 SEO 信号电平表示,见信号定义。

3.2 包类型

令牌包 Token Packet

令牌包共 3 种,均由主机发出:

  • IN:告知设备主机希望读取数据;
  • OUT:告知设备主机将发送数据;
  • SETUP:用于开始控制传输。

格式:Sync | PID | ADDR(7) | ENDP(4) | CRC5 | EOP

令牌包格式

数据包 Data Packet

  • 两种数据包:DATA0DATA1(高速另有 DATA2、MDATA);
  • 单包最大负载:LS 8 B、FS 1023 B、HS 1024 B;
  • 数据必须以字节为单位发送。

格式:Sync | PID | DATA(0 ~ 1024 B) | CRC16 | EOP

数据包格式

握手包 Handshake Packet

握手包只有 PID,共 3 种:

  • ACK:确认数据包接收成功;
  • NAK:设备暂时无法发送/接收数据;也用于中断事务中告知主机暂无数据;
  • STALL:设备处于需要主机干预的状态(端点停止)。

格式:Sync | PID | EOP

握手包格式

SOF 帧起始包

  • 由主机每 1 ms ± 500 ns(FS)或每 125 µs ± 0.0625 µs(HS)发送;
  • 携带 11 bit 帧号。

格式:Sync | PID(SOF) | Frame Number(11) | CRC5 | EOP

SOF 包格式

四、事务与传输类型

USB 事务由 令牌(Token)→ 数据(Data,可选)→ 握手(Handshake,可选) 三个阶段组成。四种传输类型特性对比如下:

特性 控制 Control 中断 Interrupt 等时 Isochronous 批量 Bulk
典型用途 枚举、命令、状态 键盘、鼠标、HID 音频、视频 存储、U盘、打印
保证带宽 - - -
保证延迟 - ✅(有界) -
保证交付 ✅(重试) -(无重试) ✅(重试)
管道类型 消息管道(双向) 流管道(单向) 流管道(单向) 流管道(单向)
数据切换 DATA0/1 -
低速支持 - -

4.1 控制传输 Control Transfers

控制传输分三个阶段:

  1. Setup 阶段:SETUP 令牌 + DATA0(固定 8 字节请求)+ ACK;
  2. Data 阶段(可选):IN/OUT 传输数据,首个数据包为 DATA1,随后 DATA0/DATA1 交替;
  3. Status 阶段:确认整个传输完成(IN 传输用 OUT 空包,OUT 传输用 IN),固定 DATA1。

Setup 阶段
Data 阶段
Status 阶段 1
Status 阶段 2

4.2 中断传输 Interrupt Transfers

  • 保证延迟:主机按 bInterval 轮询,延迟有上限;
  • 流管道,单向;
  • 错误检测 + 下一周期重试。

中断传输

4.3 等时传输 Isochronous Transfers

  • 保证带宽访问;
  • 延迟有界;
  • 流管道,单向;
  • CRC 检错但不重试不保证交付
  • 仅 FS / HS;
  • 无数据切换(DATA0/1)。

等时传输 1
等时传输 2
等时传输 3

4.4 批量传输 Bulk Transfers

  • 用于传输大量突发数据;
  • CRC 检错 + 保证交付(自动重试);
  • 不保证带宽与最小延迟;
  • 流管道,单向;
  • 仅 FS / HS。

批量传输

五、设备模型

USB 设备结构
USB 设备层级

设备状态机:

状态 说明
Attached 设备接入总线
Powered 检测到 VBUS,上电
Default 复位完成,地址 0,功耗 ≤ 100 mA
Address 收到 SET_ADDRESS 并完成 Status 阶段
Configured 收到 SET_CONFIGURATION(非零),可使用全部端点
Suspended 总线空闲 ≥ 3 ms,进入挂起(任何非 Attached 状态都可能进入)

5.1 标准请求

所有请求通过默认控制管道发送,Setup 包固定 8 字节

偏移 字段 大小 说明
0 bmRequestType 1 D7 方向(0=主机→设备,1=设备→主机);D6:5 类型(0 标准/1 类/2 厂商/3 保留);D4:0 接收者(0 设备/1 接口/2 端点/3 其他)
1 bRequest 1 具体请求(见下表)
2 wValue 2 随请求变化
4 wIndex 2 索引/偏移(端点或接口)
6 wLength 2 Data 阶段字节数(0 表示无 Data 阶段)

11 个标准请求

请求 bRequest 值 说明
GET_STATUS 0 返回设备/接口/端点状态(2 字节)
CLEAR_FEATURE 1 清除特性(如 ENDPOINT_HALT、DEVICE_REMOTE_WAKEUP)
SET_FEATURE 3 设置特性(含 TEST_MODE)
SET_ADDRESS 5 设置设备地址(Status 完成后才生效)
GET_DESCRIPTOR 6 读取描述符
SET_DESCRIPTOR 7 更新/添加描述符(可选)
GET_CONFIGURATION 8 返回当前配置值
SET_CONFIGURATION 9 设置配置(0=回到 Address 状态)
GET_INTERFACE 10 返回接口当前 alternate setting
SET_INTERFACE 11 选择接口 alternate setting
SYNCH_FRAME 12 设置并报告端点同步帧(等时用)

标准特性选择器(Feature Selectors)

特性 接收者
ENDPOINT_HALT 端点 0
DEVICE_REMOTE_WAKEUP 设备 1
TEST_MODE 设备 2
  • 请求处理超时:无 Data 阶段的标准请求 50 ms;需返回数据的首个数据包 500 ms;主机→设备数据 5 s 上限。
  • SetAddress 后需 2 ms 恢复间隔;复位/恢复后需 10 ms 恢复间隔。
  • 无效/不支持请求 → 在 Data 或 Status 阶段返回 STALL(Request Error)。

5.2 描述符(Descriptors)

  • 描述符是带格式的数据结构,每个描述符以 bLength(长度)+ bDescriptorType(类型)开头。
  • 设备通过描述符报告自身属性;字符串描述符可选,引用字段必须存在(不支持则置 0)。

标准描述符类型

类型
DEVICE 1
CONFIGURATION 2
STRING 3
INTERFACE 4
ENDPOINT 5
DEVICE_QUALIFIER 6
OTHER_SPEED_CONFIGURATION 7
INTERFACE_POWER 8

设备描述符(Device,18 字节)

偏移 字段 大小 说明
0 bLength / bDescriptorType 1+1 18 / DEVICE
2 bcdUSB 2 USB 规范版本(2.0 = 0200H;高速设备必须为 0200H)
4 bDeviceClass / bDeviceSubClass / bDeviceProtocol 1+1+1 设备类/子类/协议(0=接口各自定义,FFH=厂商自定义)
7 bMaxPacketSize0 1 端点 0 最大包(仅 8/16/32/64;高速必须为 64)
8 idVendor 2 厂商 ID
10 idProduct 2 产品 ID
12 bcdDevice 2 设备版本(BCD)
14 iManufacturer / iProduct / iSerialNumber 1+1+1 字符串描述符索引
17 bNumConfigurations 1 配置数量(当前速度)

设备限定符(Device_Qualifier,10 字节)

  • 描述高速设备在另一速度下会变化的信息(类/子类/协议、端点 0 最大包、配置数)。
  • 仅高速能力设备支持;全速单速设备收到请求应返回 Request Error。

配置描述符(Configuration,9 字节)

偏移 字段 大小 说明
0 bLength / bDescriptorType 1+1 9 / CONFIGURATION
2 wTotalLength 2 配置+接口+端点+类/厂商描述符总长度
4 bNumInterfaces 1 接口数
5 bConfigurationValue 1 SetConfiguration 用值
6 iConfiguration 1 字符串索引
7 bmAttributes 1 D7=1(保留);D6 自供电;D5 远程唤醒
8 bMaxPower 1 最大总线耗电,单位 2 mA(50 = 100 mA)

GetDescriptor(Configuration) 会一次性返回配置、所有接口、端点及类/厂商描述符。

接口描述符(Interface,9 字节)

偏移 字段 说明
0 bLength / bDescriptorType 9 / INTERFACE
2 bInterfaceNumber 接口号(从 0 起)
3 bAlternateSetting 备用设置号(默认 0)
4 bNumEndpoints 端点数量(不含端点 0
5 bInterfaceClass / bInterfaceSubClass / bInterfaceProtocol 类/子类/协议
8 iInterface 字符串索引

端点描述符(Endpoint,7 字节)

偏移 字段 说明
0 bLength / bDescriptorType 7 / ENDPOINT
2 bEndpointAddress bit3:0 端点号;bit7 方向(0=OUT,1=IN;控制端点忽略)
3 bmAttributes bit1:0 传输类型(00 控制/01 等时/10 批量/11 中断);等时端点 bit3:2 同步类型、bit5:4 用途
4 wMaxPacketSize bit10:0 最大包(字节);高速等时/中断 bit12:11 每微帧额外事务数(00=1 次,01=2 次,10=3 次)
6 bInterval 轮询周期:全/低速中断 1~255(帧);全/高速等时与高速中断为 2^(bInterval-1)(帧/微帧)

字符串描述符(String)

  • 语言 ID 通过 wIndex 指定;UTF-16 编码。

5.3 设备枚举流程(Device Enumeration)

  1. 上电(→ Powered):设备接入并得到 VBUS 供电。
  2. 复位(→ Default):主机发出复位信号(≥ 10 ms);期间完成速度协商(D+/D- 上拉 + 高速 chirp);复位结束进入 Default:地址 0、耗电 ≤ 100 mA。
  3. 读设备描述符前 8 字节:经地址 0 发 GET_DESCRIPTOR,先只读 8 字节,得到 bMaxPacketSize0(据此确定后续 EP0 包大小)。
  4. 读完整设备描述符:按 bMaxPacketSize0 读全 18 字节。
  5. 分配地址(SET_ADDRESS → Address):发 SET_ADDRESS(1~127),设备在 Status 阶段完成后才切换新地址。
  6. 读配置描述符:用新地址发 GET_DESCRIPTOR(Configuration),按 wTotalLength 读全配置 + 接口 + 端点描述符。
  7. 选择配置(SET_CONFIGURATION → Configured):发 SET_CONFIGURATION(非零值),设备进入 Configured,可按描述符从 VBUS 取电(可 > 100 mA)。

六、链路电源管理 LPM

LPM(Link Power Management,链路电源管理)是 USB 2.0 增补规范(ECN)引入的省电机制,用于在不打断设备功能的前提下降低链路功耗:

  • 相比总线级挂起 Suspend(L2),LPM 进入的 L1 状态只挂起链路,设备上下文保留,恢复延迟更短(微秒级);
  • 设备通过 BOS 描述符(USB 2.1 引入)中的 USB 2.0 Extension 描述符上报 LPM 支持能力;
  • 主机发送 LPM 事务请求进入 L1,设备以 ACK 接受或 NYET 拒绝;
  • 进入 L1 后总线保持空闲,主机通过 Resume 信号或设备远程唤醒退出 L1。

LPM 时序
LPM 状态
LPM 事务
LPM 时序 2
LPM 时序 3
LPM 时序 4

七、参考资料

  • USB 2.0 Specification(USB Implementers Forum)
  • USB in a NutShell(BeyondLogic)
  • usbmadesimple.co.uk
下一篇:
wifi协议
本文目录
本文目录