尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

LTPI协议详解:用一对LVDS差分线承载GPIO、I2C与UART

发布时间:2026/9/24 12:48:00

资讯中心
01
ARTICLE

LTPI协议详解:用一对LVDS差分线承载GPIO、I2C与UART

LTPI协议详解:用一对LVDS差分线承载GPIO、I2C与UART
做服务器或者嵌入式系统管理的小伙伴应该都有过这种被“线束”支配的恐惧一颗 BMC 既要管一路一路的传感器又要拉串口调试线电源的使能、PG 信号、复位信号、热插拔检测零零碎碎加起来几十上百个引脚。传统方案就是把 GPIO、I2C、UART 各走各的最后在接口处攒出一大把排线。我第一次看到 LTPI 协议时是在一张加速卡基板的原理图上管理侧和 GPU 模块之间只画了“LTPI_TX_P/N、LTPI_RX_P/N”四条线当时第一反应是这能传完后来把原理图翻完才意识到 GPIO、I2C、UART 全部被打包到这一对 LVDS 差分线里了。这篇文章就把 LTPI 的底层逻辑拆开讲清楚包括 LVDS 物理层为什么能用、帧结构怎么设计、GPIO/I2C/UART 各自怎么“过隧道”以及我在实际项目中踩过的链路训练和信号质量相关的坑。说明LTPI 的完整名称是 Low-speed Transport Protocol Interface即低速传输协议接口。正文里涉及具体帧字段、位宽的部分是基于业内的通用实现模型和我自己的 FPGA 复现经验给出的理解框架各家芯片厂商的详细定义要以官方协议文档为准。1. 为什么会产生 LTPI从“针脚爆炸”到一根差分线的问题驱动很久以前板级管理总线的设计思路就是“有多少信号就拉多少根线”。BMC 若要管理四个 GPU就需要从 BMC 引四路 UART、四路 I2C、几十路 GPIO。每一路 GPIO 还要区分输入输出方向、上下拉、复位极性。要是碰到机箱前板的 VGA、USB、串口、前面板 LED/按键接口规模就更夸张了。这种设计在电路上不难难在板卡物理尺寸和连接器资源上连接器的每一个引脚都是成本高密度连接器又贵又难布线更别提线缆过长之后的信号保真度。LTPI 的诞生本质上是想回答一个问题有没有可能把“低速控制总线”复用成一条高速差分链路在远端再把它还原成物理层面的 GPIO、I2C、UART这个思路跟 PCIe 把并行总线变成串行总线是同一个逻辑只是 LTPI 的复用对象更“轻量”。它不需要很大的带宽但必须非常完整地保留低速总线的行为细节——比如 I2C 的 ACK/NACK、时钟拉伸GPIO 的电平跳变沿UART 的波特率抖动。这些细节恰恰是普通协议栈最容易忽略的地方也是 LTPI 实现中最见功夫的部分。从协议结构上看LTPI 位于 OSI 模型的数据链路层和传输层之间物理层用 LVDS链路层用包封装传输层再根据类型字段把包分发到 GPIO、I2C、UART 对应的逻辑通道。这样设计的好处是上层每种总线都感觉自己在独享一条物理链路实际底层只是在一条差分线上按时隙切包。在典型的 HGX 或类 HGX 平台中LTPI 承担的任务包括BMC 读取显卡上的温度/电压/电流传感器、控制电源时序、转发调试串口、上报卡在位信号。任何一个功能掉链子都会直接影响整个系统的可维护性。这也是为什么 LTPI 链路一旦出现 CRC 错误或者训练失败系统管理立刻会陷入“瞎眼”状态——不是 GPU 挂了而是管理侧看什么都不见了。2. LVDS 物理层一对差分线为什么能扛住这么多低速总线很多做嵌入式开发的同学对 LVDS 的第一印象是“屏幕用的接口”屏幕刷新率动辄 60fpsRGB888 下来就是好几 Gbps自然觉得 LVDS 是个高速信号标准。实际上 LVDS 本身只是定义了电气特性跑多快完全看上游协议怎么设计。LTPI 这种低速侧带链路一般跑几十 Mbps 到几百 Mbps相比屏幕场景简直是小菜一碟。2.1 LVDS 的核心优势差分、低压摆、强抗扰LVDS 全称 Low-Voltage Differential Signaling低电压差分信号。它的核心特征是驱动器在两条差分线上给出方向相反的电流接收端检测的是两条线之间的差值。摆幅大约只有 350mV比普通单端信号小得多。这样有两个直接好处对外电磁干扰更小因为两条线上的电流一正一反外部看过去磁场对消。对外界共模干扰有天然免疫力因为两条线受到的干扰基本相同接收端看差值时干扰会被抵消。换句话说同样是从连接器 A 口连到连接器 B 口单端 UART 线走在 30cm 排线里容易串进噪声LVDS 走同样距离就稳得多。服务器机箱内部电磁环境非常恶劣风扇调速、电源开关、PCIe 高速线到处都是噪声源LTPI 选择 LVDS 作为物理层是合理的选择。2.2 LTPI 物理接口常见的四线拓扑LTPI 物理连接一般是点对点结构一侧是管理控制器另一侧是被管理模块上的 LTPI 从机芯片通常是 CPLD/FPGA 或者集成 BMC 功能的桥接芯片。四根线组成为两组差分对信号名方向含义LTPI_TX_P / LTPI_TX_N主→从发送数据差分对LTPI_RX_P / LTPI_RX_N从→主接收数据或时钟差分对有的实现为了让时钟恢复更简单会专门引出一对 LTPI_CLK_P/N 作为随路时钟数据线不再内嵌时钟。这种“源同步时钟”方式对于 FPGA 接收更友好不需要 CDR时钟数据恢复逻辑直接采样即可。实际项目里看到更多是“时钟数据”共用的单对线因为 LTPI 的总速率并不高接收端从数据里恢复时钟的难度不大。2.3 为什么低速总线反而需要高速通道这里有一个思想转换问题I2C 本身只有 100kbps 或者 400kbpsUART 也就 115200bps为什么 LTPI 要动用几十 Mbps 的 LVDS 链路因为一根物理链路上承载的是“时间复用”之后所有低速通道的总和。GPIO 的边沿事件虽然小但要求低延迟I2C 的每个 bit 都要考虑时钟拉伸和地址仲裁UART 的字节流要求严格按顺序到达。如果链路速率只比被复用的总线稍高一点那根本没有余量去处理协议开销。用几十 Mbps 的物理通道去承载几 Mbps 的管理数据留出的是协议转换和转发延迟的余量。实际工程中带宽不是 LTPI 设计的瓶颈延迟才是。比如 GPIO 电源使能信号要求在微秒级别内响应如果 LTPI 链路把 GPIO 事件放在了低优先级队列等到一个长 I2C 事务传完再处理整块板的电源时序就会乱套。所以 LTPI 的通道调度里必须给 GPIO 这种事件型数据足够的“插队”权力。3. 帧结构与链路层一条线如何区分 GPIO、I2C、UART 的数据LTPI 的链路层本质是一个“包交换”网络把物理层的 LVDS 串行比特流切成一帧一帧每一帧头部标明通道类型接收端根据类型把负载分发到对应逻辑通道。这个思路跟以太网帧、PCIe TLP 包没有本质区别难点在于对实时性的保证和低速率总线的语义还原。3.1 一帧 LTPI 数据包里到底有什么在常见的 LTPI 实现模型里一帧数据通常由帧头、负载、校验、帧尾组成。我根据自己的工程复现经验一般把帧定义成下面这个结构字段名常见位宽作用SOF8bit帧起始标志通常用特殊 K 码或者控制字符LEN8bit负载长度用于接收端知道需要收多少字节TYPE8bit负载类型GPIO 事件、I2C 事务、UART 流、管理命令等CH_ID8bit逻辑通道标识可以区分多个 I2C 或者多路 GPIO 端口PAYLOADN*8bit具体数据长度由 LEN 决定CRC16bit对整个帧的检错码保证传输完整性EOF8bit帧结束标志一般和 SOF 呼应收尾向量的难点在于光有通用帧还不够必须把每种低速总线的“语义”变成 PAYLOAD 里可以表达的字段。拿 UART 举例最简单把串行比特流按字节切好塞进 PAYLOAD 的连续字节里对端按顺序解出来就是串口数据。拿 GPIO 举例稍微复杂一点不能把引脚电平一直打包发因为普通 GPIO 大多数时候电平是不变的无限重复发“高电平”纯粹浪费带宽。所以 GPIO 应该做成事件驱动只有引脚发生跳变时才发一个 GPIO 事件包接收端在本地维护一个引脚状态镜像收到事件包就更新镜像并输出到引脚。I2C 是最复杂的。因为它不是单纯的数据流而是有开始条件、停止条件、地址、ACK/NACK、时钟拉伸这些时序概念。I2C 通过 LTPI 时不能直接透明传比特而是要把一次完整事务抽象成一个“I2C 事务包”包含地址、读写标志、数据字节数和数据内容。对端收到后再在远端物理总线上模拟出完整时序。3.2 链路层的“训练”与同步链路层建链的过程跟前几年流行的 SERDES 训练很像刚开始时两端并不知道对方的时钟相位和数据对齐关系。LTPI 通常要发一串训练序列接收端用训练序列完成对齐、极性检查和 CRC 校验能力确认。训练通过之后链路才会进入正常的数据交换状态。我在一个 CPLD 实现里第一次把差分线极性接反了现象就是链路永远训练不通过。因为 LVDS 正端和负端互换后接收端收到的比特流全反了CRC 一算全错。后来把 PHY 层的极性翻转开关打开或者交换连接器上的正负走线训练才成功。这个坑在排错部分再细说。4. GPIO 在 LTPI 里的“虚拟映射”机制GPIO 是 LTPI 链路里最“琐碎”但也最关键的部分。系统管理中的电源使能、复位、PG、告警信号全是 GPIO几十路信号任何一个抖动都可能引发误动作。LTPI 处理 GPIO 的核心思想不是传递连续电平而是传递“变化的事件”。4.1 引脚镜像与事件包假设管理侧需要控制远端 GPIO07。过程如下管理侧软件把 GPIO07 置高。管理侧 LTPI 主控发现镜像寄存器里 bit7 从 0 变成 1。主控发一个 GPIO 事件包负载字段标明“通道GPIO Port A引脚7状态1”。远端从机收到事件包后更新自己的输出寄存器把物理引脚 GPIO07 拉高。这个过程看似多绕了一步实际上能达到的延迟通常在微秒级。I2C 总线空闲时LTPI 链路上几乎没有任何流量GPIO 事件包可以马上发出去不需要排队等待。如果正在传输一个 I2C 长事务才需要插队或者等待事务边界。4.2 GPIO 的输入模式和上下拉怎么保留有些同学会问GPIO 不只是输出还有输入模式、开漏输出、上拉下拉这些电气特性LTPI 怎么把这些也“塞”过去答案是需要两边各配一个具备完整电气特性的 GPIO 控制器。LTPI 远端从机负责把引脚的电平转换成可读状态或者由主机配置其方向和上下拉。有一点很重要LTPI 传的是“逻辑状态”不传“电气特性”。远端引脚到底是推挽输出还是开漏输出取决于远端 GPIO 控制器的配置寄存器这个配置可以由 LTPI 的管理通道提前下发给从机。简单说LTPI 管的是“状态”而 GPIO 的“工作模式”由远端本地控制器的寄存器决定。从网络热词里看到“GPIO 的 8 种工作模式”是很多嵌入式工程师最头疼的问题但在 LTPI 场景里你完全可以这么理解本地控制器保证电气模式LTPI 保证逻辑状态同步。两者组合在一起远端引脚才能表现得和本地引脚一模一样。4.3 毛刺抑制现场踩过的一个坑GPIO 这个通道最容易出问题的不是功能而是毛刺。理论上 LTPI 在远端重建电平的时候应该严格按照收到的事件包翻转输出。但如果链路本身有 CRC 错误或者事件包被重传远端引脚就可能出现“先翻上去、再翻下来”的闪烁导致电源时序控制器误判复位。我当时的解决办法是在远端从机里给关键 GPIO 加了软件消抖收到一个新状态后先不立即输出等 5us 左右确认没有反方向的事件包再输出。类似按键消抖但对电源时序信号同样有效。这个细节在做 FPGA 接收逻辑的人可能想到做板级电源的人未必能意识到所以写出来提醒一下。5. I2C 透过 LTPI 的三个关键细节时钟拉伸、ACK/NACK、SMBus 兼容I2C 是 LTPI 里最“憋屈”的一个总线。它在物理上是开漏输出加外部上拉每一 bit 都有严格的时序要求而 LTPI 把整条 I2C 总线分成了“本地管理侧总线”和“远端目标侧总线”。两段总线之间不能直接导线相连只能靠协议包桥接。5.1 I2C 事务被封装成什么样子一次远端设备读取的典型过程管理侧主机向自己的 LTPI 主控发出 I2C 读请求其实是本地 I2C 控制器发起 Start 地址 读位。LTPI 主控截获这个请求把 Start、地址、读标志、期望字节数封装成一个 I2C 事务包。从机收到事务包后在远端物理 I2C 总线上发起 Start、发地址、读数据、收 ACK。从机把读到的数据、ACK/NACK 状态、Stop 条件封装成返回包。管理侧主控解包后模拟本地 I2C 控制器需要的时序把数据送到上层驱动。这个过程中最关键的是LTPI 必须保留 ACK/NACK 信息。I2C 的 ACK 是一个低有效信号主机发完地址后从机必须拉低 SDA 表示“在”如果从机不存在则 SDA 保持高电平。如果 LTPI 在桥接过程中把 ACK/NACK 吞掉了上层软件就会拿到一个假地址检测结果。5.2 时钟拉伸是最容易翻车的地方I2C 有一种机制叫时钟拉伸从机如果需要更多时间处理数据可以拉低 SCL此时主机必须等待直到 SCL 释放才能继续。物理总线上这个操作是实时的超时时间往往由主机驱动设置。但经过 LTPI 桥接后“远端从机拉住 SCL”这个信号要先变成事件包传回给管理侧主控管理侧再针对本地 I2C 控制器实施时钟拉伸。这就引入了一个环路延迟。如果 LTPI 的实现没有处理好这个延迟会出现本地 I2C 主控等得不耐烦直接报超时。所以设计 LTPI I2C 通道时一般会限制远端总线上允许出现时钟拉伸的时间或者要求远端从机必须有足够快的响应速度。实际选型时很多成熟的 LTPI 桥接只支持 “non-stretch” 的 I2C 从机或者把某个 bit 做成配置项。你在用的时候务必看清。5.3 PMBus/SMBus 与 I2C 的关系一旦提到服务器管理就绕不开 SMBus 和 PMBus。SMBus 是在 I2C 物理层之上的管理总线标准PMBus 又是电源管理专用协议栈。LTPI 的 I2C 通道通常不能直接“透传 SMBus 时序”但可以为 SMBus 报文提供封装通道。PMBus 和 I2C 的区别在于它会要求 PEC错误校验字节。如果 LTPI 只是透明桥接字节流那 PEC 计算仍然有效如果 LTPI 内部重新组织了协议帧PEC 就需要保留或重新计算。我在验证时遇到过 PMBus 在 LTPI 远端读回来 CRC 错误的情况最后追究是本地控制器参与了解析但没有正确处理 PEC换了一个支持 PEC 透传的固件版本才解决。6. UART 在 LTPI 里的“高保真转发”波特率、缓存与顺序UART 是三种总线里最简单的但在 LTPI 里反而有一个容易被忽略的问题字节顺序和字节间隙。UART 本质是异步字节流每个字符之间由起始位和停止位隔开接收端按波特率采样。LTPI 把 UART 字节包进网络帧后远端会按顺序逐字节重建 UART 输出。重建过程中必须保证字节顺序不乱尤其是调试串口打印这种场景打印顺序乱了看日志的人会疯掉。另一个问题是缓存深度。UART 的波特率可达 1Mbps而 LTPI 链路可能正忙于处理 I2C 事务。如果 UART 通道的数据缓存不够深长时间突发数据会溢出丢字节。实际使用中我给 UART 通道的 FIFO 设计到了 4KB 级别并配合流量控制信号DEBUG 级别日志才跑得稳。UART 的优势是不像 I2C 有复杂的 ACK 交互所以 LTPI 通常会把 UART 设计成“尽量高优先级、低延迟”的通道。管理调试口打印一个 panic 信息时如果因为别的总线流量被卡住几百毫秒那还不如直接拉一根线。7. 链路训练与故障排查从 LVDS 极性反了到 CRC 狂涨这部分是这篇博客里最“实战”的部分。LTPI 链路一旦不通现象往往不是“某个 GPIO 失灵”而是整条管理通道完全不可见。下面是排查链路问题的完整思路和我在项目中真实遇到的几个案例。7.1 上电训练的完整链路LTPI 上电后的状态机一般可以拆成下面几步PHY 复位两端各自初始化 LVDS PHY。发送训练序列主控持续发送固定模式直到从机锁定。极性检测接收端检查训练序列是否符合预期如果全反则报告极性反转。环路校验主控发一段 CRC 校验数据从机环回确认收发双向都正确。建立管理通道通过管理通道交换各自能力比如支持多少个 GPIO 端口、多少路 UART。进入正常运行状态。实际调试中使用示波器或逻辑分析仪看差分线上的电平可以在几百毫秒内判断芯片是否在发训练序列。如果什么都没看到先查复位引脚和共模电平。7.2 案例LVDS 极性反接导致训练失败我在一个项目里画的原理图把 TX_P 和 TX_N 名称标反了导致 PCB 布线明明对着芯片引脚实际差分对却反了。现象是训练永远失败管理侧软件报 “LTPI Link Down”但不报具体原因。排查时我先用逻辑分析仪抓从机 RX 端发现波形一直都在说明物理信号到了再看从机的寄存器发现它一直报告 CRC 错误。后在 PHY 配置里打开了 “swap P/N” 寄存器链路瞬间起来。跟我预想的一致就是极性反了。这个教训提醒所有人设计 LTPI 接口时务必在原理图上交叉检查 TX_P/TX_N 的引脚定义。特别是那些直接在 MCU/BMC 上复用 LVDS 的设计很多芯片的引脚命名里 P/N 的定义并不统一。7.3 案例CRC 错误增长的隐藏元凶——交流耦合电容容值不对LVDS 信号通常建议做交流耦合也就是在发送端串一个电容阻断直流分量防止两端电位不一致。容值选小了低频分量或长时间的连续相同位会掉得厉害导致接收端采样不稳定CRC 偶发错误。我在一个设计里用了 10nF 的电容正常温度下还好高温环境下测试 CRC 错误率明显上升。后来换成 100nF 之后问题消失。原因是连续相同码字长时间稳定在同一个直流电平上小电容会被慢慢放电造成基线漂移。换成更大的耦合电容或者改用直流耦合就规避了。7.4 快速的链路健康检查清单如果你也遇到 LTPI 管理通道不稳定可以按下面清单逐项确认检查差分线阻抗LVDS 一般要求 100Ω 差分阻抗走线要成对且包地。检查 AC 耦合电容容值建议 100nF 起步不要小于 10nF。检查极性用寄存器或者示波器确认 P/N 是否反接。抓 CRC 错误寄存器如果持续增长优先怀疑信号质量而非协议逻辑。降低链路速率部分实现支持降速重训可以快速验证是否速率余量不足。检查共模电压LVDS 接收端的共模范围一般在 1.2V 附近如果偏太远就会误码。8. 选型与实现什么时候该上 LTPI什么时候还是老老实实拉线LTPI 不是万能的。在做方案选型时需要根据应用场景判断到底该用 LTPI还是用 I2C 开关、UART 延长器、GPIO 扩展芯片这些传统方案。8.1 适合 LTPI 的场景如果系统满足下面几条LTPI 就非常合适管理侧和被管理侧有物理安装距离用排线连接会占用太多空间。需要跨接多种低速总线GPIO、I2C、UART 都有但每种路数都不多。两侧已经有足以实现 LTPI 的 CPLD/FPGA 或者专用桥接芯片。链路距离在厘米级到半米级适合 LVDS 的点对点通信。典型例子就是 AI 加速卡基板与主机管理板之间的侧带管理。主机板 BMC 离 GPU 板有一段距离通过金手指或背板连接器通信此时 LTPI 可以直接把连接器的侧带引脚压缩到几根。8.2 不适合 LTPI 的场景如果只是在一个小板上扩展几路 GPIO完全没有必要上 LTPI。I2C GPIO 扩展芯片如 PCA9554 更简单便宜。如果只是把一条 I2C 拉到远处可以考虑带中继的 I2C 缓冲器不涉及协议转换。如果需要传输的 I2C 总线数量特别多比如 8 路 16 路每条都要求实时响应LTPI 的复用效率就会下降。LTPI 的另一个潜在瓶颈是 GPIO 的响应延迟。多数 LTPI 实现能够做到微秒级 Toggle但如果你想用它做高速 PWM 输出或者频率很高的脉冲信号那就不现实了。GPIO 信号在 LTPI 上更适合“状态型”场景比如电源使能、复位、PG、卡在位检测而不是“信号型”场景。8.3 在 FPGA/CPLD 里自己实现 LTPI 的成本与控制不少团队会选择在 FPGA 里实现 LTPI 从机逻辑尤其是被管理设备本身就有 FPGA 做其他功能时加一个 LTPI 从机模块几乎不增加硬件成本。实现任务可以拆成四块LVDS PHY 接口用 Xilinx/Intel 的 LVDS IP 或原语直接驱动。链路层状态机接收帧头、正确切分 SOF/CRC/EOF。通道分发逻辑根据 TYPE 把负载发给 GPIO 寄存器、I2C 控制器、UART FIFO。远端 I2C 控制器在 FPGA 内做一个 I2C 从机或主机与本地传感器通信。接收侧的状态机可以简化成类似下面的模型always (posedge clk) begin case (state) IDLE: begin if (rx_byte 8hAA) begin state HDR; cnt 0; end end HDR: begin if (rx_byte[7:5] 3b001) begin ch_id rx_byte[4:0]; state PAYLOAD; end end PAYLOAD: begin if (cnt len_field) state CRC_ST; else begin payload_reg[cnt] rx_byte; cnt cnt 1; end end CRC_ST: begin if (calc_crc rx_crc) state DONE; else state RX_ERROR; end endcase end这段伪代码只是演示帧切分思路实际工程还需要考虑跨时钟域和 LVDS 位流恢复。如果只是验证概念用一个小型 CPLD 也能跑通基础链路但如果要稳定支持 I2C 时钟拉伸、CRC 错误恢复、GPIO 毛刺抑制这些细节我建议直接采购经过验证的 LTPI 桥接芯片或选用集成 LTPI 的 BMC/CPLD 方案自研工作量比想象中大得多。我个人在实际项目中的体会是LTPI 协议的真正难点不在“实现一个包收发器”而在“把低速总线的复杂行为塞进包交换的世界里”。GPIO 要原样重建I2C 要保留 ACK 和时钟语义UART 要保证字节顺序和低延迟这些需求单拎出来都能做合在一起就必须做很细致的通道调度。如果你正在评估类似方案建议先在 MGT 或 LVDS 测试板上搭建一个最小链路把训练和 CRC 验证跑通再往上拖各种总线。否则一上来就全功能联调遇到问题往往很难定位是物理层、链路层还是某个远端总线控制器的锅。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。