USB 硬件接口与电气特性:USB 2.0/3.0 物理层差异、D+/D- 信号线、VBUS 供电规范、OTG 与 ID 检测

在嵌入式 Linux USB Host 驱动开发中,理解 USB 的硬件接口与电气特性是进行正确驱动移植与适配的基础。本章将深入剖析 USB 2.0 与 USB 3.0 在物理层上的核心差异,详细解读 D+/D- 差分信号线的工作原理,明确 VBUS 供电规范,并阐述 OTG 与 ID 检测机制。这些知识将直接指导你在硬件原理图设计、驱动初始化配置以及电源管理策略中的决策。

2.1 USB 2.0 与 USB 3.0 物理层差异

USB 2.0 与 USB 3.0 在物理层设计上存在根本性区别,主要体现在信号线数量、编码方式、传输方向和拓扑结构上。USB 3.0 引入了全新的 SuperSpeed 物理层,与 USB 2.0 的物理层完全独立,实现了向后兼容。

核心差异: USB 2.0 采用半双工、单对差分信号线(D+/D-)进行数据传输;而 USB 3.0 采用全双工、两对差分信号线(SSTX+/SSTX- 和 SSRX+/SSRX-)进行数据传输,并增加了独立的接地线(GND_DRAIN)以优化信号完整性。

下表详细对比了 USB 2.0 与 USB 3.0 在物理层的关键参数:

特性 USB 2.0 (High-Speed) USB 3.0 (SuperSpeed)
信号线数量 4 根 (VBUS, D+, D-, GND) 9 根 (VBUS, D+, D-, GND, SSTX+, SSTX-, SSRX+, SSRX-, GND_DRAIN)
数据传输方向 半双工 (Half-Duplex) 全双工 (Full-Duplex)
差分信号对 1 对 (D+/D-) 2 对 (SSTX+/SSTX- 发送, SSRX+/SSRX- 接收)
编码方式 NRZI (Non-Return-to-Zero Inverted) + 位填充 8b/10b 编码
信号电压摆幅 400 mV (差分) 800-1200 mV (差分)
终端阻抗 45 Ω (每根线对地) 100 Ω (差分对之间)
拓扑结构 共享总线 (Shared Bus) 点对点 (Point-to-Point)
数据传输速率 480 Mbps 5 Gbps

下图展示了 USB 2.0 与 USB 3.0 在物理连接上的结构差异:

USB 2.0 与 USB 3.0 物理层连接结构对比 USB 2.0 Host/Device USB 2.0 Device D+ D- 半双工:同一时刻只能发送或接收 USB 3.0 Host USB 3.0 Device SSTX+ SSTX- SSRX+ SSRX- 全双工:可同时发送和接收数据

2.2 D+/D- 信号线详解

D+ 和 D- 是 USB 2.0 总线中唯一的数据传输通道,它们构成一对差分信号线。差分信号传输具有抗共模干扰能力强、电磁辐射低等优点,是高速数据传输的基础。

2.2.1 信号电平与状态

D+ 和 D- 上的电压差决定了总线状态。在高速模式下,信号摆幅约为 400 mV。总线状态包括:

  • J 状态 (Idle): D+ 为高电平,D- 为低电平。
  • K 状态 (Sync): D+ 为低电平,D- 为高电平。
  • SE0 (Single-Ended Zero): D+ 和 D- 均为低电平,用于复位和断开检测。

2.2.2 设备速度检测

在 USB 2.0 系统中,Host 通过检测 D+ 或 D- 线上的上拉电阻来判断设备速度:

  • 低速设备 (1.5 Mbps): 在 D- 线上接 1.5 kΩ 上拉电阻。
  • 全速/高速设备 (12/480 Mbps): 在 D+ 线上接 1.5 kΩ 上拉电阻。
驱动适配提示: 在嵌入式 Linux 中,Host 控制器驱动通过检测 D+/D- 线的状态来初始化对应的传输模式。如果硬件原理图上 D+/D- 的走线过长或阻抗不匹配,可能导致高速模式协商失败,驱动会回退到全速模式。此时应检查 PCB 布局和终端匹配电阻。

下图展示了设备插入时 Host 检测速度的流程:

