4. 热插拔触发链路训练:物理层Presence Detect机制、边带信号(PRSNT1/2#)与带内检测、热插拔事件如何触发LTSSM从Detect开始
4.1 物理层存在检测机制概述
PCIe 热插拔的物理层基础是 Presence Detect(存在检测) 机制。该机制负责在硬件层面感知设备是否插入或拔出,并触发后续的链路训练状态机(LTSSM)动作。存在检测分为两种互补方式:边带信号检测(基于 PRSNT1#/PRSNT2# 引脚)和 带内检测(基于电气信号)。
| 检测方式 | 信号/原理 | 检测时机 | 主要用途 |
|---|---|---|---|
| 边带信号检测 | PRSNT1# / PRSNT2# 引脚电平 | 机械插入/拔出瞬间 | 快速感知物理存在变化,触发热插拔事件 |
| 带内检测 | 接收器检测(Rx Detect) | LTSSM 处于 Detect 状态时 | 确认对端设备电气存在,启动链路训练 |
4.2 边带信号 PRSNT1#/PRSNT2# 机制
PRSNT1# 和 PRSNT2# 是 PCIe 连接器上专用的边带信号引脚,用于物理层存在检测。其工作原理基于连接器内部短接与主板上的上拉/下拉电阻网络。
- PRSNT1#:通常连接至主板上的地(GND)。
- PRSNT2#:通过上拉电阻连接至电源(如 3.3V),并连接至热插拔控制器或 Root Complex 的 GPIO。
- 连接器内部:在标准 PCIe 插卡上,PRSNT1# 与 PRSNT2# 在卡内部是短接的。
检测逻辑:
- 卡未插入:PRSNT2# 被上拉至高电平(1),表示无设备。
- 卡插入:PRSNT1#(GND)通过卡内短接将 PRSNT2# 拉低至低电平(0),热插拔控制器检测到下降沿,触发存在事件。
- 卡拔出:PRSNT2# 恢复高电平,触发移除事件。
关键点:PRSNT1#/PRSNT2# 是机械优先检测,在电气信号建立之前即可感知设备存在,为后续电源管理和链路训练提供早期触发信号。
4.3 带内检测:接收器检测(Rx Detect)
带内检测是 LTSSM 在 Detect 状态 下执行的电气层检测。它不依赖边带引脚,而是通过发送端(Tx)检测接收端(Rx)的电气阻抗变化来判断对端是否存在。
检测过程:
- 发送端在差分对上发送一个低摆幅的检测脉冲(通常为共模电压变化)。
- 如果对端存在接收器(终端阻抗匹配),发送端会检测到反射或负载变化。
- 如果检测到有效的接收器,LTSSM 从 Detect.Quiet 进入 Detect.Active,然后进入 Polling 状态开始链路训练。
- 如果未检测到接收器,LTSSM 保持在 Detect.Quiet 并周期性重试。
带内检测 vs 边带检测:边带检测提供“机械存在”信号,带内检测提供“电气存在”确认。两者结合可避免误触发,例如卡未完全插入到位时边带信号可能已变化,但带内检测会因电气接触不良而失败。
4.4 热插拔事件触发 LTSSM 从 Detect 开始
热插拔事件(插入或拔出)通过以下路径触发 LTSSM 从 Detect 状态重新开始链路训练:
- 物理层事件:PRSNT1#/PRSNT2# 电平变化被热插拔控制器或 Root Complex 捕获。
- 软件通知:热插拔控制器通过中断或轮询方式通知系统软件(如 ACPI 热插拔驱动)。
- 电源与复位:系统软件控制电源管理单元(如 PERST# 信号)对插槽上电或下电,并释放复位。
- LTSSM 复位:PERST# 释放后,下游端口的 LTSSM 从 Detect.Quiet 状态开始执行带内接收器检测。
- 链路训练启动:一旦带内检测确认对端存在,LTSSM 进入 Polling 状态,开始完整的链路训练流程(速度协商、位锁定、符号锁定等)。
注意:热插拔事件触发的链路训练与冷启动链路训练在 LTSSM 状态机路径上完全一致,区别仅在于触发源和电源管理时序。热插拔场景下,系统必须确保在 PERST# 释放前,所有电源轨已稳定。
4.5 热插拔触发链路训练流程图
4.6 边带检测与带内检测对比
| 对比维度 | 边带检测(PRSNT1#/2#) | 带内检测(Rx Detect) |
|---|---|---|
| 信号类型 | 专用边带引脚,独立于数据通路 | 复用差分数据对,通过电气特性检测 |
| 检测速度 | 机械接触瞬间即可感知,微秒级 | 需等待LTSSM进入Detect状态,毫秒级 |
| 可靠性 | 受机械接触抖动影响,需去抖滤波 | 电气接触稳定后检测,更可靠 |
| 功耗 | 极低,仅需上拉电阻 | 需发送检测脉冲,功耗略高 |
| 主要作用 | 触发热插拔事件,通知系统软件 | 确认电气存在,启动链路训练 |
4.7 实践要点与常见问题
实践要点:
- 边带信号去抖:PRSNT1#/2# 在插入/拔出时可能产生毛刺,硬件需设计去抖电路(通常 10-50ms),软件需轮询确认状态稳定后再执行电源操作。
- 带内检测超时:LTSSM 在 Detect.Quiet 状态有超时定时器(通常 12ms),若超时未检测到接收器,会复位重试。热插拔场景下需确保电源和参考时钟稳定。
- PERST# 时序:PERST# 释放必须在所有电源轨稳定之后,且需满足 PCIe 规范中规定的延迟(通常 100ms 电源稳定后释放)。
调试技巧:使用逻辑分析仪同时捕获 PRSNT1#/2#、PERST# 和差分对上的 Detect 脉冲,可以完整还原热插拔触发链路训练的时序。若链路训练失败,优先检查 PERST# 释放时序和带内检测脉冲幅度。