4、链路训练状态机(LTSSM):LTSSM的11个状态概览、状态转换图、Detect与Polling状态详解

好,咱们今天来啃一块硬骨头——LTSSM。说实话,很多工程师做了好几年PCIe,对LTSSM的理解还停留在“知道有这玩意儿”的阶段。但你要真想搞定链路训练,这11个状态必须烂熟于心。

我个人习惯把LTSSM比作一个“状态大转盘”。上电之后,两边的设备就开始在这个转盘上转,直到找到合适的速率、宽度,稳定下来。转不好?那就一直卡在某个状态,链路起不来。

4.1 LTSSM的11个状态概览

先看全貌。LTSSM一共11个状态,我按功能分了四组:

分组 状态名称 核心任务
初始化 Detect 检测对端是否存在
Polling 建立初始连接,协商速率
配置 Configuration 确定链路宽度、Lane反转等
Recovery 重新训练,调整参数
省电 L0s 单方向省电
L1 双向省电
L2 深度睡眠
其他 L0 正常工作状态
Hot Reset 热复位
Loopback 回环测试
Disable 禁用链路

嗯,这里要注意:L0是唯一一个能传数据的正常状态。其他状态要么在“找路”,要么在“睡觉”。

4.2 状态转换图(核心逻辑)

状态转换图其实不复杂。我画个文字版的给你看:

上电/复位
    ↓
  Detect ──→ Polling ──→ Configuration ──→ L0
    ↑                        ↓               ↓
    └──────── Recovery ←──────┘               │
                                              ↓
                                           L0s / L1 / L2
                                              ↓
                                           Recovery (唤醒)

为什么会这样设计?说白了,PCIe的设计哲学是“先连上,再优化”。Detect只管有没有人,Polling只管能不能通,Configuration才去谈细节。我在项目中遇到过好几次,Polling过了但Configuration卡死,最后发现是Lane极性反了——这种坑,后面会细说。

4.3 Detect状态详解

Detect是LTSSM的起点。上电后,设备第一件事就是进入Detect。

Detect要干两件事:

  • 检测对端是否存在:通过发送电气空闲退出序列(EIEOS)和检测接收端的阻抗变化来判断。
  • 确定Lane的极性:判断哪根是正极,哪根是负极。

我记得第一次调PCIe的时候,示波器抓Detect阶段的波形,发现EIEOS发出去后对端没反应。查了半天,原来是参考时钟没给对。你想想看,时钟都没有,接收端根本没法采样,怎么可能检测到?

Detect阶段的三个关键点:

  • Detect阶段不传任何数据,只发EIEOS和静默交替。
  • 如果检测到对端,进入Polling;否则继续Detect。
  • Detect超时时间约12ms,超时后复位重来。

实战技巧:调试时,如果链路一直卡在Detect,优先检查:

  1. 参考时钟是否稳定
  2. 复位信号是否释放
  3. 差分信号极性是否正确

4.4 Polling状态详解

Detect过了,进入Polling。这个状态才是真正的“握手”。

Polling分两个子阶段:

  • Polling.Active:发送TS1和TS2训练序列,告诉对端“我准备好了,你是什么速率?”
  • Polling.Compliance:如果对端没响应,进入Compliance模式,发送固定码型用于测试。

Polling阶段的核心是速率协商。发送端先以2.5GT/s(Gen1速率)发TS1,接收端收到后回复TS1,双方确认速率。如果两边都支持更高速度,会在后续的Configuration阶段升速。

我曾经踩过一个坑:某款FPGA做Endpoint,Polling阶段总是超时。抓波形发现,TS1发出去后对端回了TS2而不是TS1。查规范才知道,Root Complex在Polling阶段必须回TS1,但有些老芯片会回TS2——这就是兼容性问题。后来我在代码里加了个判断,收到TS2也当TS1处理,问题解决。

避坑指南:

  • Polling阶段不要做速率切换,那是Configuration的事。
  • 如果Polling反复失败,检查差分信号幅值是否达标(Gen1要求400-1200mV)。
  • Compliance模式是测试用的,正常训练不会进这个子状态。

4.5 从Detect到Polling的实战要点

这两个状态是链路训练的“第一关”。我总结几个经验:

  1. 时序要卡死:Detect到Polling的转换必须在12ms内完成,否则复位重来。
  2. 信号质量是根本:眼图不好,Detect可能误判,Polling可能丢TS1。
  3. 调试工具要会用:逻辑分析仪抓LTSSM状态,示波器看信号质量,缺一不可。

嗯,说到调试工具,我建议你准备一个PCIe协议分析仪。虽然贵,但关键时刻能救命。我当年就是靠它定位了一个Polling阶段TS1序列CRC错误的bug——原来是PCB走线串扰导致数据出错。

好了,Detect和Polling就讲这么多。下一节咱们聊Configuration和Recovery,那才是真正考验设计功底的地方。