USB协议基础:从物理层到传输类型

做热成像相机,USB接口是绕不开的坎。我最早接触USB协议时,觉得这东西太复杂了——又是描述符又是端点,光枚举过程就能把人绕晕。但后来我发现,只要抓住几个核心概念,USB其实没那么可怕。

今天我就把USB 2.0/3.0的物理层、枚举过程、描述符结构,还有四种传输类型,掰开了揉碎了讲给你听。嗯,咱们从最底层的电气特性开始。

USB 2.0 vs 3.0:物理层与电气特性

先说说物理层。USB 2.0用的是四线制:VBUS(电源)、GND(地)、D+和D-(差分数据线)。数据通过差分信号传输,说白了就是靠两根线上的电压差来表示0和1。

USB 2.0的速度分三档:

  • 低速(1.5 Mbps):用于鼠标、键盘这类设备
  • 全速(12 Mbps):音频设备、HID设备常用
  • 高速(480 Mbps):视频、存储设备的主流选择

我个人习惯在设计热成像相机时,优先考虑高速模式。为什么?因为一帧640×480的热像图,16位像素深度,算下来数据量不小。用全速传输,帧率根本提不上去。

关键点:USB 2.0高速模式下,D+和D-上的信号摆幅只有400mV,比全速的3.3V小得多。这意味着对PCB布线要求更高——差分对要等长,阻抗要控制在90Ω±15%。

到了USB 3.0,情况就变了。它增加了五根线:两对超高速差分线(SSTX+/-和SSRX+/-),再加一根GND。所以USB 3.0的线缆总共有9根线。速度直接飙到5 Gbps,后来还有10 Gbps的3.1和20 Gbps的3.2。

我在项目中遇到过一个问题:USB 3.0的线缆如果屏蔽没做好,热成像相机的图像会出现随机噪点。后来查了半天,发现是高速信号串扰到了传感器数据线上。解决办法很简单——把USB线缆和传感器线缆分开走,中间加个地线隔离。

USB设备枚举过程

枚举,说白了就是设备插上后,主机和它互相认识的过程。这个过程很有意思,我建议你把它背下来,因为调试USB问题时,90%的坑都出在枚举阶段。

枚举流程大致如下:

  1. 设备插入:主机检测到D+或D-上的电平变化(全速/高速设备拉高D+,低速设备拉高D-)
  2. 复位:主机将D+和D-都拉低至少10ms,设备进入默认状态
  3. 获取设备描述符:主机发控制传输,要设备描述符(前8个字节就够了)
  4. 再次复位:主机根据设备描述符中的速度信息,决定是否启用高速模式
  5. 设置地址:主机给设备分配一个唯一地址(1-127)
  6. 获取完整描述符:主机获取设备描述符、配置描述符、接口描述符、端点描述符
  7. 选择配置:主机发Set Configuration命令,设备进入配置状态

避坑指南:我曾经调试一个热成像相机,枚举总是卡在第3步。用USB分析仪一看,原来是设备描述符的第7个字节(bMaxPacketSize0)填错了。我填了64,但实际端点0只支持8字节。主机要64字节,设备只给8字节,两边对不上,枚举就挂了。

为什么会这样?因为USB协议规定,设备描述符的前8个字节必须能在一次控制传输中完整返回。如果bMaxPacketSize0填大了,主机就会用那个值去请求数据,设备却发不了那么多,自然就出问题了。

描述符结构:设备的身份证

描述符就是设备的身份证。主机通过读取描述符,才知道你是什么设备、怎么跟你通信。

描述符是树形结构,从上到下依次是:

描述符类型 作用 关键字段
设备描述符 描述设备整体信息 USB版本、VID/PID、最大端点包大小
配置描述符 描述一种配置方式 供电方式、最大电流、接口数量
接口描述符 描述一个功能接口 接口编号、协议类型、端点数量
端点描述符 描述一个数据传输端点 端点地址、传输类型、最大包大小

