ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

LTPI协议详解:基于LVDS的板间低速信号隧道传输机制

LTPI协议详解:基于LVDS的板间低速信号隧道传输机制 1. 先搞明白LTPI到底解决什么问题在做服务器或者嵌入式板卡管理的时候你有没有遇到过这种场景BMC要监控一块子板上的电源状态读取几个温度传感器还得能控制几个GPIO做上下电时序。以前的做法很简单直接从BMC拉一组I2C线过去再拉几根GPIO信号线加上地线电源线一个连接器密密麻麻全是针脚。板子少还好说如果是那种带八块硬盘背板、四块电源模块、两组风扇墙的整机系统光这些低速管理信号就能把背板连接器占满。LTPI全称是Low-speed Tunnel Protocol Interface直译过来就是“低速隧道协议接口”专门解决的就是这类板间低速信号的传输问题。它的思路很直接把GPIO电平、I2C总线事务、UART串口数据这些原本各自独立的信号统一封装成数据包通过一对差分线传输到对端再由对端还原成原来的电气信号。这样一来几十根信号线就压缩成了一根LVDS差分对连接器针脚数大幅减少背板布线也清爽很多。LTPI这套东西在OCP开放计算项目的规范里定义最初就是冲着服务器管理场景去的。核心出发点有三个第一BMC和远端板卡之间必须有一种可靠、低成本的通信通道第二这个通道要能同时承载多种异质信号不能只传一种协议第三物理层要抗干扰、能走一定距离毕竟背板上的信号环境并不干净。如果你接触过那些需要做板级管理的嵌入式项目搞明白LTPI的机制会很有用。它能帮你理解服务器背板上那些连接器为什么pin定义这么少也能在调试BMC管理通道的问题时快速定位是电气层、链路层还是协议层的问题。这篇文章就从这个题目切入把LTPI的物理层选型、帧结构、信号映射机制和实际调试经验都拆开来看。2. 为什么偏偏是LVDS做物理层2.1 LVDS的三个核心优势LVDSLow-Voltage Differential Signaling这名字在FPGA和高速接口领域很常见但很多人不知道它做低速多信号复用传输其实更合适。它的核心特征是用一对差分线传输信号差分电压摆幅只有350mV左右相比单端3.3V或1.8V的信号EMI辐射小得多而且差分接收器的共模抑制能力很强能抵御地弹和外部噪声。举个例子服务器背板上有大电流电源走线还有高速SerDes信号在跑这对板上的低速管理信号来说就是一个强干扰源。如果GPIO信号用单端传输稍微长一点的距离就可能被电源噪声打穿导致误触发。LVDS差分传输在这种电磁环境下的表现要稳健得多。对于LTPI来说物理层选择LVDS还有一个隐含的好处——绝大多数FPGA的普通IO引脚都能直接支持LVDS标准不需要额外加PHY芯片这就把BMC侧和子板侧的硬件成本压得很低。2.2 可扩展的速率档位LTPI规范里对物理层速率做了分档设计有低速档、中速档、高速档不同速率对应不同线缆长度和功耗需求。实际工程中常见的是在100Mbps到1Gbps范围内跑这个区间既能把低速信号的时延控制在可接受范围又不会带来SerDes级别的PCB设计难度。对于GPIO状态轮询、I2C事务传输这些应用这个带宽完全够用还能留出余量给未来功能扩展。2.3 一对差分线省下来的成本一根LVDS差分对加上地线就三根线再看看传统方案需要多少I2C两根SDA和SCL、UART两根TX和RX、每个GPIO一根、电源和地各一根。按十个GPIO算传统方案至少十六七根线LTPI方案三根搞定。这在连接器选型上差异巨大——从几十pin的矩形连接器降级到几pin的板对板连接器成本直线下降装配容错率也提高了。尤其是那些需要支持热插拔的模块pin越少插拔时的机械可靠性越高。我见过一个实际的4U存储服务器背板设计管理子系统传统方案需要一个40pin的连接器改用LTPI之后直接换成了12pin的小型连接器背板走线层从六层降到了四层光PCB成本每片就省了好几十块。这种级别的好处在量产项目里非常可观。3. LTPI的“隧道”机制是把多种信号塞进一根线的核心3.1 虚拟通道的抽象模型要说清楚LTPI为什么能传不同类型的数据得先理解它的通道抽象模型。LTPI把物理链路上的带宽划分为多个虚拟通道Virtual Channel每个通道可以承载一种特定的信号类型。底层承载介质是同一个LVDS物理链路上层则通过帧类型来区分数据属于哪个通道。这个思路有点像小区里的管道井一根主干管道里可以同时走光纤、铜缆、水管互不干扰各有各的检修口。LTPI就是这样物理LVDS链路是那根主干管道GPIO、I2C、UART各占一条子通道各自封装成独立的帧格式在链路上分时复用。3.2 帧结构的设计逻辑LTPI定义了多种帧类型最基本的两类是周期帧和事件帧。周期帧按固定时间间隔发送主要用来做链路健康检查、参数同步和GPIO状态的周期轮询事件帧则是在数据发生变化时主动触发发送比如GPIO电平跳变、I2C读写请求、UART串口数据到达。帧格式有点类似HDLC的封装有前导码、帧类型字段、通道ID、负载数据和CRC校验。通道ID是个关键字段接收端靠它判断负载数据应该转发到哪个外设接口。整个帧结构的设计目标是低开销、易解析因为这些帧大概率在FPGA内部用逻辑门处理不能太复杂否则会消耗太多的逻辑单元和时钟周期。3.3 总线调度的仲裁机制把多种帧塞进一条链路必然涉及调度问题。LTPI实现中一般用时分复用加优先级仲裁的机制链路空闲时按固定顺序轮询各通道是否有待发数据一旦检测到事件帧立即插入发送队列。比如I2C读写事务属于同步操作有等待响应超时的需求所以它的优先级一般设为最高UART数据可以缓冲优先级次之GPIO状态轮询则可以接受一定延迟优先级最低。实际工程中这种仲裁逻辑非常考验FPGA设计者的水平。调度粒度要尽量细避免高优先级的I2C事务被低优先级的GPIO周期帧堵住同时不能让周期帧完全得不到发送机会否则链路健康监测会失效。优秀的LTPI IP核会把带宽分配做成可配置参数你可以按实际需求调整每个通道的带宽上限。4. 三类信号的封装与还原细节4.1 GPIO信号的“事件上报”机制GPIO在LTPI里分为输入和输出两类输入类型需要把本端电平状态实时同步到对端。如果只是简单的周期轮询那带宽浪费就大了——GPIO的电平变化往往很稀疏可能几百毫秒才有一次跳变。LTPI通常的做法是周期帧里携带一组GPIO bitmap用于全量同步状态同时在检测到某个GPIO发生跳变时立即发送一个包含变化位信息的事件帧这样对端在处理周期帧信号时可以优先响应事件帧。事件上报机制有个工程细节值得注意GPIO抖动处理。机械开关或继电器触点会有几毫秒的抖动直接上报会导致对端看到多次快速翻转。LTPI IP核里通常会集成去抖滤波器可配置滤波时间建议根据使用场景设置合理的去抖窗口。如果没有这个处理对端设备的上电时序逻辑可能被误触发。4.2 I2C总线事务的隧道封装I2C信号塞进LTPI链路是项目中最常用的功能。I2C总线协议本身有START、STOP、地址、数据、ACK/NAK等各类状态要让远端设备无感工作就必须把这些状态一一封装成LTPI事务帧。举个例子BMC要读取子板上一颗温度传感器的温度值传统方案是BMC的I2C控制器直接发起一次读操作。LTPI方案下BMC的I2C控制器不再直接连接远端传感器而是连接到一个本地I2C桥接器桥接器把这次读操作解析成LTPI事务帧通过LVDS链路传到子板上的FPGA。子板FPGA再调用本地的I2C控制器在远端总线上发起真实的I2C读操作拿到数据后封装成LTPI响应帧原路传回。这个过程的关键是时序映射。I2C操作有时间要求比如时钟拉伸Clock Stretching和ACK超时如果LTPI链路的传输延迟过大远端设备可能在等待ACK时已经超时。这也是LTPI链路调度优先级为什么要给I2C最高级别的原因。配置上要预留足够的ACK超时窗口尤其是在链路带宽较低的情况下。4.3 UART串口数据的透明传输UART在LTPI里算是最好处理的信号类型。它本质是一个异步串行数据流LTPI只需要把UART的TX数据通过隧道帧发送到对端由对端还原成串行数据输出RX方向同理。由于UART是有波特率属性的LTPI桥接器一般会按照设定的波特率采样数据再把采样结果封装成字节流。有一个容易踩的坑UART的流控信号。RTS/CTS这类硬件流控脚如果也需要跨板传输得额外映射成GPIO通道不能塞在UART数据通道里。不少工程师初次开发的时候漏了这条调试时发现对端设备丢数据排查半天才意识到是流控信号没接上。如果设计的系统不需要流控记得在两端把UART硬件流控关闭。透明传输的另一个价值是调试便利。LTPI链路本身跑通了你可以先在BMC侧和子板侧各接一个串口工具通过UART通道互相发数据验证链路完整性再依次验证GPIO和I2C。这种分级验证思路能大大缩短故障定位时间。5. 工程实践中的带宽计算与链路调试5.1 算一笔带宽账搞LTPI设计第一个要算清楚的是带宽够不够用。链路的有效带宽取决于物理层速率和帧开销比例。假设LVDS物理层跑100MbpsLTPI帧的开销占20%那有效负载就是80Mbps。一个I2C通道跑400kbps一个UART跑115200bpsGPIO周期帧每毫秒发一帧每帧64字节这就要占用大约0.5Mbps。算下来全部需求可能只有2-3Mbps远小于80Mbps的可用带宽看起来很充裕。但要注意峰值情况。所有I2C通道同时发起事务、UART数据突发、GPIO变化事件集中上报的时候瞬时带宽需求可能暴涨到几十Mbps。虽然LTPI的仲裁机制可以排队但如果峰值持续时间过长数据延迟就上去了。所以带宽设计不能只看平均值还要测峰值和延迟。我的做法是预留至少三倍余量实测链路最大延迟不超过应用可接受阈值的一半。5.2 调试与常见问题排查实录LTPI链路调试说难不难说简单也不简单按经验分三层排查。第一层是物理层看LVDS信号质量。有没有接终端电阻LVDS差分阻抗通常是100Ω发送端串联电阻、接收端并联匹配电阻要按芯片手册来。信号质量用示波器看眼图确保差分摆幅和共模电压正常。这里出问题往往表现为链路完全不通或者偶尔链接丢失。第二层是链路层看LTPI链路是否建立。大部分LTPI实现都有链路状态寄存器能显示Link Up还是Down、错误计数多少。如果链路状态不稳定检查时钟源是否干净、复位时序是否正确。链路层问题表现是能建链但传数据会出错重传率上升。第三层是协议层看各虚拟通道的数据是否正确。I2C通道传数据经常遇到的坑是时序超时。之前调试过一个项目子板上的传感器偶尔读取超时一开始怀疑是I2C上拉电阻配置不对折腾了好几天。后来用逻辑分析仪抓LTPI链路上的帧发现I2C事务帧发送到远端执行完成再返回ACK整个过程耗时比BMC侧I2C控制器的超时阈值长了几个毫秒。把BMC的I2C超时设置从5ms调整到20ms后才稳定。这个案例说明LTPI延长了I2C总线的物理距离也延长了响应时间应用层需要适配。还有一个频繁遇到的坑是子板FPGA启动时序问题。LTPI对端设备如果没有完成初始化远端桥接器回应的是NAKBMC会认为I2C设备不存在。这种情况下要么做延迟重试要么在BMC侧增加子板电源状态轮询等到子板就绪后再发起I2C事务。简单粗暴的延时重试虽不高效但在多数场景能解决问题。6. LTPI和PMBus、I3C的关系要拎清楚经常有人把LTPI和PMBus混为一谈其实它俩不在一个层面。PMBus是Power Management Bus它定义了电源管理设备之间的通信命令集和协议格式物理层通常跑在I2C/SMBus上比如你的电源模块输出电压、电流、温度的读取和上下电时序的控制都在PMBus层面完成。LTPI是物理传输层的隧道封装技术可以把PMBus所使用的I2C总线原样隧道传输到远端。换句话说LTPI是运货的卡车PMBus是货品的分拣规则LTPI负责把PMBus的I2C引脚信号从BMC运到电源模块附近再还原成标准的I2C接口。电源模块本身并不感知LTPI的存在它看到的还是一根正常的I2C总线。那I3C呢I3C是I2C的现代替代品速率更高、功能更多但目前服务器的带外管理场景里I2C/SMBus仍然是绝对主流LTPI规范也在演进新版本开始考虑对I3C信号做隧道传输支持。如果以后平台全面转向I3CLTPI大概率会同步支持I3C隧道物理层架构并不需要大改。7. 实际部署时几个容易忽视的细节7.1 子板热插拔的链路恢复策略服务器上的存储背板、电源模块很多支持热插拔。LTPI链路怎么感知对端设备消失和恢复这和连接器的线序设计有关如果LVDS差分对里有热插拔检测引脚链路层可以实时感知断开如果没有则需要协议层的心跳超时机制来判断远端设备是否失联。实际部署中子板重新插入后LTPI对端要重新初始化FPGA、恢复链路BMC侧要做设备重枚举。整个过程会有一个短暂的空窗期应用驱动要能容忍这个异常。经验不足的项目组很容易忽略这个重枚举流程导致热插拔后管理通道假死。7.2 对端FPGA的固件升级LTPI对端设备往往是FPGA它的固件同样面临升级需求。如果FPGA逻辑里包含USB调试桥等功能升级路径相对多样。如果只有LTPI一条通道那就得考虑如何在不影响管理通道的前提下更新FPGA配置通常做法是在FPGA内部做一个双镜像机制一个镜像在运行时另一个镜像可以接收新版本配置完成后切换。遇到过的情况是强行直接升级导致FPGA配置中途丢失子板管理通道完全挂掉只能把板子拆下来用JTAG重新烧写。所以涉及对端FPGA升级的操作务必做好断电保护并且先验证升级文件完整性。8. 写在最后的小技巧我实际用过LTPI一段时间之后最大的感触是它的调试比想象中依赖逻辑分析仪和协议解码。BMC侧抓I2C事务只能看到本端行为子板侧抓I2C才能看到远端行为中间链路是否真的把数据搬对了必须抓LVDS差分对上的信号。建议试一下在FPGA内部加一个帧计数器和应用层的关键统计值一起上报到BMC日志里作为链路健康度的长期参考指标。LTPI的设计理念很适合在更多场景里推广。它看似复杂实际是在用一种标准化的方式管制信号传输的问题只要理解它的虚拟通道模型和帧调度机制就不难把它用在自己的板间通信设计里。遇到信号多、连线长、干扰大的场景先用LTPI这种思路整理一遍需求你会发现很多原本棘手的问题都有了一套清晰的解法。
返回列表