第1章:USB协议基础

1.1 USB发展史:从USB 1.0到USB4

说起USB,我入行那会儿还是USB 1.1的时代。那时候传输速度只有12Mbps,拷个MP3都要等半天。你想想看,现在USB4已经飙到40Gbps了,这差距有多大。

USB的发展史,说白了就是一部「速度进化史」:

版本 发布时间 理论速率 我印象中的事
USB 1.0 1996年 1.5 Mbps(低速) 当时键盘鼠标还在用PS/2口
USB 1.1 1998年 12 Mbps(全速) 我第一次用U盘就是这规格
USB 2.0 2000年 480 Mbps(高速) 这代最经典,现在很多设备还在用
USB 3.0 2008年 5 Gbps(超高速) 蓝色接口就是它,一眼能认
USB 3.1 2013年 10 Gbps Type-C接口开始普及
USB 3.2 2017年 20 Gbps 双通道传输,有点意思
USB4 2019年 40 Gbps 基于Thunderbolt 3协议

关键点:USB版本向下兼容。你拿USB 3.0的U盘插USB 2.0的口,能工作,但速度会降到480Mbps。我在项目中遇到过有人抱怨速度慢,结果发现是插错了接口。

1.2 USB物理层特性:D+/D-差分信号

USB的物理层,核心就是两根数据线:D+和D-。它们采用差分信号传输,什么意思呢?

说白了,就是数据不是靠一根线的电压高低来判定的,而是靠两根线的电压差。D+和D-的电压总是相反的——一个高,另一个就低。接收端看的是(D+) - (D-)的差值。

为什么要这么设计?抗干扰能力强啊。外界噪声同时作用在两根线上,差值基本不变。我在调试一个游戏手柄时,线缆长了点,单端信号已经乱跳了,差分信号依然稳如老狗。

USB的电气特性,我整理了几个关键参数:

  • 低速模式(1.5 Mbps):D-线上拉,D+线下拉
  • 全速模式(12 Mbps):D+线上拉,D-线下拉
  • 高速模式(480 Mbps):电流驱动模式,终端匹配
  • 信号电平:差分信号幅度约400mV(高速模式)

我的经验:做USB布线时,D+和D-要等长走线,差分阻抗控制在90Ω±15%。我曾经因为没注意等长,导致信号时序偏移,设备枚举时断时续,查了两天才找到原因。

嗯,这里要注意:USB线缆最长不能超过5米(全速/低速),高速模式更短,建议3米以内。超过这个长度,信号衰减会让你头疼。

1.3 USB拓扑结构:Host、Hub、Device

USB的拓扑结构,是个典型的树形结构。一个Host下面可以挂多个Hub,每个Hub下面又可以挂Device或者更多的Hub。但注意,最多只能有7层(包括根Hub)。

三种角色的定义:

  • Host(主机):唯一的总线控制器,负责调度所有传输。PC、手机、游戏机都是Host。
  • Hub(集线器):负责扩展端口,转发数据。它不处理数据内容,只做信号中继。
  • Device(设备):功能实体,比如U盘、鼠标、游戏手柄。

你想想看,为什么游戏机外设开发要理解这个?因为你的手柄是Device,它必须遵循Host的调度。Host问一句,Device答一句,不能自己乱说话。

避坑指南:我曾经开发一个USB游戏手柄,设备端主动发了数据给Host,结果Host直接断开了连接。后来查协议才知道,USB是Host轮询机制,Device不能主动发起传输。这个坑,我踩过。

USB的枚举过程,我简单说一下:

  1. Device插入,Host检测到D+/D-电平变化
  2. Host复位设备,获取设备描述符
  3. Host分配地址(地址0是默认的,后面会重新分配)
  4. Host获取配置描述符、接口描述符、端点描述符
  5. Host选择配置,设备进入就绪状态

这个过程,说白了就是Host和Device互相认识一下。Host问「你是谁?你能干什么?」,Device回答「我是某某设备,我有这些功能」。然后Host说「好,你就按这个配置工作吧」。

核心要点:USB协议中,所有传输都由Host发起。Device只能被动响应。这个设计简化了设备端的实现,但也意味着设备不能实时上报数据——必须等Host来问。

最后说个我个人的习惯:做USB驱动开发时,我会先拿USB分析仪抓一下枚举过程。看看描述符对不对,地址分配正不正常。这一步能省下后面大量的调试时间。

好了,USB协议基础就讲到这里。下一章我们会深入USB的传输类型——控制传输、批量传输、中断传输、等时传输,这些才是驱动开发的核心。