Detect状态详解:Detect状态的目的与进入条件
Detect状态,说白了就是链路训练的第一步。你想想看,两个PCIe设备要通信,总得先知道对方在不在吧?Detect就是干这个的。
它的核心目的就两个:检测对端设备是否存在,以及判断链路宽度。我刚开始接触PCIe时,觉得这步很简单——不就是看看有没有设备插上吗?后来才发现,这里面的门道多着呢。
进入Detect的条件
什么时候会进入Detect?主要有这么几种情况:
- 上电复位:芯片刚上电,啥也不知道,先Detect一下
- Hot Reset:热复位后,重新检测链路
- 从其他状态回退:比如在Polling或Configuration状态训练失败,会退回Detect重来
- 链路禁用后恢复:软件把链路关了再打开,也得重新Detect
嗯,这里要注意:进入Detect时,发送器必须处于电气空闲状态。这是规矩,不能乱来。
Detect.Quiet与Detect.Active子状态
Detect状态内部又分了两个子状态:Detect.Quiet和Detect.Active。我习惯把它们叫做「安静期」和「干活期」。
Detect.Quiet
这个阶段说白了就是「先安静一会儿」。发送器保持电气空闲,啥也不发。目的是什么?
- 让链路上的电容放放电
- 消除上一状态的残留信号
- 为后续检测做准备
Quiet阶段至少要持续12ms。为什么是12ms?我记得PCIe Spec里写得很清楚,这是为了保证电气特性稳定。我在项目中遇到过一个问题:有个板卡在Quiet阶段只等了10ms就跳到了Active,结果接收器检测老是失败。后来查了半天,就是时间没给够。
Detect.Active
Quiet结束后,进入Active阶段。这时候发送器开始干活了——发送检测脉冲,看看对端有没有回应。
Active阶段的核心逻辑:
- 发送器发出一个窄脉冲(约2个UI宽度)
- 等待接收器检测结果
- 如果检测到接收器存在,就进入下一状态
- 如果没检测到,就重试
关键点:Detect.Active阶段,发送器和接收器是交替工作的。发送器发完脉冲后,马上切换成接收模式,监听对端的回应。这个切换时机很讲究,早了晚了都不行。
电气空闲与接收器检测逻辑
电气空闲(Electrical Idle)这个概念,我刚开始学的时候总觉得抽象。说白了就是:差分信号线上的电压差为0,表示链路上没有数据传输。
接收器检测是怎么做的?我画个图你就明白了:
接收器检测的原理其实不复杂。发送器发出一个脉冲后,如果对端有设备,信号会被反射回来。接收器通过检测这个反射信号,就能判断出有没有设备连着。
个人经验:我曾经遇到过一个诡异的问题——接收器检测偶尔会失败。后来发现是PCB走线的阻抗不连续导致的。检测脉冲在阻抗突变处产生了额外的反射,干扰了判断。所以Layout时一定要注意差分线的阻抗控制。
超时机制与重试策略
Detect状态也有超时机制。你想想,如果对端设备没插好,或者链路断了,总不能一直等下去吧?
超时参数
| 参数 | 最小值 | 典型值 | 说明 |
|---|---|---|---|
| Detect.Quiet时间 | 12ms | 12ms | 电气空闲保持时间 |
| 检测脉冲宽度 | 2 UI | 2 UI | UI = Unit Interval |
| 重试间隔 | 12ms | 12ms | 每次重试前重新Quiet |
| 最大重试次数 | 无限制 | 持续重试 | 直到检测到设备或复位 |
重试策略
Detect状态的重试策略其实挺简单的:
- 检测失败后,回到Detect.Quiet
- 再等12ms
- 再次进入Detect.Active
- 重复直到成功
说白了就是「不行就再来一次」。但这里有个坑——重试是无限次的。也就是说,如果对端设备一直没插上,LTSSM会一直在Detect状态循环,直到天荒地老。
避坑指南:我曾经在一个项目中,发现某个板卡在Detect状态卡死了。排查了半天,发现是接收器检测电路有个电容焊错了,导致检测脉冲被衰减,始终检测不到对端。结果LTSSM就在Detect状态无限循环,系统都起不来。所以硬件调试时,如果发现链路训练卡在Detect,先检查检测电路是不是正常。
重试的优化
虽然Spec说重试是无限次的,但实际项目中我们通常会加一些保护机制:
- 软件超时:驱动层设置一个总超时时间,比如5秒,超时了就报错
- 重试计数:硬件可以记录重试次数,超过阈值就上报中断
- 降速重试:如果多次重试失败,可以尝试降低速率再试
嗯,这些优化Spec里没写,但实际做产品时很有用。我建议你在设计芯片时,至少加一个重试计数寄存器,方便调试。
小结
Detect状态是整个LTSSM的起点,看似简单,但细节不少。记住几个关键点:
- Quiet阶段必须等够12ms
- 检测脉冲要符合电气规范
- 重试是无限次的,但实际产品要加保护
- 接收器检测依赖阻抗匹配,Layout很重要
下一章我们会讲Polling状态,那是真正开始握手的地方。不过今天先到这里,你先把Detect吃透了再说。
一句话总结:Detect就是「先安静,再喊一嗓子,看看有没有人答应」。就这么简单,但做对不容易。