Detect:链路训练的第一道门槛
说到链路训练,Detect 状态是整个 LTSSM 的起点。我个人觉得,它有点像你插U盘时听到的那声“咔哒”——物理上插进去了,但电气上到底连没连上,得靠检测说了算。
Detect 要回答三个最朴素的问题:
1. 有没有设备在对面?
2. 是接收器(Rx)还是终端(Termination)?
3. 我自己的终端配置对吗?
这三个问题任何一个答错,整个训练就卡在起跑线上。我曾经遇到过一块原型板,插上去怎么都枚举不到设备,折腾了两天才发现是 Detect 阶段的终端电阻虚焊了……嗯,后面会详细讲。
Detect 子状态机
Detect 状态本身又拆成三个子阶段,每个子阶段都有自己的任务。看下面这个流程图会更清楚:
Detect.Reset:把终端拉回初始态
进入 Detect 后,首先做的是 Reset。说白了,就是把差分线上的终端电阻配置恢复到一个确定的初始状态。此时 Rx 终端是断开的,Tx 终端也是高阻。
为什么要这么做?你想想看,如果上一次链路断开时状态是乱掉的,比如终端残留了某个充电电压,那后续的检测就会不准。我个人的习惯是,在逻辑分析仪上先观察这一小段的波形——如果 Detect.Reset 阶段能看到明显的电压归零动作,说明 PHY 在按预期工作。
Detect.Quiet:安静的接收检测
Reset 之后,链路进入 Quiet 状态。这时候设备会把自己的 Tx 驱动器关闭,只留接收器在线路上监听。它在等什么?等对端设备发过来的信号。
实际调试中,这一步最容易出问题的是噪声。我曾经在某款国产 FPGA 方案上碰到过,Quiet 状态下因为 PCB 走线串扰,接收器上一直有 50mV 左右的毛刺来回跳,导致 LTSSM 误以为收到了有效信号,直接跳到了 Detect.Active 甚至 Polling——结果可想而知,链路很快又掉下来了。
对于 Quiet 的检测,规范要求接收器能分辨出差分幅度 ≥ 100mV 的有效信号,持续时间至少 1µs。低于这个门槛的噪声应该被忽略。
RCV 检测到底在测什么?
RCV 检测的全称是 Receiver Detection。它的核心任务就是:我发一个脉冲出去,看看对面有没有挂一个合法的接收器终端。
| 参数 | 规范值 | 常见实测值 | 说明 |
|---|---|---|---|
| 检测脉冲幅度 | 600 mV ± 10% | 580~620 mV | 太低可能误判终端缺失,太高可能损坏PHY |
| 检测脉冲宽度 | 40 ns ~ 80 ns | 50 ns ~ 60 ns | 太窄终端电容还没反应就结束了 |
| 终端电阻范围 | 40 Ω ~ 60 Ω (单端) | 45 Ω ~ 55 Ω | 超出范围终端视为无效 |
| 检测周期 | 12 ms (超时) | 通常 2~4 ms 完成 | 超时未检测到终端则返回Reset |
说白了,这个脉冲就像一个“敲门”。如果对面挂了正确的 50Ω 终端电阻,反射回来的信号幅度和形状会有特定的特征。PHY 内部的比较器就是靠这个来做判决的。
终端检测:电阻精度是硬门槛
RCV 检测最后一步就是判读终端电阻是否在范围内。你觉得这很容易?其实恰恰相反。终端电阻的精度 往往是量产中最头疼的问题。
我记得有一批板子,在实验室调试时跑得飞起,一到产线的温箱里就疯狂掉链接。后来用 TDR 一打,发现终端电阻在高温下从 50Ω 漂到了 63Ω——刚好超过规范上限。这就是典型的 终端超出范围 导致 Detect 失败。
PCIe 和 USB 对终端电阻的要求都非常严苛:
- 单端对地:50Ω ± 10% (也就是 45Ω ~ 55Ω)
- 差分阻抗:100Ω ± 15%
超出这个范围的任何一个,PHY 在 Detect.Active 阶段就会认为“对面没有设备”,然后把状态机踢回 Detect.Reset 重试。
眼图与 Detect 的关系
有些人会问:眼图不是跑起来才看的吗?跟 Detect 有什么关系?
嗯,其实关系很大。终端电阻不好,在 Detect 阶段就能看出来——发出的检测脉冲本身就会因为阻抗不连续产生回振。如果你用示波器抓 单发单收的检测脉冲,看它的上升沿有没有过冲或振铃,就能提前判断终端质量。
我曾经在一次现场调试中,通过观察 Detect.Active 脉冲的回波时间,直接定位到了连接器 pin 脚接触不良的问题。比什么 DFU、什么寄存器 dump 都快多了。
一个小总结:Detect 阶段的自检清单
- Detect.Reset:终端电压是否归零?持续时间是否 > 12ms?
- Detect.Quiet:差分线共模噪声是否 < 100mV?毛刺是否持续 < 1µs?
- Detect.Active:检测脉冲幅度是否在 600mV ± 10%?回波衰减是否正常?
- 终端电阻:单端对地 45~55Ω?差分 85~115Ω?
- 回退次数:如果 Detect.Reset → Quiet → Active → 失败 → Reset 循环超过 3 次,一定是硬件问题。
记住,如果 Detect 没通过,Polling、L0 什么的根本轮不到。很多时候 USB 枚举不上、PCIe 挂不上盘,根因就是这里。下次你定位这类问题,不妨先从 Detect 下手,拿示波器看一眼脉冲,十有八九能找到答案。