此次笔记将引入很多概念,这些概念对于你以后无论是写应用程序还是驱动程序都很有帮助
一、USB硬件拓扑结构
USB采用树形拓扑结构,一个主机最多可连接127个设备:
-
Host(主机):系统的根,控制所有通信
-
Root Hub(根集线器):主机内置的集线器,第一级连接点
-
Hub(集线器):扩展连接点,可连接多个设备
-
Device(设备):终端设备,如U盘、鼠标等
-
Compound Device(复合设备):内置集线器的设备
关键机制 :主机通过设备地址精准寻址。每个设备插入时,主机会分配唯一地址(1-127),数据包中携带目标地址,确保数据正确送达。
二、数据包格式:通信的基本单元
2.1 包的组成结构
一个完整的数据包包含以下域(Field):
[SOP] + [SYNC] + [Packet Content] + [CRC] + [EOP]
-
SOP(Start Of Packet):起始信号,总线从空闲状态切换到K状态
-
SYNC(同步字段) :固定模式(如
KJKJKJKK),让接收方同步时钟 -
包内容:包含PID、地址、数据等实际信息
-
CRC(循环冗余校验):错误检测码
-
EOP(End Of Packet):结束信号
2.2 PID类型:包的"身份证"
PID(Packet Identifier)8位,前4位为类型,后4位为前4位的取反(校验用):
| 类型 | PID名 | 二进制 | 功能说明 |
|---|---|---|---|
| 令牌类 | OUT | 0001 | 主机→设备发送数据 |
| IN | 1001 | 主机←设备读取数据 | |
| SOF | 0101 | 帧起始(每1ms发送) | |
| SETUP | 1101 | 控制传输开始 | |
| 数据类 | DATA0 | 0011 | 数据包(交替使用) |
| DATA1 | 1011 | 数据包(交替使用) | |
| 握手类 | ACK | 0010 | 确认成功接收 |
| NAK | 1010 | 暂时无法处理 | |
| STALL | 1110 | 出错需主机干预 | |
| 特殊类 | PRE | 1100 | 前导(低速设备) |
2.3 地址和端点:精准定位
-
设备地址:7位,最多127个设备(地址0用于初始配置)
-
端点号:4位,每个设备最多16个端点
-
端点0:控制端点(所有设备必备)
-
其他端点:数据端点
-
传输顺序:优先传输最低位(LSb first)
三、事务(Transaction):完整通信流程
事务是USB传输的基本单位,由三个阶段组成:
3.1 三个阶段详解
-
令牌阶段(Token Phase)
-
主机发起,指定:目标设备地址 + 端点号 + 传输方向
-
令牌包类型:OUT、IN、SETUP
-
-
数据阶段(Data Phase)
-
可选,可能没有或连续多个数据包
-
数据包类型:DATA0、DATA1(交替使用防丢包)
-
-
握手阶段(Handshake Phase)
-
接收方回应传输状态
-
握手包类型:ACK(成功)、NAK(忙)、STALL(错误)
-
3.2 事务示例
主机写数据到设备:
cs
令牌阶段:主机发送OUT包(地址+端点)
数据阶段:主机发送DATA0包(实际数据)
握手阶段:设备回复ACK包
主机从设备读数据:
cs
令牌阶段:主机发送IN包(地址+端点)
数据阶段:设备发送DATA0包(实际数据)
握手阶段:主机回复ACK包
四、传输(Transfer):面向应用的数据单元
传输由一个或多个事务组成,分为四种类型:
4.1 批量传输(Bulk Transfer)

