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的。
整个判定流程可以总结为几步:
- VBUS检测:主机检测到VBUS在有效范围内(4.75V~5.25V)。这一步是前提,没有电一切免谈。
- 终端阻抗检测(Rx检测):主机在SSTX上发出检测信号,测量反射回来的信号强度,判断设备端是否有100Ω差分终端。
- 超时判定:如果在一定时间窗口内(通常几十ms)检测到合法终端,主机认为有SuperSpeed设备连接。
- 状态上报:物理层把检测结果(Detected / Not Detected)告诉链路层,链路层才能启动训练。
我曾经踩过一个坑:某款Type-C转接头,内部线缆太长,寄生电容偏大,导致Rx检测脉冲的上升沿被软化了,终端阻抗检测总是差一点点阈值。最后不得不调整主机的检测阈值参数才搞定。所以布线时差分对的等长和阻抗控制真的很要命。
2.4 一张图读懂物理层连接检测流程
我画了一个简单的状态图,把上面说的这些串起来。可以顺着看,从“无设备”进“检测”到最后决定链路状态。
2.5 小结与避坑指南
物理层连接检测听起来简单,一旦出错,后面所有的枚举流程都白搭。我做一个总结,方便你记:
- 差分信号质量是命根子:阻抗不连续、摆幅不够、共模噪声大,都会导致Rx检测误判。布线时尽量让SSTX/SSRX远离时钟线、开关电源线路。
- Rx检测不是万能的:它只判断接收器终端是否存在,不判断数据链路的完整性。有时候检测通过,但训练阶段的握手信号依然会失败。
- Type-C的加入让事情更复杂:因为Type-C的CC逻辑控制了方向和角色,物理层的连接检测又多了一层。后面我们会在专门的章节聊Type-C对枚举的影响,这里先留个印象。
实用建议:如果你做的是嵌入式Host开发,记得在固件里留一个寄存器位,可以读出物理层Rx检测的结果。我每次都靠它在开机时快速排查是物理层问题还是链路层问题,省不少时间。