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。



- 差分 1 / 差分 0:D+ 与 D- 的差分电压表示逻辑状态;
- SEO(Single-Ended Zero):D+ 与 D- 同时为低,用于表示 EOP(包结束);
- J / K 状态:空闲态为 J,K 为 J 的反相;
- EOP 期间线路回到 J 状态。
2.2 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。
三、协议层

3.1 包字段(域)
Sync 同步字段
所有包必须以同步字段开始,用于接收端与发送端时钟同步:
- LS / FS:8 bit;HS:32 bit;
- 最后两位指示 PID 字段的起始位置。

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


常用 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 分配新地址。

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

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
- 两种数据包:DATA0、DATA1(高速另有 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

四、事务与传输类型
USB 事务由 令牌(Token)→ 数据(Data,可选)→ 握手(Handshake,可选) 三个阶段组成。四种传输类型特性对比如下:
| 特性 | 控制 Control | 中断 Interrupt | 等时 Isochronous | 批量 Bulk |
|---|---|---|---|---|
| 典型用途 | 枚举、命令、状态 | 键盘、鼠标、HID | 音频、视频 | 存储、U盘、打印 |
| 保证带宽 | - | - | ✅ | - |
| 保证延迟 | - | ✅ | ✅(有界) | - |
| 保证交付 | ✅ | ✅(重试) | -(无重试) | ✅(重试) |
| 管道类型 | 消息管道(双向) | 流管道(单向) | 流管道(单向) | 流管道(单向) |
| 数据切换 DATA0/1 | ✅ | ✅ | - | ✅ |
| 低速支持 | ✅ | ✅ | - | - |
4.1 控制传输 Control Transfers
控制传输分三个阶段:
- Setup 阶段:SETUP 令牌 + DATA0(固定 8 字节请求)+ ACK;
- Data 阶段(可选):IN/OUT 传输数据,首个数据包为 DATA1,随后 DATA0/DATA1 交替;
- Status 阶段:确认整个传输完成(IN 传输用 OUT 空包,OUT 传输用 IN),固定 DATA1。




4.2 中断传输 Interrupt Transfers
- 保证延迟:主机按 bInterval 轮询,延迟有上限;
- 流管道,单向;
- 错误检测 + 下一周期重试。

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



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

五、设备模型


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






七、参考资料
- USB 2.0 Specification(USB Implementers Forum)
- USB in a NutShell(BeyondLogic)
- usbmadesimple.co.uk