4. Detect 状态详解
Detect 是 PCIe LTSSM 链路训练的第一个物理层状态,也是热插拔场景下设备从“不存在”到“被感知”的起点。该状态的核心目标是:检测对端设备是否存在,并为后续的 Polling 状态(比特锁定与符号锁定)建立电气基础。本章从目的、电气子状态、接收器检测机制和热插拔行为四个维度展开。
4.1 Detect 状态的目的
Detect 状态在 LTSSM 中承担以下三项关键职责:
- 物理存在检测:通过电气方式判断对端是否连接了 PCIe 设备(或空槽)。
- 电气空闲建立:确保链路进入稳定的电气空闲(Electrical Idle, EI)状态,为后续发送训练序列(TS1/TS2)做准备。
- 接收器终端检测:在热插拔场景下,确认对端接收器是否已上电并具备接收能力。
调试要点: 如果链路卡在 Detect 状态无法退出,通常意味着物理层电气条件不满足——可能是对端未上电、交流耦合电容异常、或参考时钟未稳定。此时应优先检查 Detect.Quiet 阶段的电气空闲信号质量。
4.2 电气子状态:Detect.Quiet 与 Detect.Active
Detect 状态内部包含两个电气子状态,它们交替执行,构成完整的检测周期。下表对比了二者的关键差异:
| 子状态 | 持续时间 | 发送器行为 | 接收器行为 | 退出条件 |
|---|---|---|---|---|
| Detect.Quiet | 12 ms(典型) | 驱动电气空闲(TX 差分电压 < 50 mV) | 监测电气空闲状态,等待对端信号稳定 | 定时器超时 → 进入 Detect.Active |
| Detect.Active | 12 ms(典型) | 发送检测脉冲(Detect Pulse),观察反射/回波 | 检测脉冲是否被对端接收器终端吸收 | 检测到接收器存在 → 进入 Polling;否则返回 Detect.Quiet |
两个子状态构成一个检测周期(约 24 ms)。若连续多个周期均未检测到对端,LTSSM 会保持在 Detect 状态循环,直到超时或复位。
电气空闲判定条件(PCIe Base Spec Rev 5.0, 4.2.5):
• 差分输出电压 < 65 mV(Gen1/Gen2)或 < 50 mV(Gen3+)
• 共模电压在标称值的 ±10% 范围内
• 持续至少 1 µs 无数据翻转
• 差分输出电压 < 65 mV(Gen1/Gen2)或 < 50 mV(Gen3+)
• 共模电压在标称值的 ±10% 范围内
• 持续至少 1 µs 无数据翻转
4.3 接收器检测机制
PCIe 接收器检测(Receiver Detection)是 Detect.Active 子状态的核心操作。其工作原理基于传输线反射和终端阻抗匹配:
- 发送检测脉冲:发送器在 TX 引脚上输出一个低摆幅、短持续期的电压脉冲(通常为 200~400 mV,持续约 2~4 UI)。
- 观察反射波:若对端接收器已上电且终端电阻(50 Ω 对地)正常,脉冲能量被吸收,反射波极小;若对端不存在或未上电,脉冲几乎全反射。
- 比较阈值:发送器通过比较发射脉冲与反射脉冲的幅度差,判断接收器是否存在。典型判定阈值:反射幅度 < 发射幅度的 30% 视为“接收器存在”。
热插拔调试陷阱: 某些热插拔控制器在插入瞬间会引入额外的寄生电容,导致检测脉冲的反射波形畸变。此时即使接收器物理存在,也可能被误判为“不存在”。解决方法是在 Detect.Quiet 阶段增加去抖延时(Debounce Delay),通常建议 50~100 ms。
下表总结了不同场景下的检测结果与对应行为:
| 场景 | 对端状态 | 反射幅度 | 检测结果 | LTSSM 行为 |
|---|---|---|---|---|
| 空槽 / 未插入 | 无终端 | > 80% 发射幅度 | 接收器不存在 | 返回 Detect.Quiet,继续循环 |
| 正常插入(已上电) | 50 Ω 终端接地 | < 20% 发射幅度 | 接收器存在 | 进入 Polling 状态 |
| 插入但未上电 | 高阻(Hi-Z) | > 70% 发射幅度 | 接收器不存在 | 返回 Detect.Quiet,等待电源稳定 |
| 插入但参考时钟未稳定 | 终端正常但 PLL 未锁定 | 20%~50% 发射幅度 | 不确定(边缘情况) | 可能误判,需软件超时处理 |
4.4 热插拔时的 Detect 行为
在热插拔场景下,Detect 状态的行为与静态上电有显著差异。下图展示了热插入过程中 Detect 状态的完整时序:
热插拔场景下 Detect 状态的关键行为特征:
- 去抖延时(Debounce Delay):物理插入后,PRSNT# 信号需要稳定一段时间(通常 50~100 ms),避免因机械抖动导致误检测。此延时由热插拔控制器或 Root Complex 的 GPIO 去抖逻辑实现。
- 电源排序:Vdd 必须在 Detect.Quiet 开始前稳定到标称值的 ±5% 以内。若电源上升时间过长,LTSSM 可能提前进入 Detect.Active 并误判。
- 参考时钟依赖:虽然 Detect 状态不依赖参考时钟的精确频率,但接收器检测脉冲的宽度和幅度受 TX 驱动器偏置影响。若参考时钟未稳定,检测脉冲可能畸变。
- 多 Lane 同步:对于 x4/x8/x16 链路,所有 Lane 必须独立完成接收器检测。只要有一条 Lane 检测成功,LTSSM 即可进入 Polling;但若主 Lane(Lane 0)检测失败,整个链路会回退到 Detect.Quiet。
热插拔调试 Checklist(Detect 阶段):
✅ PRSNT# 信号去抖时间是否足够(建议 ≥ 50 ms)?
✅ Vdd 上升时间是否在 PCIe 规范要求内(≤ 100 ms)?
✅ 所有 Lane 的接收器检测结果是否一致?
✅ 检测脉冲幅度是否在 200~400 mV 范围内?
✅ 反射波幅度是否低于发射幅度的 30%?
✅ PRSNT# 信号去抖时间是否足够(建议 ≥ 50 ms)?
✅ Vdd 上升时间是否在 PCIe 规范要求内(≤ 100 ms)?
✅ 所有 Lane 的接收器检测结果是否一致?
✅ 检测脉冲幅度是否在 200~400 mV 范围内?
✅ 反射波幅度是否低于发射幅度的 30%?