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,优先检查:
- 参考时钟是否稳定
- 复位信号是否释放
- 差分信号极性是否正确
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的实战要点
这两个状态是链路训练的“第一关”。我总结几个经验:
- 时序要卡死:Detect到Polling的转换必须在12ms内完成,否则复位重来。
- 信号质量是根本:眼图不好,Detect可能误判,Polling可能丢TS1。
- 调试工具要会用:逻辑分析仪抓LTSSM状态,示波器看信号质量,缺一不可。
嗯,说到调试工具,我建议你准备一个PCIe协议分析仪。虽然贵,但关键时刻能救命。我当年就是靠它定位了一个Polling阶段TS1序列CRC错误的bug——原来是PCB走线串扰导致数据出错。
好了,Detect和Polling就讲这么多。下一节咱们聊Configuration和Recovery,那才是真正考验设计功底的地方。