1. USB协议基础:USB发展史、USB物理层与电气特性、USB拓扑结构、USB数据流模型
大家好,我是你们的硬件工程师老张。今天咱们开始第一课,聊聊USB协议的基础。说实话,USB这东西,我们天天用,但真正把它吃透的人不多。我当年刚入行时,也踩过不少坑。这节课,我就把那些年积累的经验,掰开了揉碎了讲给你们听。
1.1 USB发展史:从1.0到4.0的演进
USB的全称是Universal Serial Bus,通用串行总线。1994年,Intel、IBM、Microsoft等七家公司联合搞出了这个标准。为啥要搞它?说白了,就是当时电脑后面的接口太乱了——串口、并口、PS/2、游戏口...插个鼠标都要对半天。
USB 1.0/1.1(1996-1998):速度只有1.5Mbps(低速)和12Mbps(全速)。我记得第一次用USB鼠标时,感觉整个世界都清爽了——终于不用关机插拔了!
USB 2.0(2000):速度飙到480Mbps,也就是高速模式。这个版本生命力极强,到现在很多设备还在用。我做过一个项目,客户非要坚持用USB 2.0,说“够用就行”。嗯,有时候确实是这样。
USB 3.0/3.1/3.2(2008-2017):速度从5Gbps一路干到20Gbps。这里有个坑要注意——USB 3.0后来改名叫USB 3.1 Gen1,USB 3.1改叫USB 3.1 Gen2...命名乱得很。我建议你们直接看速度:5Gbps、10Gbps、20Gbps,别管它叫什么。
USB4(2019):基于Thunderbolt 3协议,最高40Gbps。Type-C接口一统天下。说实话,到了这个阶段,USB已经不是一个简单的“串行总线”了,它更像是一个万能的数据管道。
核心要点:USB版本的命名虽然混乱,但记住一个规律——看速度,别看名字。5Gbps就是USB 3.0,10Gbps就是USB 3.1,20Gbps就是USB 3.2,40Gbps就是USB4。
1.2 USB物理层与电气特性
物理层,说白了就是信号怎么在线上跑。USB用差分信号传输,D+和D-两根线。为什么用差分?抗干扰能力强啊!你想想看,如果外界有噪声,两根线上受到的干扰差不多,一减就没了。
电气特性关键参数:
| 参数 | 低速/全速 | 高速 | 超高速 |
|---|---|---|---|
| 信号电压 | 3.3V(差分) | 400mV(差分) | 800mV-1.2V |
| 终端电阻 | 15kΩ上拉 | 45Ω对地 | 差分阻抗90Ω |
| 线缆长度 | 5米 | 5米 | 3米 |
这里有个我踩过的坑。有一次做USB 2.0高速设备,信号死活不稳定。查了两天,最后发现是D+和D-的走线长度差了3mm。高速模式下,信号上升沿只有几百皮秒,这点长度差就导致时序出问题了。所以,差分对等长布线,这是铁律。
警告:USB 2.0高速模式下,D+和D-的走线长度差不要超过5mm。我曾经因为3mm的误差,让整个项目延期了一周。别问我怎么知道的...
再说说终端电阻。低速和全速设备,在D+或D-上有个15kΩ的上拉电阻,用来告诉主机“我是什么速度”。高速设备则是在D+上有个1.5kΩ的上拉,但工作起来后要切掉。嗯,这个切换过程叫“高速握手”,挺复杂的,后面章节会细讲。
1.3 USB拓扑结构:星形网络
USB的拓扑结构是星形的。一个主机(Host),下面挂集线器(Hub),集线器再挂设备。最多支持127个设备(包括Hub本身)。
为什么是星形?不是菊花链?我个人的理解是:USB设计之初就是为了替代PC上的各种外设接口,星形结构最符合“一个主机带多个外设”的使用场景。你想想看,谁会把打印机、键盘、鼠标串成一串?
拓扑结构的关键角色:
- 主机(Host):唯一的主控者,所有通信由它发起。PC、手机、平板都可以是Host。
- 集线器(Hub):负责扩展端口,转发数据。分上游端口和下游端口。
- 设备(Device):被控者,只能响应主机的请求。
- OTG(On-The-Go):可以切换角色,手机既能当Host也能当Device。
这里有个容易混淆的点:USB不支持设备间直接通信。两个U盘插在同一个Hub上,它们之间不能直接传数据,必须经过主机中转。为什么?因为USB是主从架构,所有数据流都要经过主机。这个设计简化了协议,但也限制了灵活性。
小技巧:如果你需要设备间直接通信,可以考虑USB OTG或者USB-C的Alternate Mode。但记住,这已经不是标准的USB协议了。
1.4 USB数据流模型:管道与端点
数据流模型,是USB协议最核心的部分。我当年学这个的时候,绕了好久才搞明白。说白了,就是数据怎么在主机和设备之间流动。
端点(Endpoint):设备上的一个数据缓冲区。每个设备可以有多个端点,编号从0到15。端点0是控制端点,每个设备必须有。其他端点根据设备功能来定。
管道(Pipe):主机和设备端点之间的逻辑连接。管道有两种:消息管道(Message Pipe)和流管道(Stream Pipe)。
传输类型(Transfer Type):
| 传输类型 | 特点 | 应用场景 | 带宽保证 |
|---|---|---|---|
| 控制传输 | 双向,可靠,用于配置 | 枚举、设置参数 | 10%保留 |
| 批量传输 | 可靠,无带宽保证 | U盘、打印机 | 无 |
| 中断传输 | 可靠,有轮询周期 | 鼠标、键盘 | 有(按轮询间隔) |
| 同步传输 | 不可靠,有带宽保证 | 音频、视频 | 有(按帧预算) |
我举个例子你就明白了。U盘用批量传输,因为数据必须完整无误,慢一点没关系。摄像头用同步传输,因为画面可以丢几帧,但不能卡顿。鼠标用中断传输,因为需要及时响应,但数据量小。
这里有个坑:同步传输没有重传机制。如果数据传错了,就丢了。所以做音频设备时,一定要在应用层做纠错。我曾经做过一个USB麦克风,客户说声音偶尔有爆音,查了半天,就是同步传输丢包导致的。后来加了前向纠错(FEC),问题解决。
核心要点:选择传输类型时,记住这个原则——数据完整性要求高的用批量或控制,实时性要求高的用同步或中断。鱼和熊掌不可兼得。
最后说说帧(Frame)的概念。USB 1.0/2.0中,主机每1ms发送一个SOF(Start of Frame)包,这就是一个帧。高速模式下,帧周期是125μs(微帧)。所有传输都在帧内进行。这个机制保证了总线的公平性——每个设备都有机会传输数据。
好了,第一课就到这里。USB协议基础是后面所有章节的基石,尤其是数据流模型,一定要吃透。下一课我们讲USB枚举过程——设备插上去之后,主机是怎么认识它的。到时候我会分享一个我调试枚举失败的案例,保证让你印象深刻。