USB协议详解:从物理连接到数据传输的完整解析

此次笔记将引入很多概念,这些概念对于你以后无论是写应用程序还是驱动程序都很有帮助

一、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 三个阶段详解

  1. 令牌阶段(Token Phase)

    • 主机发起,指定:目标设备地址 + 端点号 + 传输方向

    • 令牌包类型:OUT、IN、SETUP

  2. 数据阶段(Data Phase)

    • 可选,可能没有或连续多个数据包

    • 数据包类型:DATA0、DATA1(交替使用防丢包)

  3. 握手阶段(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 控制传输类型

  1. 控制写传输(数据过程为OUT):

    cs 复制代码
    建立过程 → 数据过程(OUT) → 状态过程(IN 0长度)
  2. 控制读传输(数据过程为IN):

    cs 复制代码
    建立过程 → 数据过程(IN) → 状态过程(OUT 0长度)
  3. 无数据控制传输

    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-上拉 → 主机识别为低速设备

  • 高速:先伪装全速,再通过握手切换到高速

八、学习要点回顾

  1. 记住层次关系:传输→事务→包→域→位

  2. 理解四种传输:根据设备特性选择传输类型

  3. 掌握控制传输:所有设备的基础,用于枚举配置

  4. 熟悉数据包格式:特别是PID类型和用途

  5. 了解错误处理:NAK重试、STALL干预

这个完整的知识体系涵盖了USB从物理连接到应用层通信的所有关键概念,理解这些内容后,你就能透彻掌握USB的工作原理。

相关推荐
简单点的学玩4 小时前
国标充电基础介绍
网络
W.KN4 小时前
关于论文如何开始的学习笔记
人工智能·笔记·学习
(●—●)橘子……5 小时前
记力扣42.接雨水 练习理解
笔记·学习·算法·leetcode·职场和发展
可爱又迷人的反派角色“yang”5 小时前
docker(三)
linux·运维·网络·docker·容器·云计算
爱写代码的小朋友5 小时前
生成式人工智能赋能跨学科主题学习的范式重构与实践路径研究
人工智能·学习·重构
悠哉悠哉愿意5 小时前
【EDA学习笔记】PCB技术导入
笔记·学习·eda
太极生两鱼5 小时前
网络工程师
学习
爱潜水的小L5 小时前
自学嵌入式day37,网络编程
开发语言·网络·php
Bin二叉5 小时前
南京大学cpp复习(c10——多态、操作符重载)
开发语言·c++·笔记·学习