2. USB物理层与电气特性:USB 2.0/3.0差分信号、D+/D-线、上拉电阻、设备速度检测机制

USB物理层定义了数据在总线上的传输方式,包括信号编码、电平标准、连接器引脚定义以及设备识别机制。对于嵌入式Host驱动开发者而言,理解D+/D-差分信号的工作方式、上拉电阻的配置以及速度检测流程,是正确初始化EHCI控制器和枚举设备的前提。

2.1 USB 2.0 物理层:差分信号与D+/D-线

USB 2.0使用一对双绞线(D+和D-)进行半双工差分信号传输。差分信号通过两条线上的电压差来表示逻辑状态,具有抗共模干扰能力强、信号完整性好的优点。

关键电气参数:
  • 差分电压摆幅: 高速模式(480 Mbps)下为400 mV(峰-峰值);全速/低速模式下为3.3 V(单端)。
  • 终端阻抗: 每根信号线对地阻抗为45 Ω ± 10%,差分阻抗为90 Ω ± 15%。
  • 信号编码: 高速模式使用NRZI(非归零反转码)加位填充;全速/低速使用NRZI。
USB 2.0 差分信号传输示意图 Host 发送器 Device 接收器 D+ 线 D- 线 差分电压 = V(D+) - V(D-) 逻辑"1": D+ > D- 逻辑"0": D+ < D-

2.2 上拉电阻与设备速度检测机制

USB 2.0协议通过设备端在D+或D-线上连接的上拉电阻来向Host报告其速度能力。Host在检测到总线空闲状态(SE0)结束后,通过采样D+/D-线的电平状态来判断设备速度。

设备速度 上拉电阻位置 上拉电阻值 Host检测到的电平 信号速率
低速 (Low Speed) D- 线 1.5 kΩ ± 5% D- = 高 (3.3V),D+ = 低 1.5 Mbps
全速 (Full Speed) D+ 线 1.5 kΩ ± 5% D+ = 高 (3.3V),D- = 低 12 Mbps
高速 (High Speed) D+ 线(初始全速握手后切换) 1.5 kΩ(初始),后断开 D+ = 高(初始),后进入高速 Chirp 480 Mbps
开发提示: 在嵌入式Host驱动中,EHCI控制器内部集成了D+/D-线的电平检测逻辑。驱动开发者只需读取端口状态寄存器(PORTSC)中的Line Status位域(位[11:10])即可获取当前D+/D-的电平状态,无需手动采样GPIO。
USB 2.0 设备速度检测流程 ① 设备插入Hub端口 ② 设备端上拉电阻连接总线 ③ Host采样D+/D-电平 D-高 → 低速设备 D+高 → 全速/高速 Chirp握手确认高速 Host设置PORTSC.PortSpeed位域 驱动读取端口状态寄存器获取设备速度

2.3 USB 3.0 物理层变化:新增差分对

USB 3.0(SuperSpeed)在保留USB 2.0 D+/D-线的基础上,新增了独立的超高速差分传输对(SSTX+/- 和 SSRX+/-),实现了全双工通信。物理层编码也从NRZI改为8b/10b编码,速率提升至5 Gbps。

特性 USB 2.0 USB 3.0
信号线数量 2根(D+/D-) 6根(D+/D- + SSTX+/- + SSRX+/-)
通信模式 半双工 全双工(独立发送/接收通道)
信号编码 NRZI + 位填充 8b/10b
差分电压 400 mV(高速)/ 3.3V(全速/低速) 800 mV ~ 1.2V
终端匹配 45 Ω 对地 100 Ω 差分(交流耦合)
速度检测 上拉电阻(D+/D-) 带外信号(OOB) + 握手协议
兼容性注意: USB 3.0 Host控制器(如xHCI)内部同时包含USB 2.0和USB 3.0两个物理层子系统。当插入USB 2.0设备时,仅D+/D-线工作;插入USB 3.0设备时,D+/D-线用于初始识别和配置,超高速通道随后建立。EHCI控制器仅处理USB 2.0部分,不参与超高速通信。
USB 3.0 物理层连接结构(保留USB 2.0通道) Host USB 2.0 PHY USB 3.0 PHY (SSTX/SSRX) Device USB 2.0 PHY USB 3.0 PHY (SSTX/SSRX) D+ / D- (USB 2.0, 480 Mbps) SSTX+ / SSTX- (发送, 5 Gbps) SSRX+ / SSRX- (接收, 5 Gbps) USB 3.0 全双工:发送和接收使用独立的差分对 USB 2.0 通道保留用于兼容性检测和配置

2.4 嵌入式Host驱动中的物理层操作要点

在嵌入式Linux系统中,EHCI驱动通过操作Host控制器寄存器来完成物理层的初始化和设备速度检测。以下是关键操作步骤:

  1. 端口复位(Port Reset): 设置PORTSC.Port Reset位(位[8]),持续至少10 ms后清除,触发设备重新枚举。
  2. 读取端口状态: 读取PORTSC寄存器,解析Line Status位(位[11:10])获取D+/D-电平。
  3. 速度判定: 根据Line Status值设置PortSpeed位域(位[29:28]),驱动据此选择对应的调度帧(微帧)参数。
  4. 使能端口: 设置Port Enable位(位[2]),允许端口进行数据传输。
寄存器操作示例(基于EHCI规范):
/* 读取端口状态寄存器 */
uint32_t portsc = ehci_readl(hcd->regs + PORTSC_BASE + (port * 4));

/* 解析Line Status (位[11:10]) */
uint8_t line_status = (portsc >> 10) & 0x03;

/* 速度判定 */
switch (line_status) {
case 0x01: /* D+高 = 全速/高速 */
    if (portsc & PORTSC_HSPEED) /* 位[27] 高速使能标志 */
        speed = USB_SPEED_HIGH;
    else
        speed = USB_SPEED_FULL;
    break;
case 0x02: /* D-高 = 低速 */
    speed = USB_SPEED_LOW;
    break;
default:   /* SE0 或 无效状态 */
    speed = USB_SPEED_UNKNOWN;
    break;
}

2.5 常见电气故障与调试方法

故障现象 可能原因 调试手段
设备无法识别,Line Status始终为0 D+/D-线短路到地,或设备端上拉电阻未连接 用示波器测量D+/D-对地电压;检查VBUS供电
设备被识别为全速,但实际为高速 Chirp握手失败,高速终端匹配异常 检查PCB差分阻抗;测量Chirp J/K信号时序
间歇性断开重连 信号完整性差,共模噪声过大 增加共模扼流圈;检查接地回路
USB 3.0设备仅工作在USB 2.0模式 超高速差分对连接不良,或Host不支持xHCI 检查SSTX/SSRX连接;确认控制器模式
调试利器: 在嵌入式开发板上,可以通过GPIO模拟USB Host的D+/D-电平检测逻辑,配合逻辑分析仪捕获总线状态,快速定位物理层问题。Linux内核的 usbmon 工具也可以捕获USB总线上的数据包,辅助分析枚举过程。