1. 课程导入

大家好,我是你们这期课程的老朋友。做嵌入式硬件十几年,USB接口是我打交道最多的协议之一。今天咱们先聊聊USB协议的整体面貌——标准怎么演进的、电气上有什么讲究、拓扑长什么样、设备插上去之后到底发生了什么。

说白了,搞懂USB,你就能搞定90%的外设连接问题。我刚开始做项目时,经常被USB枚举失败折腾得够呛,后来才发现,很多坑其实在协议层面就有答案。

1.1 USB标准演进:速度与兼容性的博弈

USB从1996年诞生到现在,经历了几个关键阶段。我整理了一张表,方便大家对照:

标准版本 发布年份 理论速率 编码方式 信号电平
USB 1.0/1.1 1996/1998 1.5 Mbps (Low Speed)
12 Mbps (Full Speed)
NRZI + 位填充 3.3V (差分)
USB 2.0 2000 480 Mbps (High Speed) NRZI + 位填充 400mV (差分)
USB 3.2 Gen 1 2013 5 Gbps (SuperSpeed) 8b/10b 1V (差分)
USB 3.2 Gen 2 2017 10 Gbps 128b/132b 1V (差分)
USB4 2019 20/40 Gbps 基于Thunderbolt 3 兼容USB 3.x

关键点:USB 2.0 High Speed虽然速率比Full Speed高了40倍,但信号摆幅反而从3.3V降到了400mV。为什么?速率高了,压摆率必须跟上,低摆幅才能保证信号完整性。我在一个项目中用过3.3V的Full Speed器件去兼容High Speed总线,结果眼图完全闭合——教训深刻。

1.2 物理层电气特性:信号完整性从这里开始

做硬件设计,电气参数是绕不开的。USB 2.0和USB 3.x的物理层差异很大,我分别说一下。

USB 2.0 电气特性

  • 差分信号:D+和D-两条线,差分阻抗90Ω ± 15%
  • 信号电平:Low Speed/Full Speed用3.3V摆幅,High Speed用400mV摆幅
  • 边沿速率:High Speed要求上升/下降时间在500ps左右
  • 抖动要求:总抖动不超过±100ps

避坑指南:我曾经在一个USB 2.0高速设计中,PCB走线长度差了200mil,结果眼图测试时数据眼宽只剩不到300ps。USB 2.0高速对等长要求很严,建议D+和D-走线长度差控制在50mil以内。

USB 3.x 电气特性

  • 差分信号:SSTX+/-和SSRX+/-两对独立差分对,阻抗85Ω ± 15%
  • 信号电平:摆幅约1V,预加重和去加重可选
  • 编码方式:8b/10b(Gen 1)或128b/132b(Gen 2)
  • 交流耦合:发送端必须串接100nF电容

嗯,这里要注意:USB 3.x的阻抗是85Ω,不是90Ω。很多人习惯性按90Ω去设计,结果回损超标。我见过一个案例,厂商按90Ω做了USB 3.0的PCB,眼图测试时裕量只剩5%,后来改到85Ω才通过。

1.3 拓扑结构:树形还是星形?

USB的拓扑是树形结构,一个Host下面最多挂127个设备。但实际设计中,我建议不要超过5层Hub级联,否则延迟和电源问题会让你头疼。

USB 树形拓扑结构 USB Host Root Hub Hub 1 Hub 2 Hub 3 Mouse (LS) Keyboard (FS) Flash Drive (HS) Camera (SS) 说明: • Host 最多可挂 127 个设备(含 Hub) • 建议 Hub 级联不超过 5 层,否则延迟和电源问题突出 • 不同速率设备可以混合接入,但 Hub 会做速率转换

个人经验:我习惯在原理图上给每个USB端口加一个TVS管和共模扼流圈。别小看这两个元件,有一次客户现场设备频繁掉线,查了半天发现是共模干扰导致D+信号畸变,加了扼流圈后问题解决。

1.4 枚举流程:设备插上后发生了什么?

你插上一个U盘,系统怎么知道它是什么设备?这个过程叫枚举。我把它拆成几个步骤:

  1. 设备插入检测:Host检测到D+或D-上的上拉电阻(Full Speed设备在D+上拉1.5kΩ,Low Speed在D-上拉)
  2. 复位:Host拉低D+和D-至少10ms,设备进入默认状态
  3. 获取设备描述符:Host发送Get_Descriptor请求,设备返回18字节的设备描述符
  4. 设置地址:Host分配一个唯一地址(1-127),设备确认后切换地址
  5. 获取配置描述符:Host获取配置、接口、端点等详细信息
  6. 选择配置:Host发送Set_Configuration,设备进入工作状态

我曾经踩过的坑:有一次设计USB设备,枚举总是卡在获取配置描述符这一步。用USB分析仪抓包发现,设备返回的配置描述符长度字段写错了。USB协议对描述符格式要求极其严格,多一个字节或少一个字节都会导致枚举失败。建议大家在固件中做描述符校验,或者先用标准工具验证。

1.5 速率协商:设备怎么告诉Host自己能跑多快?

你想想看,一个USB 2.0 Host插上一个USB 3.0设备,它们怎么知道彼此的能力?

USB 2.0的速率协商靠D+/D-上的上拉电阻:

  • Low Speed:D-上拉1.5kΩ到3.3V
  • Full Speed:D+上拉1.5kΩ到3.3V
  • High Speed:先以Full Speed上拉,然后通过Chirp J/K序列协商切换到高速

USB 3.x的速率协商则通过边带信号完成。设备插入后,Host通过检测Rx端子的电气状态来判断是否支持SuperSpeed。这个过程独立于USB 2.0的枚举,所以USB 3.x设备实际上有两套物理层在同时工作。

核心要点:USB 3.x的Type-C接口有CC引脚用于协商供电和角色。我在一个项目中忽略了CC逻辑,结果设备插上后Host不识别——因为CC引脚没有正确上拉。Type-C的CC逻辑比传统Type-A/B复杂得多,后面章节我会专门讲。

1.6 本章小结

USB协议从2.0到4.0,速率提升了近千倍,但底层思想没变:差分信号、树形拓扑、描述符枚举。做硬件设计时,我建议大家先搞清楚你的设备属于哪个速率等级,然后针对性地设计PCB和固件。

嗯,这一章就到这里。记住一句话:USB的物理层决定了信号能不能传过去,协议层决定了传过去之后能不能用。两者缺一不可。