第4章 Polling状态详解

Polling状态,咱们可以把它看作链路训练的「握手热身阶段」。从Reset退出后,两边的设备开始互相试探,确认信号质量,同步时钟和数据对齐。说白了,就是给正式通信铺好路。

我个人习惯把Polling分成三个子阶段来看:Polling.Active、Polling.Compliance、Polling.Configuration。每个阶段干的事儿不一样,但都离不开训练序列(TS1/TS2)的收发。我调试时发现很多人把Polling和后面的Configuration搞混,其实Polling只管物理层的同步和速度协商,不管链路宽度和通道分配——那些是Configuration的事。

4.1 Polling状态的核心任务

一句话概括:让两端的PHY层对上眼。具体要完成三件事:

  • 位锁定:接收端通过CDR(时钟数据恢复)锁定发送端的位边界。
  • 符号锁定:在10b/8b编码后找到正确的符号边界,对齐8B/10B的字符。
  • 速度协商:双方交换自己支持的数据速率,选一个两者都支持的最高速度。

记得有一次项目,板子上电后死活进不了L0,用协议分析仪抓到的TS1序列断断续续。查到最后发现是参考时钟抖动太大,导致CDR锁不住位。嗯,这一步出问题,后面全是白搭。

4.2 三个子状态的流转

下面这张图是我自己画的Polling内部状态机,调试时贴在工位墙上的。你看完应该能知道信号走到哪一步卡住了。

Polling状态子状态机流程图 Polling.Entry Polling.Active Polling.Compliance Polling.Configuration Config进入 收到TS2? 超时 / 无效TS 是 否 强制退出 说明: 蓝色节点:入口;绿色:Active(正常训练);红色:Compliance(测试模式);紫色:Configuration(进入Config.Lanenum) 菱形判断:收到连续的TS2序列才进入Config;否则继续发送TS1。 虚线箭头:Compliance模式下可通过复位或写入寄存器强制回到Active。

4.3 关键时序与信号

Polling状态下,链路两端不断发送TS1序列。TS1里携带了「发送端的速度向量」——也就是哪些速率它支持。我推荐你在调试时重点关注两个时序参数:

参数含义典型值
Loopback进入环回模式,通常由TS1中的Loopback位控制0(正常)
Speed Change标志位:通知对方准备切换速率置1后等待16个UI
TS1/TS2个数连续收到有效序列的次数至少1次(具体见Spec)

速度变更时有个坑:立Flag后必须等16个UI才能切速,否则对端CDR会跑飞。我见过一个案例,某芯片竟然只等了8个UI就切,结果后续训练永远超时。后来打补丁改成16才稳。

4.3.1 位锁定与符号锁定

位锁定靠CDR,符号锁定靠检测/COM/字符(K28.5)。具体流程:

  1. 接收端从bit流里找到时钟边沿,锁定位边界。
  2. 然后滑动10-bit窗口,找到/COM/字符的位置,完成符号对齐。
  3. 如果符号锁失败,就继续滑窗重试,超时后进入Polling.Compliance或重新开始。

调试小技巧: 用逻辑分析仪抓取Rx端的Elastic Buffer溢出标志,如果频繁跳变,说明符号锁定不稳定。这时候别急着调链路,先看参考时钟和电源纹波。

4.4 常见调试陷阱

我整理了几个自己踩过的坑,希望你别再走一遍:

  • Polling卡在Active不动:最常见原因是位锁定失败。先测量眼图,看眼宽是否满足CDR的捕获范围(比如37.5% UI)。如果眼图像一坨毛线,查链路损耗和AC耦合电容。
  • 莫名其妙进入Compliance模式:Compliance通常是给一致性测试用的。如果板子进入这个状态,多半是TS1中的Loopback位被误置,或者错误计数超标触发保护。我曾经把RX端子的极性接反,导致CRC连续错误,直接踢进Compliance。
  • 速度协商不成功:一边说支持8GT/s,另一边只认2.5GT/s,那就永远谈不拢。检查软件配置的速率掩码是否正确,有些固件默认只开Gen1。

警告: 千万不要在Polling进行中重新配置PHY的速率寄存器!这会破坏训练序列的一致性,导致链路死锁。一定要先退出到Detect状态,再改配置。

4.5 个人经验总结

Polling状态其实是最容易调通的——只要物理层没硬伤,CDR能锁住,符号能对齐,基本都能过去。但反过来说,如果Polling都跑不过,后面就别想了。所以我的调试优先级永远是:

  1. 看CDR Lock指示灯是否亮起
  2. 看TS1序列是否被正常解包(用协议分析仪)
  3. 看速度协商的bitmap是否对称

调过几十块板子后我有个体会:Polling失败不要盲目改软件,八成是硬件问题。眼图、时钟、电平匹配,这三个查一遍基本能找到根因。嗯,今天就聊这么多,你把这张状态机图存下来,调试时对着看,能省不少时间。