第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内部状态机,调试时贴在工位墙上的。你看完应该能知道信号走到哪一步卡住了。
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)。具体流程:
- 接收端从bit流里找到时钟边沿,锁定位边界。
- 然后滑动10-bit窗口,找到
/COM/字符的位置,完成符号对齐。 - 如果符号锁失败,就继续滑窗重试,超时后进入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都跑不过,后面就别想了。所以我的调试优先级永远是:
- 看CDR Lock指示灯是否亮起
- 看TS1序列是否被正常解包(用协议分析仪)
- 看速度协商的bitmap是否对称
调过几十块板子后我有个体会:Polling失败不要盲目改软件,八成是硬件问题。眼图、时钟、电平匹配,这三个查一遍基本能找到根因。嗯,今天就聊这么多,你把这张状态机图存下来,调试时对着看,能省不少时间。