一、USB协议概述:从1.0到4.0,一条总线的进化史

大家好,我是你们这趟USB协议栈开发之旅的向导。咱们第一节课,先不急着写代码,也不急着拿示波器。先把USB这个家伙的“前世今生”捋清楚。你想想看,搞了这么多年嵌入式,要是连USB到底怎么诞生的、物理上怎么传数据的、整个系统长什么样都说不清,那后面调试起来,心里肯定没底。

我个人习惯,每接触一个新协议,第一件事就是看它的物理层和拓扑。这就像盖房子,地基和框架没搞明白,装修再漂亮也白搭。好,咱们开始。

1.1 USB的发展历史:一部“提速”与“统一”的编年史

USB(Universal Serial Bus,通用串行总线)诞生的初衷,就是为了解决PC外设接口混乱的问题。90年代初,你要接个鼠标、键盘、打印机、扫描仪,得跟串口、并口、PS/2、游戏口打交道,插拔还得关机,别提多麻烦了。

1996年,USB 1.0正式发布。速度只有1.5 Mbps(低速)和12 Mbps(全速)。说实话,当时这个速度传个文本还行,传文件就有点捉急了。我记得我第一次用USB 1.1的U盘拷个几十兆的文档,那等待的时间,够我泡杯咖啡了。

版本 发布年份 理论最高速率 编码方式 主要特点
USB 1.0 / 1.1 1996 / 1998 1.5 Mbps (低速) / 12 Mbps (全速) NRZI 取代串并口,热插拔
USB 2.0 2000 480 Mbps (高速) NRZI 引入微帧,大幅提升带宽
USB 3.0 / 3.1 / 3.2 2008 / 2013 / 2017 5 Gbps / 10 Gbps / 20 Gbps 8b/10b (3.0/3.1 Gen1), 128b/132b (3.1 Gen2) 增加SDP差分对,全双工,Type-C接口
USB4 2019 40 Gbps 128b/132b 基于Thunderbolt 3协议,双通道,隧道协议

核心要点:USB 2.0是分水岭。它引入了高速模式(480 Mbps),让U盘、移动硬盘真正变得实用。而USB 3.x和USB4,则彻底改变了物理层,从半双工变成了全双工,从一对差分线变成了多对。

这里有个坑,我必须要提一下。很多新手看到USB 3.0、3.1、3.2的命名,直接晕菜。其实USB-IF组织后来把命名改得乱七八糟,3.0就是3.1 Gen1,3.1 Gen2就是3.2 Gen2x1。你只要记住,看速率就行:5Gbps、10Gbps、20Gbps。别被名字骗了。

1.2 USB物理层与电气特性:D+/D-上的“舞蹈”

搞硬件调试,物理层是绕不开的。USB的物理层,说白了就是两根数据线:D+和D-。它采用差分传输,什么意思呢?就是信号不是用一根线对地来传,而是用两根线的电压差来表示逻辑“1”和“0”。

为什么要这么干?抗干扰能力强啊!你想想,如果外界有个强电磁干扰,两根线上同时感应出同样的噪声,但它们的差值基本不变。这就是共模抑制。我在项目中遇到过,有一次板子布线没走差分线,结果USB老是丢包,后来改成紧耦合的差分对,问题立刻解决。

USB的电气特性,有几个关键参数你必须记住:

  • 差分阻抗: 90Ω ± 15%。这是硬指标,布线时必须严格控制。阻抗不连续,信号就会反射,眼图就会闭合。
  • 信号电平: 低速/全速模式下,信号幅度约为3.3V。高速模式下,信号幅度只有400mV左右。所以高速信号对噪声更敏感。
  • 边沿速率: 高速模式下,信号上升时间非常快,通常在几百皮秒级别。这要求你的PCB板材和走线长度都要仔细考虑。

调试小技巧:当你用示波器看D+和D-波形时,不要只看单端信号。把示波器通道设置成差分模式,或者用数学运算(A-B),直接看差分信号。这样能一眼看出信号质量好坏。

另外,USB的编码方式也很有意思。低速和全速用的是NRZI(非归零反转码)。简单说,就是遇到逻辑“0”就翻转电平,遇到逻辑“1”就保持。这样做的好处是,接收端可以通过检测电平翻转来恢复时钟。但问题也来了,如果连续传输多个“1”,电平长时间不翻转,接收端就会失锁。所以USB协议里规定,每6个连续的“1”之后,必须插入一个“0”来强制翻转。这就是位填充(Bit Stuffing)。

1.3 USB拓扑结构:Host、Hub、Device的“主从帝国”

USB的拓扑结构,是一个严格的星型结构。它只有一个“主人”,那就是Host(主机)。所有通信都由Host发起,Device(设备)只能被动响应。Hub(集线器)则负责扩展端口,让一个Host能连接多个Device。

这个结构,说白了就是“皇帝-太监-臣民”的关系。Host是皇帝,它决定什么时候跟谁说话。Hub是太监,负责传达命令和扩展后宫。Device是臣民,只能等着皇帝召见,不能主动上奏。

为什么这么设计?为了简化设备。你想想,如果每个U盘都要能主动发起通信,那协议就复杂多了,成本也上去了。USB的设计哲学就是“把复杂留给主机,把简单留给设备”。

咱们来看一张图,把整个USB系统的层次结构理清楚:

USB拓扑结构示意图 USB Host (主机) Root Hub (根集线器) Hub (集线器) Hub (集线器) Device (鼠标) Device (键盘) Device (U盘) Device (打印机) 拓扑规则 1. 一个USB系统中只能有一个Host。 2. 最多支持127个设备(包括Hub)。 3. Hub级联最多7层。

从这张图你能看到,Host内部有一个Root Hub,它负责管理所有端口。每个端口可以接一个Device,或者再接一个Hub。Hub再往下扩展。整个系统就像一棵树,Host是树根,Device是树叶。

这里有个重要的概念:枚举。当Device插入时,Host会通过一系列操作来识别它,给它分配地址,加载驱动。这个过程就是枚举。我在调试时,经常用USB分析仪抓枚举过程,看设备到底卡在哪一步。是地址分配失败?还是配置描述符读错了?一眼就能看出来。

避坑指南:我曾经遇到过一个项目,设备在A电脑上能正常工作,在B电脑上就认不出来。查了半天,发现是B电脑的USB端口供电不足,导致设备上电复位时序不对。所以,硬件设计时,一定要保证USB端口的电源质量,特别是大电流设备(如移动硬盘),最好用外部供电。