拿热成像相机举例,它的描述符结构大概是这样的:

设备描述符
  └── 配置描述符(供电:500mA)
       ├── 接口描述符(视频类,UVC协议)
       │    ├── 端点描述符(批量传输,IN端点,地址0x81)
       │    └── 端点描述符(中断传输,IN端点,地址0x82)
       └── 接口描述符(HID类,控制接口)
            └── 端点描述符(中断传输,IN端点,地址0x83)

你想想看,主机拿到这个描述符树后,就知道:哦,这是个视频设备,用批量传输发图像数据,用中断传输发控制信号。还有一个HID接口,用来做按键和LED控制。

注意:描述符的顺序不能乱。主机是按顺序解析的,如果接口描述符出现在配置描述符之前,或者端点描述符没有跟在对应的接口描述符后面,枚举就会失败。

USB传输类型:四种武器

USB定义了四种传输类型,每种都有自己的脾气。选对了,事半功倍;选错了,调试到崩溃。

控制传输

这是USB的"官方语言"。所有设备都必须支持控制传输,用于枚举和配置。它有三个阶段:建立阶段、数据阶段(可选)、状态阶段。数据包大小通常为8、16、32或64字节。

我在项目中用控制传输来发送热成像相机的配置命令,比如设置调色板、开启测温功能。因为控制传输有握手机制,可靠性高,适合小数据量的配置操作。

批量传输

批量传输的特点是"尽力而为"——数据量大,但延迟不确定。USB 2.0高速模式下,批量传输的最大包大小是512字节,USB 3.0是1024字节。

热成像相机的图像数据,我一般用批量传输。为什么?因为图像数据量大,但可以容忍一定的延迟。批量传输会利用空闲带宽,不会影响其他实时性要求高的传输。

中断传输

别被名字骗了,中断传输并不是硬件中断。它其实是主机定期轮询设备,看有没有数据要传。轮询间隔可以设置,从1ms到255ms不等。

热成像相机的按键状态、温度告警这类小数据,我用中断传输。因为延迟可控,而且保证每1ms(或设定的间隔)主机就会来取一次数据。

同步传输

同步传输用于实时性要求高的场景,比如音频、视频流。它没有重传机制,丢包就丢了。USB 2.0高速模式下,同步传输的最大包大小是1024字节。

说实话,我在热成像相机里很少用同步传输。因为热像图对数据完整性要求高,丢一帧可能导致测温结果出错。我更倾向于用批量传输加校验,虽然延迟大一点,但数据可靠。

我的选择建议

  • 配置命令 → 控制传输
  • 图像数据 → 批量传输
  • 按键/告警 → 中断传输
  • 实时视频流(可容忍丢帧)→ 同步传输

知识体系总览

下面这张图,是我自己总结的USB协议知识体系。你把它存下来,以后做USB开发时,随时可以拿出来对照。

USB协议知识体系 物理层与电气特性 USB 2.0:四线制(VBUS, GND, D+, D-) USB 3.0:九线制(增加SSTX+/-, SSRX+/-) 设备枚举过程 插入检测 → 复位 → 获取设备描述符 → 设置地址 获取完整描述符 → 选择配置 → 进入配置状态 描述符结构 设备描述符 → 配置描述符 → 接口描述符 → 端点描述符 树形结构,层层嵌套,主机按顺序解析 四种传输类型 控制传输(配置) 批量传输(数据) 中断传输(事件) 同步传输(实时)

这张图把USB协议分成了四层:物理层、枚举过程、描述符结构、传输类型。每一层都依赖下一层。你只要把这四层搞明白,USB开发就入门了。

好了,USB协议基础就讲到这里。记住,做热成像相机的USB接口,重点在批量传输和中断传输的配合使用。控制传输用来配置,批量传输用来传图像,中断传输用来传事件。这个组合,我在多个项目里验证过,稳定可靠。


公众号:蓝海资料掘金营,微信deep3321