1. USB基础回顾:体系架构、速率等级、协议栈分层
各位同学,咱们正式开始。做USB OTG性能调优,说白了就是跟数据吞吐量较劲。但较劲之前,你得先搞清楚USB这玩意儿的底子长什么样。我刚开始接触USB时,看协议栈就像看天书,后来踩了无数坑才摸清门道。这一节我们先打好地基,把体系架构、速率等级、协议栈分层这三块讲透。
1.1 USB体系架构:主从与OTG的进化
传统的USB架构是典型的主从模型。一个主机(Host)对应多个设备(Device),所有通信必须由主机发起。你在PC上插个U盘,PC就是主机,U盘就是设备。这模型简单可靠,但到了移动设备上就尴尬了——你想让手机直接读相机里的照片,手机必须当主机,相机必须当设备。那谁来协商?
所以就有了OTG(On-The-Go)。OTG引入了一个双角色能力,设备可以在Host和Device之间动态切换。我早期的一个项目是做车载互联模块,当时客户要求手机既能在车机上投屏(手机当Host,车机当Device),又能从车机读文件(手机当Device,车机当Host)。嗯,OTG就是那个解药。
USB体系里还有几个重要角色:集线器(Hub)负责扩展端口,但超高速下每个Hub都会引入额外延迟,性能调优时要特别注意路径上的Hub数量。我个人习惯在OTG设计中尽量直连,去掉中间Hub。
- Host:发起传输,管理总线调度
- Device:响应传输,可以是功能设备(如存储、摄像头)或Hub
- OTG双角色设备(DRD):可动态切换角色,依赖ID引脚/事件触发
- 集线器:扩展拓扑,但额外增加延迟和信号损耗
1.2 速率等级:从1.5 Mbps到20 Gbps的跨度
USB的速率等级直接决定了你能跑什么应用。我遇到过好几个人,信誓旦旦说自己做的USB 3.0设备能到5 Gbps,结果测出来不到2 Gbps。为什么?瓶颈往往在PHY配置、线缆质量和协议开销上。先看看这些等级的理论极限:
| 版本 | 市场名称 | 理论最大速率 | 编码方式 | 我常注意的点 |
|---|---|---|---|---|
| USB 1.0 | 低速(Low Speed) | 1.5 Mbps | NRZI + 位填充 | 只用于人机交互设备 |
| USB 1.1 | 全速(Full Speed) | 12 Mbps | NRZI + 位填充 | 兼容性高,但延迟大 |
| USB 2.0 | 高速(High Speed) | 480 Mbps | NRZI + 位填充 | 半双工,适合批量传输 |
| USB 3.x | 超高速(SuperSpeed) | 5 Gbps / 10 Gbps / 20 Gbps | 8b/10b (Gen1), 128b/132b (Gen2) | 全双工,瓶颈常在线缆和控制器 |
看到没有?USB 2.0用NRZI加位填充,编码效率低,有效带宽只有理论值的80%不到。而USB 3.0用8b/10b,开销20%。USB 3.2 Gen2×2用128b/132b,效率直接拉高。我记得去年调试一个USB 3.1 Gen2的摄像头项目,一直抱怨达不到10 Gbps,最后发现是线缆用的便宜货,屏蔽层不够,误码率飙高,重传吃掉带宽。
1.3 协议栈分层:物理层、链路层、协议层
USB的协议栈是分层设计的,跟OSI模型有点神似,但更简化。我习惯把调试过程也分层:先查物理层,再看链路层,最后确认协议层。顺序不能乱,否则你会疯掉。
物理层(PHY)
物理层管信号眼图、差分电压、阻抗匹配。USB 2.0用差分DP/DM,电压摆幅400mV;USB 3.0用 SSTX/SSRX 差分对,摆幅更低。我在一个项目中踩过坑:PCB走线没控制好特性阻抗(要求90Ω差分),导致眼图闭合,高速根本跑不起来。嗯,这是一笔血泪教训。
- 信号完整性:阻抗控制、端接匹配、回流路径
- 电气特性:差分电压、抖动、位填充
- 检测机制:设备插入/拔出检测、速率协商
链路层(Link Layer)
链路层负责包的封装、错误检测和流量控制。USB 2.0用的是包框架:令牌包、数据包、握手包。USB 3.0引入了链路命令和链路训练。我记得刚开始搞USB 3.0时,不理解为什么链路层要做链路训练,后来发现是為了信号在5 Gbps下对齐锁相环,不然根本没法稳定通信。
- 包类型:令牌()、数据(Data)、握手(Handshake)、特殊(Special)
- 错误检测:CRC(循环冗余校验)
- 流量控制:NACK机制、NRDY(USB 3.0)
- 链路训练:USB 3.0启动时需完成极性、扰码、均衡协商
协议层(Protocol Layer)
协议层定义端点、管道、传输类型。USB有四种传输类型:控制传输(Control)、批量传输(Bulk)、中断传输(Interrupt)、等时传输(Isochronous)。你做OTG性能调优,最关心的就是批量传输,因为它承担大部分数据吞吐。
- 控制传输:0号端点,用于配置和命令
- 批量传输:大块数据,保证交付但不保证延迟(适合存储)
- 中断传输:小数据、低延迟(适合HID)
- 等时传输:实时数据,不保证交付(适合音视频)
好了,USB基础回顾大概就是这些。你可能会问,这些分层跟实际的OTG性能调优有什么关系?我举一个实际场景:你在调试手机外接U盘时发现速度慢,第一步应该测物理层的眼图,看信号有没有塌陷;第二步用逻辑分析仪抓链路层的重传率;第三步看协议层的端点配置是否过大或过小。一步步来,定位问题就快了。