3. Polling状态详解:Polling.Active、Polling.Compliance、Polling.Configuration、Polling.Speed

Polling状态,说白了就是链路训练的第二道关卡。Detect阶段找到了对端设备,现在要开始真正“对上话”了。这个阶段的核心任务就两个:比特锁定符号锁定

我个人习惯把Polling比作两个人初次见面握手——Detect是看到了对方,Polling则是伸手过去,确认对方也伸手了,并且握手的力度、节奏要对得上。

3.1 Polling.Active:开始发送训练序列

进入Polling.Active后,端口开始发送TS1和TS2训练序列。这时候发送的是电气空闲退出序列(EIEOS),然后才是TS1。

嗯,这里有个关键点:发送速率是当前链路支持的最低速率。Gen1就是2.5GT/s,Gen3及以上则是先以Gen1速率开始。

比特锁定(Bit Lock):接收端需要从串行数据流中恢复出时钟,并找到正确的比特边界。说白了就是让接收端的CDR(时钟数据恢复)电路锁定到发送端的时钟上。

我在项目中遇到过一个问题:某款FPGA的CDR锁定时间偏长,导致Polling.Active阶段超时。后来发现是参考时钟的抖动偏大,换了个低抖动的晶振就解决了。

3.2 Polling.Compliance:合规性测试模式

这个子状态比较特殊。它不是正常训练流程的一部分,而是为了测试和认证用的。

当端口连续收到16个TS1且其中的“合规性位”被置位时,就会进入Polling.Compliance。这时候端口会持续发送特定的测试码型,方便用示波器测量信号质量。

注意:正常工作中不会进入Compliance模式。如果你在调试时发现链路卡在Polling.Compliance,多半是TS1中的合规性位被错误置位了。我曾经被这个坑过——某款芯片的寄存器默认值把合规性位写成了1,导致链路死活训练不过去。

3.3 Polling.Configuration:交换配置信息

这是Polling阶段最核心的部分。双方通过交换TS1和TS2来完成:

  • 链路宽度协商:确认双方支持的lane数量
  • 极性反转检测:检查P/N是否接反了
  • Lane反转检测:检查lane顺序是否错位
  • 符号锁定(Symbol Lock):找到8b/10b编码的符号边界

符号锁定比比特锁定更上层一些。比特锁定找到了每个bit的位置,符号锁定则是找到了每个10-bit符号的起始点。你想想看,没有符号锁定,接收端根本不知道哪8个bit是一组数据。

个人经验:调试时我习惯先看Polling.Configuration是否收到了正确的TS1/TS2序列。如果TS1中的链路宽度字段不对,那多半是上一级协商出了问题。

3.4 Polling.Speed:速率协商

这个子状态只在Gen2及以上速率支持。它的作用是让链路从Gen1速率切换到更高的速率。

流程是这样的:

  1. 双方在Gen1速率下完成Polling.Configuration
  2. 进入Polling.Speed后,发送端开始发送速率变更序列(SRIS)
  3. 接收端检测到SRIS后,调整CDR到新速率
  4. 双方在新速率下重新进行比特锁定和符号锁定

说白了就是先低速握手,再切换到高速。这个设计很聪明——低速时信号质量好,容易建立连接;高速时带宽大,适合数据传输。

3.5 比特锁定与符号锁定的区别

锁定类型 锁定对象 实现方式 典型问题
比特锁定 单个bit的时钟和边界 CDR电路锁定到数据流 时钟抖动大、信号质量差
符号锁定 10-bit符号的起始点 检测COM符号(K28.5) 极性反转、Lane错位

我记得有一次调试Gen3链路,发现符号锁定总是失败。折腾了半天,最后发现是PCB走线把一对差分线的P/N接反了。极性反转检测虽然能处理这个,但需要固件正确配置——嗯,当时我忘了使能这个功能。

3.6 Polling阶段的超时处理

LTSSM每个状态都有超时定时器。Polling阶段的总超时是48ms。如果超时了还没完成,LTSSM会回到Detect状态重新开始。

常见的超时原因:

  • 对端设备未上电或未就绪
  • 信号质量差导致CDR无法锁定
  • 参考时钟频率偏差过大
  • PCB走线阻抗不匹配

避坑指南:我曾经遇到一个案例,某款SSD在Polling阶段总是超时。抓log发现是TS1序列中的链路宽度字段写错了——固件把x4链路配置成了x8,对端不支持x8就直接不响应了。所以调试时一定要先确认TS1/TS2的内容是否正确。

3.7 知识体系流程图

Polling状态知识体系 Polling状态 Polling.Active Polling.Compliance Polling.Configuration Polling.Speed 核心任务 比特锁定 → 符号锁定 TS1/TS2训练序列交换 关键机制 CDR锁定 · 极性反转检测 Lane反转检测 · 速率切换 常见问题与避坑 • CDR锁定超时 → 检查参考时钟抖动 • 符号锁定失败 → 检查极性反转和Lane顺序 • Polling超时 → 检查TS1/TS2内容是否正确

这张图把Polling状态的核心内容串起来了。四个子状态各有分工,但最终目标都是完成比特锁定和符号锁定,为进入后续的L0状态做准备。

调试建议:如果你在调试PCIe链路训练问题,我建议先抓LTSSM状态机的log,看卡在哪个子状态。卡在Polling.Active多半是CDR问题,卡在Polling.Configuration则是TS1/TS2内容异常,卡在Polling.Speed就是速率切换失败。对症下药,效率高很多。


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