1. USB协议概述:从1.0到4.0的演进之路

大家好,我是你们的老朋友。今天咱们开始聊USB协议。说实话,USB这东西,你天天用,但真要把它讲透,还真得花点功夫。我做了十几年嵌入式开发,从USB 1.1时代一路摸爬滚打过来,踩过的坑能绕实验室三圈。嗯,咱们先从最基础的开始——USB的发展史。

1.1 USB的发展历史:从1.0到4.0

USB的全称是Universal Serial Bus,通用串行总线。1994年,Intel、IBM、Microsoft等几家公司凑在一起,觉得当时的接口太乱了——串口、并口、PS/2、游戏口...插个鼠标键盘都得对半天接口。于是他们决定搞一个统一的接口标准。这就是USB的由来。

USB 1.0 / 1.1(1996-1998)

USB 1.0在1996年发布,但说实话,那会儿就是个半成品。真正大规模商用是1998年的USB 1.1。速度只有12 Mbps(全速)和1.5 Mbps(低速)。我记得当年第一次用USB鼠标,感觉整个世界都清爽了——终于不用关机插拔了!

关键数据:

  • USB 1.0:低速1.5 Mbps,全速12 Mbps
  • USB 1.1:修复了1.0的bug,正式商用版本
  • 线缆最大长度:5米(全速),3米(低速)

USB 2.0(2000年)

2000年发布的USB 2.0,速度飙到了480 Mbps,也就是高速模式。这一下子让U盘、移动硬盘、摄像头这些设备真正好用起来。我在2003年做第一个USB 2.0项目时,最头疼的就是信号完整性——480 Mbps的D+ D-信号,布线稍微不注意就过不了眼图测试。

个人经验:USB 2.0的D+ D-差分线,我建议走线时保持90欧姆差分阻抗,等长控制在5 mil以内。当年有个项目就是因为等长差了15 mil,结果高速设备死活枚举不上,查了两天才找到原因。

USB 3.0 / 3.1 / 3.2(2008-2017)

USB 3.0在2008年发布,速度直接跳到5 Gbps。它加了新的差分对——SSTX+/-和SSRX+/-,跟原来的D+ D-共存。说白了,就是USB 2.0的线还在,但额外多了两对高速差分线。后来USB 3.1(2013年)翻倍到10 Gbps,USB 3.2(2017年)又搞出了多通道模式,最高20 Gbps。

这里有个坑我要提醒你:USB 3.x的命名特别混乱。3.0、3.1 Gen 1、3.2 Gen 1其实都是5 Gbps;3.1 Gen 2、3.2 Gen 2是10 Gbps。你想想看,一个工程师要是没搞清楚这个,采购物料时指定错了型号,那得多尴尬?

USB 4.0(2019年)

USB 4.0基于Intel的Thunderbolt 3协议,速度最高40 Gbps。它最大的变化是采用了隧道协议——可以把PCIe、DisplayPort、USB数据都打包在一起传输。说白了,一根线搞定所有。我在2021年调试USB 4.0设备时,发现它对线缆质量要求极高,普通的USB-C线根本跑不到40 Gbps。

版本 发布时间 最大速率 编码方式
USB 1.1 1998 12 Mbps NRZI
USB 2.0 2000 480 Mbps NRZI
USB 3.0 2008 5 Gbps 8b/10b
USB 3.1 2013 10 Gbps 128b/132b
USB 4.0 2019 40 Gbps 128b/132b

1.2 USB的物理层特性:D+/D-信号与供电机制

咱们来看看USB最底层的物理层。你想想看,数据在线上到底是怎么传输的?

D+ / D- 差分信号

USB 2.0及以下版本使用一对差分信号线:D+和D-。为什么用差分?说白了就是为了抗干扰。两个信号同时受干扰,但它们的差值基本不变。我习惯把D+和D-想象成两个人抬轿子——步调一致才能走得稳。

