第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的枚举过程,我简单说一下:
- Device插入,Host检测到D+/D-电平变化
- Host复位设备,获取设备描述符
- Host分配地址(地址0是默认的,后面会重新分配)
- Host获取配置描述符、接口描述符、端点描述符
- Host选择配置,设备进入就绪状态
这个过程,说白了就是Host和Device互相认识一下。Host问「你是谁?你能干什么?」,Device回答「我是某某设备,我有这些功能」。然后Host说「好,你就按这个配置工作吧」。
核心要点:USB协议中,所有传输都由Host发起。Device只能被动响应。这个设计简化了设备端的实现,但也意味着设备不能实时上报数据——必须等Host来问。
最后说个我个人的习惯:做USB驱动开发时,我会先拿USB分析仪抓一下枚举过程。看看描述符对不对,地址分配正不正常。这一步能省下后面大量的调试时间。
好了,USB协议基础就讲到这里。下一章我们会深入USB的传输类型——控制传输、批量传输、中断传输、等时传输,这些才是驱动开发的核心。