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。
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。
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部分,不参与超高速通信。
2.4 嵌入式Host驱动中的物理层操作要点
在嵌入式Linux系统中,EHCI驱动通过操作Host控制器寄存器来完成物理层的初始化和设备速度检测。以下是关键操作步骤:
- 端口复位(Port Reset): 设置PORTSC.Port Reset位(位[8]),持续至少10 ms后清除,触发设备重新枚举。
- 读取端口状态: 读取PORTSC寄存器,解析Line Status位(位[11:10])获取D+/D-电平。
- 速度判定: 根据Line Status值设置PortSpeed位域(位[29:28]),驱动据此选择对应的调度帧(微帧)参数。
- 使能端口: 设置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总线上的数据包,辅助分析枚举过程。