USB的编码方式叫NRZI(Non Return to Zero Inverted)。规则很简单:数据位为0时,信号翻转;数据位为1时,信号保持不变。再加上位填充(Bit Stuffing)——连续6个1之后自动插入一个0,防止时钟同步丢失。

避坑指南:我曾经在一个项目中,因为PCB走线时D+和D-没有严格等长,导致信号歪斜(Skew)超标。USB 2.0高速模式下,这对差分线的等长要求是±5 mil以内。你想想看,5 mil才0.127毫米,稍微拐个弯就超了。所以我的建议是:走线时让D+和D-紧紧贴在一起走,不要分开。

供电机制:VBUS与GND

USB线缆里有4根线:VBUS(5V供电)、D+、D-、GND。USB 3.x又多了几根,但供电还是靠VBUS。

  • USB 2.0及以下:标准供电500 mA,5V。低功耗设备100 mA。
  • USB 3.0:提升到900 mA,5V。
  • USB BC 1.2(充电协议):最高1.5A,5V。
  • USB PD(Power Delivery):最高20V,5A,100W。

这里有个细节要注意:设备上电后,先通过D+和D-上的上拉/下拉电阻来识别设备类型。比如全速设备在D+上接1.5kΩ上拉,低速设备在D-上接1.5kΩ上拉。Host检测到这些电平变化,就知道接了个什么设备。

个人经验:调试USB供电问题时,我建议先用USB电流表看实际电流。有一次我遇到设备间歇性掉线,查了半天发现是VBUS线缆压降太大——线太细太长,到设备端只剩4.2V了。USB规范要求VBUS在设备端不低于4.4V,低于这个值设备就会复位。

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

USB的拓扑结构是典型的星型结构。说白了,就是一棵树——Host是树根,Hub是树枝,Device是树叶。

Host(主机)

Host是整个USB系统的老大。它负责管理总线、发起所有传输、分配地址、管理电源。在PC上,Host就是主板上的USB控制器(比如Intel的xHCI)。在嵌入式系统里,Host可以是带USB OTG功能的MCU。

Host内部有个根集线器(Root Hub),通常提供2-4个端口。每个端口都可以接Hub或Device。

Hub(集线器)

Hub的作用就是扩展端口。一个USB系统中最多可以级联7层Hub(包括Root Hub)。Hub负责转发数据、管理下游端口的电源、检测设备插拔。

我记得有一次调试一个USB Hub,发现下游设备总是枚举失败。用USB分析仪抓包一看,原来是Hub在复位设备时,复位信号持续时间不够。USB规范要求复位信号至少10 ms,那个Hub只给了8 ms。嗯,这就是典型的Hub芯片bug。

Device(设备)

Device就是各种外设:U盘、鼠标、键盘、摄像头、打印机...每个Device都有一个唯一的7位地址(1-127),由Host在枚举时分配。

Device内部有多个端点(Endpoint),每个端点就是一个数据通道。端点0是控制端点,用于枚举和配置。其他端点可以是中断传输、批量传输、等时传输。

拓扑结构要点:

  • 一个USB系统中只能有一个Host
  • 最多127个设备(包括Hub)
  • 最多7层Hub级联
  • 每个设备有唯一的地址
  • Host发起所有数据传输

你想想看,为什么Host要发起所有传输?因为USB是主从架构。Device不能主动发数据,只能等Host来问。这就好比老师点名——老师(Host)叫到谁,谁(Device)才能回答问题。这种设计简化了总线仲裁,但也带来了延迟问题。所以USB 3.0引入了异步通知机制,让Device可以主动通知Host有数据要传。

好了,这一章咱们把USB的来龙去脉、物理层特性和拓扑结构都过了一遍。下一章我会深入讲USB的协议层——包结构、传输类型、枚举过程。到时候咱们再细聊。

学习建议:我建议你手边准备一个USB分析仪(比如Beagle USB 480或Ellisys),边学边抓包看。理论结合实践,才能真正理解USB协议。当年我就是靠着一台二手分析仪,把USB协议啃下来的。