4. Detect状态详解:电气空闲检测、接收器检测、Beacon序列

Detect状态,说白了就是链路训练的“起跑线”。

我经常跟团队里的新人说,别小看这个状态。它虽然逻辑简单,但一旦出问题,整个链路都起不来。我遇到过好几次板卡插上后死活不link,最后定位到就是Detect阶段电气空闲没检测对。

好,咱们今天就把Detect状态掰开揉碎讲清楚。

4.1 电气空闲检测:链路活着的“呼吸”

电气空闲检测,英文叫Electrical Idle,简称EI。

说白了,就是判断链路上有没有信号在传输。PCIe链路上没有数据时,差分信号对(D+和D-)会保持共模电压,没有摆幅。这就是电气空闲状态。

核心要点:

  • 电气空闲 = 差分电压幅度低于阈值(通常为50mV-175mV)
  • 接收器需要连续检测至少4个UI(Unit Interval)的电气空闲状态
  • 检测到电气空闲后,接收器才能进入下一阶段

为什么会这么设计?你想想看,如果接收器不知道链路上有没有信号,它怎么知道该不该开始接收数据?

我个人的习惯是,在仿真验证时,电气空闲检测的阈值一定要留裕量。曾经有个项目,芯片在高温下电气空闲检测阈值漂移,导致链路间歇性断开。排查了整整两周才找到根因。

实战技巧:

电气空闲检测的滤波器时间常数建议设为10ns左右。太短容易误触发,太长会延迟链路恢复。我在Gen3项目中就用这个参数,效果不错。

4.2 接收器检测:确认对面有人

电气空闲检测通过后,LTSSM进入接收器检测子状态。

这一步的目的很简单:确认对端有没有接上接收器。注意,这里检测的是物理存在,不是功能正常。

检测原理是这样的:

  1. 发送器在TX端发出一个小的共模电压变化(约300-600mV)
  2. 如果对端有接收器,这个电压变化会被接收器的终端电阻(50Ω)吸收
  3. 发送器通过检测反射回来的信号幅度,判断接收器是否存在

注意:

接收器检测必须在电气空闲状态下进行。如果链路上有噪声或串扰,可能导致误判。我曾经在实验室遇到过,因为电源纹波太大,接收器检测总是失败,最后加了去耦电容才解决。

接收器检测的结果只有两种:

检测结果 含义 后续动作
检测到接收器 对端设备存在 进入Polling状态
未检测到接收器 对端设备不存在或未上电 回到Detect.Quiet,等待下次检测

这里有个细节:接收器检测的周期是12ms。如果12ms内没检测到,LTSSM会回到Quiet状态,然后重新开始。这个时间参数在PCIe Base Spec里有明确规定,我建议你记下来,调试时经常用到。

4.3 Beacon序列:唤醒沉睡的链路

Beacon序列是Detect状态里的一个特殊机制。它用于唤醒处于低功耗状态(L2/L3)的链路。

Beacon信号长什么样?说白了就是一组周期性的脉冲序列:

Beacon序列格式:
- 脉冲宽度:2ns - 6ns
- 脉冲周期:250ns - 500ns  
- 持续发送时间:至少2ms
- 差分电压幅度:300mV - 600mV

我刚开始接触Beacon时觉得这玩意儿挺简单,不就是发几个脉冲嘛。直到有一次,一个客户反馈他们的设备在L2状态下无法被唤醒。我查了三天,最后发现是Beacon脉冲的占空比不对,接收端的检测窗口没对齐。

Beacon序列的关键作用:

  • 用于L2/L3低功耗状态的唤醒
  • 不需要参考时钟即可发送(由内部振荡器产生)
  • 接收端通过检测Beacon脉冲来识别唤醒请求

嗯,这里要注意:Beacon序列只在特定场景下使用。大多数情况下,链路从Detect状态直接进入Polling状态,不需要Beacon。只有从L2/L3恢复时,才会用到Beacon。

4.4 Detect状态完整流程图

为了让你更直观地理解Detect状态的工作流程,我画了一张图:

Detect状态工作流程图 Detect.Quiet 电气空闲检测 检测差分电压 < 阈值(连续4个UI) 检测通过? 失败 成功 接收器检测 发送共模电压变化 检测到接收器? 失败 进入Polling状态 Beacon序列唤醒 L2/L3唤醒

从这张图可以清楚看到,Detect状态有三个核心子状态:Quiet、电气空闲检测、接收器检测。Beacon序列作为特殊分支,只在低功耗唤醒场景下使用。

4.5 常见问题与避坑指南

我在实际项目中总结了一些Detect状态的常见问题,分享给你:

  • 电气空闲检测失败:最常见的原因是链路上有噪声。我曾经遇到过,板卡上的DC-DC转换器开关频率正好落在PCIe检测频段内,导致电气空闲检测一直失败。解决办法是优化电源滤波。
  • 接收器检测误判:如果PCB走线阻抗不连续,反射信号会干扰检测结果。我建议在仿真阶段就做好TDR分析,确保阻抗控制在85Ω-115Ω范围内。
  • Beacon序列无法唤醒:检查Beacon脉冲的幅度和时序。有些低功耗设计会关闭PLL,导致Beacon脉冲抖动过大。我一般会在接收端加一个数字滤波器,容忍±30%的脉冲宽度变化。

我的调试建议:

如果你在调试Detect状态,建议用逻辑分析仪同时抓取TX和RX端的信号。重点关注电气空闲检测的阈值电压和接收器检测的反射波形。这两个信号能告诉你90%的问题所在。

好了,Detect状态的核心内容就这些。它虽然只是LTSSM的起点,但却是整个链路训练的基础。把Detect状态吃透了,后面的Polling、Configuration状态理解起来会轻松很多。


公众号:蓝海资料掘金营,微信deep3321