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 无数据翻转
Detect 状态内部子状态转换 Detect 状态内部子状态转换 Detect.Quiet 驱动电气空闲 等待 12 ms Detect.Active 发送检测脉冲 等待 12 ms 定时器超时 未检测到接收器 检测到 → Polling 检测周期说明 每个周期 = Quiet(12ms) + Active(12ms) ≈ 24ms 连续 3 个周期无检测 → 复位或进入 Recovery 热插拔场景下,检测周期可能因去抖而延长

4.3 接收器检测机制

PCIe 接收器检测(Receiver Detection)是 Detect.Active 子状态的核心操作。其工作原理基于传输线反射和终端阻抗匹配:

  1. 发送检测脉冲:发送器在 TX 引脚上输出一个低摆幅、短持续期的电压脉冲(通常为 200~400 mV,持续约 2~4 UI)。
  2. 观察反射波:若对端接收器已上电且终端电阻(50 Ω 对地)正常,脉冲能量被吸收,反射波极小;若对端不存在或未上电,脉冲几乎全反射。
  3. 比较阈值:发送器通过比较发射脉冲与反射脉冲的幅度差,判断接收器是否存在。典型判定阈值:反射幅度 < 发射幅度的 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 状态时序 热插拔场景下 Detect 状态时序 t0 t1 t2 t3 t4 物理插入 PRSNT# 拉低 电源稳定 Vdd 建立 + 去抖 Detect.Quiet 电气空闲 12ms Detect.Active 检测脉冲 PRSNT# 低电平(插入) Vdd 上升沿(稳定) TX 差分 检测脉冲 热插拔去抖时间(t1-t0)通常为 50~100 ms,远大于 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%?