TS1 与 TS2 序列的作用与分类归纳总结
它们到底是干什么的?
TS1 和 TS2 序列,说白了就是 PCIe 链路在初始化阶段用来“握手”和“对齐”的关键信号。我刚开始接触 PCIe 协议时,觉得这两个序列就是一串不断重复的“+”、“-”符号,没什么特别的。后来项目做多了才明白——没有它们,链路根本没法正常工作。
简单来说:
- TS1 序列:用于初始位同步、码组同步,以及训练状态之间的转换。
- TS2 序列:用于链路速率协商、宽度协商,以及最终确认链路配置。
你想想看,如果两端设备各说各话,一个想跑 16 GT/s,另一个只能跑 8 GT/s,那怎么让它们达成一致?这就是 TS2 序列的核心价值了。
TS1 序列的两种核心作用
我在调试一个 PCIe Gen3 项目时,遇到过链路一端一直发 TS1,另一端却没反应的情况。当时抓了很长时间的协议分析仪,才发现问题出在物理层——位同步根本没建立。嗯,这里要注意:TS1 的第一个任务就是解决“对齐”问题。
- 位同步与码组同步:接收端通过检测 TS1 序列中的 COM 符号来锁定位边界和符号边界。可以理解成两个人在喊口号,先要把节拍对齐。
- 训练状态转换:TS1 里携带了训练状态编号(LTSSM 状态),告诉对端当前准备进入哪个状态。比如,从 Detect 进入 Polling,或者从 Polling 进入 Configuration。
关键提示:TS1 序列在 Polling 和 Configuration 阶段都会出现,但携带的信息不同。Polling 阶段的 TS1 主要用于同步,Configuration 阶段的 TS1 用来协商链路宽度。
TS2 序列的分类与作用
TS2 序列一般在 Configuration 阶段的后半段出现。我记得刚入行时,一直搞不懂为什么 TS1 之后还要再来一套 TS2。后来一位老同事告诉我:“TS1 是打招呼,TS2 才是真正谈条件。”
TS2 的主要作用可以分为两类:
| 类别 | 作用 | 携带的关键信息 |
|---|---|---|
| 速率协商 | 让两端确认最终的工作速率 | 速率 ID(如 2.5G、5G、8G、16G) |
| 宽度协商 | 让两端确认最终的链路宽度 | Lane 编号、链路宽度掩码 |
| 结束确认 | 正式结束 Configuration 阶段,进入 L0 | 训练状态标识、Loopback 控制位 |
简单来说,TS2 序列就是“最终确认单”。两端都发出 TS2,并且都正确接收到对方的 TS2,才会认为协商完成。
TS1 与 TS2 的对比清单
- 出现时机不同:TS1 在 Polling 和 Configuration 早期,TS2 在 Configuration 晚期。
- 内容差异:TS1 主要包含训练状态和同步码,TS2 包含速率和宽度信息。
- 长度不同:TS1 通常连续发送 16 个序列,TS2 一般发送 8 个。
- 判决条件不同:收到 TS1 后进入下一状态的条件是同步成功;收到 TS2 后进入 L0 的条件是两端信息一致。
实战小贴士:我一般在调试链路训练问题时,会先抓 TS1 序列的发送次数。如果发现一端反复发 TS1 超过 1024 次还没收到回应,基本可以断定是物理层连接有问题,或者对端的接收器没起来。
它们的分类逻辑
从协议角度看,TS1 和 TS2 还可以按“是否含有 SPD”来分类。SPD(Skip 符号)是用来做时钟补偿的。但分类的核心还是按“训练阶段”来区分:
- Polling 阶段的 TS1:只有同步目的,不携带协商信息。
- Configuration 阶段的 TS1:携带 Lane 编号,用于判定 Lane 顺序。
- Configuration 阶段的 TS2:携带速率和宽度,用于最终确认。
- Loopback 阶段的 TS1/TS2:用于诊断测试,内容可以自定义。
我个人习惯把后三种称为“带信息的序列”,第一种称为“纯同步序列”。
SVG 图:TS1/TS2 序列作用与分类关系
下面这张图展示了 TS1 和 TS2 序列在整个链路训练流程中的位置,以及它们的分类关系。
曾经踩过的坑:我曾经在一个 Gen4 项目中,发现 Configuration 阶段反复失败。分析之后发现,对端设备的 TS2 序列里携带的速率 ID 与链路训练状态不匹配,导致收端始终不确认。嗯,后来我养成了一个习惯——每次做链路训练调试时,先核对 TS2 里的速率字段,而不是盲目抓波形。
小结:记住这三个关键点
- TS1 是“对齐”的序列:负责同步、初始化和状态过渡。
- TS2 是“确认”的序列:负责速率、宽度和最终进入工作状态。
- 分类看阶段:Polling 阶段的 TS1 只做同步,Configuration 阶段的 TS1 和 TS2 才是真正的协商。
我个人总结的一句话:TS1 告诉对方“我来了”,TS2 告诉对方“我们该这样配合”。搞懂了这个逻辑,很多链路训练问题就迎刃而解了。