USB 2.0 设备速度检测流程 设备插入 Host 检测 D+/D- 电平 D+ 高电平 → 全速/高速 D- 高电平 → 低速

2.3 VBUS 供电规范

VBUS 是 USB 总线中的电源线,负责为连接的设备供电。嵌入式系统设计时,必须严格遵循 VBUS 的电压和电流规范,否则可能导致 Host 控制器损坏或设备无法识别。

USB 版本 VBUS 电压 (V) 最大供电电流 (mA) 说明
USB 2.0 4.75 ~ 5.25 500 (低/全/高速) 标准下行端口 (SDP)
USB 3.0 4.75 ~ 5.25 900 (SuperSpeed) 标准下行端口 (SDP)
USB BC 1.2 4.75 ~ 5.25 1500 (充电下行端口) 专用充电端口 (DCP)
硬件设计警告: 在嵌入式系统中,VBUS 通常由 Host 控制器内部的稳压器或外部电源管理 IC (PMIC) 提供。驱动初始化时,必须确保 VBUS 使能引脚 (如 GPIO) 被正确配置,否则设备将无法上电。此外,VBUS 过流检测 (Over-Current Detection) 是驱动必须处理的中断事件,一旦检测到过流,应立即关闭 VBUS 并上报错误。

2.4 OTG 与 ID 检测

USB On-The-Go (OTG) 规范允许设备在 Host 和 Peripheral 角色之间动态切换。ID 引脚是 OTG 功能的核心硬件信号,用于识别设备应扮演的角色。

2.4.1 ID 引脚电平与角色

  • ID 接地 (ID_GND): 设备作为 A-Device (默认 Host),负责提供 VBUS 电源。
  • ID 悬空 (ID_FLOAT): 设备作为 B-Device (默认 Peripheral),从 VBUS 取电。

2.4.2 驱动中的 ID 检测处理

在嵌入式 Linux 中,OTG 驱动通过 GPIO 中断或 ADC 采样来检测 ID 引脚状态。检测到 ID 变化后,驱动需要执行以下操作:

  1. 角色切换: 调用 usb_add_hcd() 或 usb_remove_hcd() 来注册或注销 Host 控制器。
  2. 电源管理: 切换 VBUS 的供电方向(输出或输入)。
  3. 通知上层: 通过 extcon 或 usb_role_switch 框架通知 USB 核心层角色变更。
代码示例: 在设备树中配置 ID 引脚为 GPIO 中断:
usb_otg: usb@xxx {
    compatible = "vendor,usb-otg";
    id-gpios = &gpio1 0 GPIO_ACTIVE_LOW;
    vbus-supply = <&vbus_regulator>;
    dr_mode = "otg";  // 支持 OTG 模式
};

下图展示了 OTG 设备角色切换的硬件连接与检测逻辑:

OTG 角色切换与 ID 检测逻辑 A-Device (Host) ID 引脚:接地 (GND) 提供 VBUS 电源 B-Device (Peripheral) ID 引脚:悬空 (Float) 从 VBUS 取电 VBUS & D+/D- Host 控制器检测 ID 引脚电平 ID=GND → 角色为 Host ID=Float → 角色为 Peripheral

2.5 嵌入式驱动适配要点总结

在进行 USB Host 驱动移植时,硬件接口与电气特性相关的适配工作主要集中在以下几个方面:

  • 原理图核对: 确认 D+/D- 走线阻抗匹配,VBUS 供电能力满足设备需求,ID 引脚连接正确。
  • 设备树配置: 正确配置 VBUS 使能 GPIO、ID 检测 GPIO、过流检测 GPIO 以及电源管理 IC 的 I2C 地址。
  • 驱动初始化: 在 Host 控制器驱动的 probe() 函数中,初始化 VBUS 电源、注册 ID 检测中断、设置默认角色。
  • 电源管理: 实现 VBUS 的使能/禁能函数,处理过流中断,并在系统挂起时正确管理 VBUS 状态。
调试技巧: 使用逻辑分析仪抓取 D+/D- 信号,可以直观地看到设备枚举过程中的复位、速度协商和数据传输。如果发现设备无法枚举,首先检查 VBUS 电压是否稳定,然后检查 D+/D- 上的上拉电阻是否匹配设备速度。