Detect状态详解:Detect状态的目的与进入条件

Detect状态,说白了就是链路训练的第一步。你想想看,两个PCIe设备要通信,总得先知道对方在不在吧?Detect就是干这个的。

它的核心目的就两个:检测对端设备是否存在,以及判断链路宽度。我刚开始接触PCIe时,觉得这步很简单——不就是看看有没有设备插上吗?后来才发现,这里面的门道多着呢。

进入Detect的条件

什么时候会进入Detect?主要有这么几种情况:

  • 上电复位:芯片刚上电,啥也不知道,先Detect一下
  • Hot Reset:热复位后,重新检测链路
  • 从其他状态回退:比如在Polling或Configuration状态训练失败,会退回Detect重来
  • 链路禁用后恢复:软件把链路关了再打开,也得重新Detect

嗯,这里要注意:进入Detect时,发送器必须处于电气空闲状态。这是规矩,不能乱来。

Detect.Quiet与Detect.Active子状态

Detect状态内部又分了两个子状态:Detect.QuietDetect.Active。我习惯把它们叫做「安静期」和「干活期」。

Detect.Quiet

这个阶段说白了就是「先安静一会儿」。发送器保持电气空闲,啥也不发。目的是什么?

  • 让链路上的电容放放电
  • 消除上一状态的残留信号
  • 为后续检测做准备

Quiet阶段至少要持续12ms。为什么是12ms?我记得PCIe Spec里写得很清楚,这是为了保证电气特性稳定。我在项目中遇到过一个问题:有个板卡在Quiet阶段只等了10ms就跳到了Active,结果接收器检测老是失败。后来查了半天,就是时间没给够。

Detect.Active

Quiet结束后,进入Active阶段。这时候发送器开始干活了——发送检测脉冲,看看对端有没有回应。

Active阶段的核心逻辑:

  1. 发送器发出一个窄脉冲(约2个UI宽度)
  2. 等待接收器检测结果
  3. 如果检测到接收器存在,就进入下一状态
  4. 如果没检测到,就重试

关键点:Detect.Active阶段,发送器和接收器是交替工作的。发送器发完脉冲后,马上切换成接收模式,监听对端的回应。这个切换时机很讲究,早了晚了都不行。

电气空闲与接收器检测逻辑

电气空闲(Electrical Idle)这个概念,我刚开始学的时候总觉得抽象。说白了就是:差分信号线上的电压差为0,表示链路上没有数据传输。

接收器检测是怎么做的?我画个图你就明白了:

接收器检测逻辑流程图 发送器 发出检测脉冲 2 UI 脉冲 检测点 检测到接收器 未检测到接收器 进入Polling 重试 检测原理说明: 1. 发送器发出约2个UI宽度的窄脉冲 2. 接收器通过检测差分信号线上的阻抗变化来判断对端是否存在 3. 如果检测到接收器(阻抗匹配),则进入Polling状态 4. 如果未检测到接收器(阻抗不匹配),则进入重试流程 注意:检测脉冲的幅度和宽度必须符合PCIe电气规范 参考:PCIe Base Spec Rev 5.0, Section 4.2.4

接收器检测的原理其实不复杂。发送器发出一个脉冲后,如果对端有设备,信号会被反射回来。接收器通过检测这个反射信号,就能判断出有没有设备连着。

个人经验:我曾经遇到过一个诡异的问题——接收器检测偶尔会失败。后来发现是PCB走线的阻抗不连续导致的。检测脉冲在阻抗突变处产生了额外的反射,干扰了判断。所以Layout时一定要注意差分线的阻抗控制。

超时机制与重试策略

Detect状态也有超时机制。你想想,如果对端设备没插好,或者链路断了,总不能一直等下去吧?

超时参数

参数 最小值 典型值 说明
Detect.Quiet时间 12ms 12ms 电气空闲保持时间
检测脉冲宽度 2 UI 2 UI UI = Unit Interval
重试间隔 12ms 12ms 每次重试前重新Quiet
最大重试次数 无限制 持续重试 直到检测到设备或复位

重试策略

Detect状态的重试策略其实挺简单的:

  1. 检测失败后,回到Detect.Quiet
  2. 再等12ms
  3. 再次进入Detect.Active
  4. 重复直到成功

说白了就是「不行就再来一次」。但这里有个坑——重试是无限次的。也就是说,如果对端设备一直没插上,LTSSM会一直在Detect状态循环,直到天荒地老。

避坑指南:我曾经在一个项目中,发现某个板卡在Detect状态卡死了。排查了半天,发现是接收器检测电路有个电容焊错了,导致检测脉冲被衰减,始终检测不到对端。结果LTSSM就在Detect状态无限循环,系统都起不来。所以硬件调试时,如果发现链路训练卡在Detect,先检查检测电路是不是正常。

重试的优化

虽然Spec说重试是无限次的,但实际项目中我们通常会加一些保护机制:

  • 软件超时:驱动层设置一个总超时时间,比如5秒,超时了就报错
  • 重试计数:硬件可以记录重试次数,超过阈值就上报中断
  • 降速重试:如果多次重试失败,可以尝试降低速率再试

嗯,这些优化Spec里没写,但实际做产品时很有用。我建议你在设计芯片时,至少加一个重试计数寄存器,方便调试。

小结

Detect状态是整个LTSSM的起点,看似简单,但细节不少。记住几个关键点:

  • Quiet阶段必须等够12ms
  • 检测脉冲要符合电气规范
  • 重试是无限次的,但实际产品要加保护
  • 接收器检测依赖阻抗匹配,Layout很重要

下一章我们会讲Polling状态,那是真正开始握手的地方。不过今天先到这里,你先把Detect吃透了再说。

一句话总结:Detect就是「先安静,再喊一嗓子,看看有没有人答应」。就这么简单,但做对不容易。

专注资料整理