特点 :可靠、非实时、大数据量
应用 :U盘、打印机
实现:单个批量事务
cs
事务流程:
[OUT/IN令牌] → [DATA0/DATA1数据] → [ACK/NAK/STALL握手]
大数据传输:重复多个事务,DATA0/DATA1交替
4.2 中断传输(Interrupt Transfer)
特点 :实时、小数据量、周期性轮询
应用 :鼠标、键盘
实现 :单个中断事务(格式同批量事务)
关键:主机按固定间隔(如1ms)发起IN事务查询设备
4.3 实时传输(Isochronous Transfer)
特点 :实时、保证带宽、不保证正确性
应用 :摄像头、音频设备
实现:实时事务(无握手阶段)
cs
事务流程:
[OUT/IN令牌] → [DATA数据]
注意:无握手包,出错不重传
4.4 控制传输(Control Transfer)- 核心配置通道
特点 :可靠、所有设备必须支持
应用 :设备枚举、配置
实现:三个过程多个事务
五、控制传输详解:最复杂的传输类型
5.1 三阶段结构
cs
控制传输 = 建立过程 + 数据过程(可选)+ 状态过程
阶段1:建立过程(Setup Stage)
cs
[SETUP令牌] → [DATA0数据(8字节请求)] → [ACK握手]
-
固定使用DATA0
-
8字节请求包含:请求类型、请求号、值、索引、长度
阶段2:数据过程(Data Stage)- 可选
-
由0个或多个批量事务组成
-
方向由建立过程指定
-
数据包交替:DATA1 → DATA0 → DATA1...
阶段3:状态过程(Status Stage)
-
方向与数据过程相反
-
传输0长度数据包,固定用DATA1
-
报告操作结果
5.2 控制传输类型
-
控制写传输(数据过程为OUT):
cs建立过程 → 数据过程(OUT) → 状态过程(IN 0长度) -
控制读传输(数据过程为IN):
cs建立过程 → 数据过程(IN) → 状态过程(OUT 0长度) -
无数据控制传输:
cs建立过程 → 状态过程(IN 0长度)
5.3 状态响应(图:image.png(186.24KB))
| 结果 | 控制写传输 | 控制读传输 |
|---|---|---|
| 成功 | 0长度数据包 | ACK握手 |
| 错误 | STALL握手 | STALL握手 |
| 忙 | NAK握手 | NAK握手 |
六、关键概念总结
6.1 层次关系
cs
传输(Transfer) → 由多个事务(Transaction)组成
事务(Transaction) → 由多个阶段(Phase)组成
阶段(Phase) → 由一个数据包(Packet)实现
包(Packet) → 由多个域(Field)组成
域(Field) → 由多个位(Bit)组成
6.2 四种传输对比
| 传输类型 | 事务组成 | 握手阶段 | 数据交替 | 应用场景 |
|---|---|---|---|---|
| 批量传输 | 单个事务 | 有 | DATA0/1交替 | U盘、打印机 |
| 中断传输 | 单个事务 | 有 | DATA0/1交替 | 鼠标、键盘 |
| 实时传输 | 单个事务 | 无 | 无交替 | 摄像头、音频 |
| 控制传输 | 多个事务 | 有 | DATA0/1交替 | 设备配置 |
6.3 实际通信示例
场景:主机读取U盘文件
cs
1. 控制传输:枚举U盘,获取容量信息
- 建立过程:SETUP事务(读描述符请求)
- 数据过程:多个IN事务(读取描述符数据)
- 状态过程:OUT事务(0长度,确认完成)
2. 批量传输:读取文件数据
- 重复多个IN事务,每个事务:
[IN令牌] → [DATA0/DATA1数据] → [ACK握手]
七、高级机制补充
7.1 数据交替机制(Data Toggle)
-
发送方和接收方各维护一个位:DATA0/DATA1
-
成功传输后双方同时翻转(0↔1)
-
作用:检测丢包和重复包
7.2 错误处理
-
CRC错误:直接丢弃,无响应
-
NAK响应:稍后重试
-
STALL响应:端点挂起,需主机清除
7.3 速度协商回顾
设备插入时通过上拉电阻位置声明速度:
-
全速:D+上拉 → 主机识别为全速设备
-
低速:D-上拉 → 主机识别为低速设备
-
高速:先伪装全速,再通过握手切换到高速
八、学习要点回顾
-
记住层次关系:传输→事务→包→域→位
-
理解四种传输:根据设备特性选择传输类型
-
掌握控制传输:所有设备的基础,用于枚举配置
-
熟悉数据包格式:特别是PID类型和用途
-
了解错误处理:NAK重试、STALL干预
这个完整的知识体系涵盖了USB从物理连接到应用层通信的所有关键概念,理解这些内容后,你就能透彻掌握USB的工作原理。