2. 物理层与连接检测:SuperSpeed差分信号、Rx检测电路、连接状态判定

好了,咱们开始聊物理层。说白了,这就是USB 3.0最底下那一层,负责处理实际的电子信号。很多做软件的朋友觉得这玩意儿离自己很远,其实不然——枚举过程卡住,十有八九是物理层的锅。我个人的经验是,Debug枚举问题,第一件事就是拿示波器去看差分对,别急着翻协议栈。

2.1 SuperSpeed差分信号

USB 3.0用的是差分信号,SuperSpeed这一路有专门的发送和接收差分对。您记住,是两组独立的:SSTX(发送)和SSRX(接收)。这种结构意味着数据可以全双工跑,不像USB 2.0那样只能半双工。

信号 方向 说明
SSTX_P / SSTX_N Host→Device 主机发送差分对
SSRX_P / SSRX_N Device→Host 设备发送差分对
D+ / D- 双向 USB 2.0 信号对(共存)

这里有个关键点:电气特性决定了连接检测的逻辑。SuperSpeed信号的电平是差分摆幅,典型值在 800 mV 到 1.2 V 之间。不像USB 2.0靠D+/D-上的上拉下拉电阻来识别设备插入,SuperSpeed走的是另一套机制。

2.2 Rx检测电路

你可能会问:主机怎么知道有个SuperSpeed设备插上来了?答案是靠 Rx检测电路。这是物理层的一个核心功能模块,我习惯叫它“接收器检测”。

具体怎么工作的?主机在SSTXP/N线上发一个检测脉冲,或者直接测量终端阻抗。如果另一端有设备,它的接收器终端会呈现一个特定的阻抗(一般是差分100Ω对地),反射回来的信号或者阻抗变化就会被检测电路捕捉到。

嗯,这里要特别注意:Rx检测是在 连接状态演变的早期阶段 进行的。主机在检测到VBUS和地线接通之后,马上开始侦察SSRX(对于主机来说,就是它自己的接收端)是否对接上了设备的发送端。

核心结论:Rx检测电路本质上就是一个阻抗监测器。它不看数据,只看线的“料子”是不是对的。

我当初调试一个样机,死活枚举不到SuperSpeed模式,只能退回High-Speed。查了半天,发现是PCB上SSRX差分对有个小过孔没处理好,阻抗直接偏到60Ω。Rx检测判定失败,物理层直接就断了念想。你说冤不冤?

2.3 连接状态判定

物理层搞定连接检测后,会输出一个连接状态。这个状态会告诉链路层:有没有设备、设备是不是SuperSpeed的。

整个判定流程可以总结为几步:

  1. VBUS检测:主机检测到VBUS在有效范围内(4.75V~5.25V)。这一步是前提,没有电一切免谈。
  2. 终端阻抗检测(Rx检测):主机在SSTX上发出检测信号,测量反射回来的信号强度,判断设备端是否有100Ω差分终端。
  3. 超时判定:如果在一定时间窗口内(通常几十ms)检测到合法终端,主机认为有SuperSpeed设备连接。
  4. 状态上报:物理层把检测结果(Detected / Not Detected)告诉链路层,链路层才能启动训练。

我曾经踩过一个坑:某款Type-C转接头,内部线缆太长,寄生电容偏大,导致Rx检测脉冲的上升沿被软化了,终端阻抗检测总是差一点点阈值。最后不得不调整主机的检测阈值参数才搞定。所以布线时差分对的等长和阻抗控制真的很要命。

2.4 一张图读懂物理层连接检测流程

我画了一个简单的状态图,把上面说的这些串起来。可以顺着看,从“无设备”进“检测”到最后决定链路状态。

USB 3.0 物理层连接检测流程图 无设备 VBUS检测 Rx检测 (阻抗监测) 超时判定 状态上报:Detected 状态上报:Not Detected 纵向红线路径:设备连接成功 虚线路径:设备不存在或终端不合格

2.5 小结与避坑指南

物理层连接检测听起来简单,一旦出错,后面所有的枚举流程都白搭。我做一个总结,方便你记:

  • 差分信号质量是命根子:阻抗不连续、摆幅不够、共模噪声大,都会导致Rx检测误判。布线时尽量让SSTX/SSRX远离时钟线、开关电源线路。
  • Rx检测不是万能的:它只判断接收器终端是否存在,不判断数据链路的完整性。有时候检测通过,但训练阶段的握手信号依然会失败。
  • Type-C的加入让事情更复杂:因为Type-C的CC逻辑控制了方向和角色,物理层的连接检测又多了一层。后面我们会在专门的章节聊Type-C对枚举的影响,这里先留个印象。

实用建议:如果你做的是嵌入式Host开发,记得在固件里留一个寄存器位,可以读出物理层Rx检测的结果。我每次都靠它在开机时快速排查是物理层问题还是链路层问题,省不少时间。