GMSL2同轴线上的UART透传:MAX96763/MAX96752F车载串口通信实战
发布时间:2026/9/28 13:43:21来源:尧图网络
车载项目里做过一次很有意思的硬件通信改造远端传感器板上有一颗MCU主控板在几米外的另一端两者中间只有一根同轴线。视频可以先不管麻烦的是这根线上还要把串口数据稳定传过去而且远端设备还要靠同一根线供电。第一反应是拉一对RS232/RS485线过去但整车线束成本和布线难度立刻让人打消念头。最后选了Maxim的GMSL2方案用MAX96763做串行器、MAX96752F做解串器把UART、I2C和供电全部复用进一根同轴链路建立后串口数据透传非常稳定。这篇文章把整套系统的设计思路、硬件关键点、寄存器配置流程和调试经验完整记录下来。用的是GMSL2链路核心寄存器配置部分会直接给出项目实测通过的配置表和初始化代码适合正在做车载摄像头、远距离串口扩展、单线视频控制链路方案的工程师参考。1. 项目背景与方案选型为什么是GMSL而不是普通串口线1.1 车载场景下的物理限制先说这个项目面临的真实约束。远端传感器板位于车头区域主控在车身中后部两者之间要走一根线。原来打算用普通的UART直连方案5V电平或者RS232电平拉到3米以上实际测试时发现两个问题一是信号完整性极差波特率只要上到57600远端接收就出现误码二是线缆必须做屏蔽处理否则旁边的高压线束一工作串口直接乱码。这时候就需要一种能跑在同轴线上的物理层方案。GMSLGigabit Multimedia Serial Link本身是面向车载摄像头设计的串行链路技术它的核心优势是在一根同轴线上同时承载高速视频、控制通道I2C/UART/GPIO和供电。MAX96763和MAX96752F是GMSL2世代的一对典型组合前者是串行器SER后者是解串器DES链路速率支持1.5Gbps和3Gbps两档。用GMSL传串口的思路本质上是把传统意义上的“外设通信链路”变成一个管道主控端的UART接到DES的UART接口远端MCU的UART接到SER的UART接口两端通过GMSL控制通道完成数据透传。对应用层来说行为表现和直接连一条串口线几乎一样。1.2 方案对比LVDS、FPD-Link和GMSL怎么选这类单线远距传输场景业内常见方案不止GMSL一种。我把实际考察过的三条技术路线列个表对比一下方案物理介质典型速率控制通道供电复用车载成熟度普通RS422/RS485双绞线MSP~10Mbps无不支持成熟但线束多LVDS直连屏蔽双绞线百Mbps级别需额外走线不支持一般FPD-Link III/IV同轴/STPGbps级别I2C/GPIO/UART支持POC很高GMSL2同轴1.5/3GbpsI2C/UART/GPIO支持POC很高FPD-Link和GMSL在功能上非常接近都支持POC和控制通道传输。最终选GMSL的原因很实在一是项目现有的摄像头模组已经是GMSL接口主控端已经预留了对应的解串器资源复用同一套链路可以少走一路线二是MAX96763对UART over GMSL的支持比较灵活波特率范围宽代码配置也不复杂。1.3 MAX96763与MAX96752F的角色分工简单梳理一下这对芯片在系统中的位置。MAX96763是串行器的角色放在远端负责把摄像头视频、远端MCU的UART TX信号以及远端外设的I2C总线打包成高速串行数据通过同轴线发往主控端。MAX96752F是解串器放在主控端把收到的串行数据解出视频信号、UART RX信号和I2C总线同时把主控端下发的I2C命令、GPIO控制字和UART TX数据反向调制到同轴链路上传给远端。需要注意“主控端连DES、远端连SER”这个角色划分是固定的但UART数据流方向是双向的。DES端接入的UART数据会通过链路控制通道发送到SER端由SER的UART TX引脚输出反过来SER端接入的数据也会通过链路传回DES端输出。也就是说对两端设备而言GMSL链路把各自的UART RX/TX“透明地”接在了一起。2. 硬件架构与关键设计原理图阶段就要避开的坑2.1 系统总体连接与引脚分配这套系统的硬件连接不算复杂但引脚分配直接决定了后面软件好不好调。先画一遍基本连接关系远端板MAX96763的UART TX/RX分别接到远端MCU的UART RX/TXI2C引脚接远端外设如摄像头寄存器配置接口同轴输出经过POC电路接到连接器。主控板MAX96752F的同轴输入经过POC电路接连接器UART TX/RX接主控MCU的对应串口引脚I2C接主控总线。一个特别容易忽略的细节是MAX96763和MAX96752F的UART引脚不是固定单一的通常有多个可选映射比如UART_TX可以映射到不同GPIO复用引脚。原理图设计阶段就要把这个映射关系定下来并且和软件配置保持一致。我这次在原理图评审阶段把SER的UART映射到了特定引脚结果软件初始化时默认配置没改导致一开始UART完全不通排查了半天才发现是引脚映射配置没同步。这类问题在原理图上多写一行注释就能避免。另外一个关键设计是LOCK信号。MAX96752F有LOCK输出引脚用于指示GMSL链路是否锁定这个信号强烈建议接到主控MCU的GPIO中断输入。车载环境下同轴线缆受振动、温度影响可能出现瞬时链路抖动通过LOCK中断可以及时做链路重同步或者报警处理。很多参考设计只把它当成测试点量产之后链路异常了才发现没法自动恢复体验很糟糕。2.2 POC供电电路电感电容选型计算POCPower over Coax是同轴线上叠加直流供电的方案。核心原理就是在信号路径上用隔直电容耦合高速信号同时用电感把直流电源馈入同轴线中心导体实现“信号供电”单线复用。POC电路的选型有两个关键点电感的自谐振频率和隔直电容的截止频率。电感选型上我用了1μH的绕线电感直流电阻控制在0.5Ω以内额定电流按远端负载电流的1.5倍以上选择。这个项目远端板的整体功耗约3.3V×0.4A同轴线馈电电压用12V电流只有0.11A左右余量很充足。电感值不是越大越好超过10μH的贴片电感自谐振频率往往掉到几十MHz而GMSL2的3Gbps信号频率成分能到1.5GHz如果自谐振频率落在信号频带内电感会变成电容信号直接被短路到电源轨上。隔直电容选择100nF的0402封装高频电容同时并联一个10nF作为高频旁路。电容的谐振频率同样要避开信号频段100nF的0603/0402电容自谐振频率一般在几百MHz配合10nF使用基本覆盖了需要的频率范围。电源馈电结构上我在远端和主控端都加了LC滤波电感放在电源入口电容靠近同轴连接器放置。实测下来12V馈电经过1米长的RG174线缆后压降大概在0.15V左右远端板LDO输出3.3V稳定没有出现供电不足导致的芯片复位问题。2.3 线缆、连接器与阻抗匹配的实务经验同轴线缆的选型会影响链路预算。GMSL2在3Gbps模式下线缆的插入损耗不能超过一定预算不同线缆差异很大。RG174这种细线缆在1.5Gbps模式下跑3到5米问题不大但3Gbps模式下建议控制在2米内如果链路距离超过5米建议换用RG58或低损耗车载专用同轴线。连接器的选择同样重要。车载场景强烈建议用FAKRA或Mini-FAKRA连接器这类连接器有防呆设计、插拔力符合车规要求而且阻抗一致性比普通SMA好很多。实验室调试时我用SMA连接器代替虽然SMA的50Ω特性阻抗很标准但它的固定方式和抗振性能并不适合随车测试。另外75Ω和50Ω系统要分清楚MAX96763/MAX96752F的输出驱动是按50Ω设计的如果线缆是75Ω系统需要加阻抗变换电路不能直接把75Ω线缆往50Ω接口上硬接。PCB走线方面同轴信号的焊盘到连接器之间要保持50Ω阻抗控制尽量短过孔不要超过两个。我在第一版PCB上让同轴信号穿了三层板到背面连接器结果链路裕量直接下降后来改成顶层直出、连接器贴板边锁定时间明显变快。3. GMSL链路初始化寄存器配置的完整步骤3.1 上电时序与I2C访问路径GMSL链路初始化的第一个难点是I2C访问路径。MAX96752FDES在主控端上电后可以直接通过主控I2C总线访问。但MAX96763SER在远端上电后它的I2C从地址在默认状态下并不出现在主控总线上需要通过DES的I2C over GMSL功能把I2C命令转发到SER。所以正确的初始化顺序是先初始化DES让DES与SER建立起GMSL物理链路此时链路可能还未完全锁定但控制通道已可用然后通过DES转发I2C命令去配置SER。如果SER的I2C地址和DES的默认从地址冲突需要先把DES的从地址改成可用地址再做转发操作。这里的上电时序我建议这样同时给两端上电然后主控端MCU延时50ms等待DES和SER内部稳压器稳定再开始I2C访问。不要在主控端上电后立即读DES寄存器否则可能读到全FF或者CRC错误因为DES内部还在做初始化。GMSL2链路锁定的标志是DES的LOCK寄存器位为1。锁定后I2C over GMSL功能才完全可用。在配置过程中我会先写DES的基础参数链路速率、I2C端口配置再读回确认然后通过转发地址访问SER写SER的基础参数最后回读SER的寄存器确认收到。3.2 核心寄存器配置表下面是这套系统项目实测通过的一组关键配置。需要注意的是寄存器地址以MAX96763和MAX96752F数据手册的Register Map为准不同批次芯片的保留位定义可能略有差异。实际项目里建议先把芯片手册对应页打印出来边配边对照。芯片寄存器地址配置值功能说明MAX96752F (DES)0x00060x00GMSL2模式非GMSL1兼容模式MAX96752F (DES)0x000A0x00配置锁定检测的阈值窗口MAX96752F (DES)0x00040x04设置DES的I2C从地址为0x48MAX96752F (DES)0x00100x00使能GMSL2接收器关闭待机模式MAX96752F (DES)0x00200x11配置UART通道使能及波特率档位MAX96752F (DES)0x00230x80设置UART TX映射到指定引脚MAX96752F (DES)0x00A00x88使能I2C over GMSL转发MAX96763 (SER经转发)0x00060x00GMSL2模式设置MAX96763 (SER经转发)0x00040x20设置SER的I2C从地址为0x40MAX96763 (SER经转发)0x00100x00使能GMSL2发送器关闭待机MAX96763 (SER经转发)0x00200x11配置UART通道使能及波特率档位MAX96763 (SER经转发)0x00230x80设置UART TX映射到指定引脚这里补充几个配置值的含义。0x0020寄存器里的UART波特率档位我配置为0x11对应的是115200bps。如果项目需要更高的波特率比如460800需要同步修改SER和DES两端的这个寄存器并且GMSL2的速率档位可能也要相应调整。项目里曾经只改了DES端SER端保持默认结果链路建立正常但串口数据全是乱码这个问题在调试部分会详细说。0x00A0寄存器用于使能I2C over GMSL转发。这个寄存器必须在配置SER之前就写好否则对SER地址的I2C命令不会通过链路转发过去。我调试时遇到过一种情况死活写不进SER的寄存器读回来永远是0xFF最后发现是DES的转发使能位没置1。这个问题在参考设计手册里往往一笔带过实际项目里却是最常见的新手坑。3.3 软件初始化代码框架下面给出一段基于I2C操作的初始化代码框架使用标准Linux I2C设备驱动接口风格编写其他平台移植思路相同#include stdio.h #include stdlib.h #include stdint.h #include fcntl.h #include unistd.h #include sys/ioctl.h #include linux/i2c-dev.h #define DES_I2C_BUS /dev/i2c-2 #define DES_I2C_ADDR 0x48 // MAX96752F 从地址 #define SER_I2C_ADDR 0x40 // MAX96763 从地址 static int i2c_fd; int i2c_write_reg(int addr, uint16_t reg, uint8_t val) { uint8_t buf[3]; buf[0] (reg 8) 0xFF; buf[1] reg 0xFF; buf[2] val; struct i2c_msg msg { .addr addr, .flags 0, .len 3, .buf buf, }; struct i2c_rdwr_ioctl_data data { .msgs msg, .nmsgs 1, }; if (ioctl(i2c_fd, I2C_RDWR, data) 0) { perror(i2c write failed); return -1; } return 0; } int i2c_read_reg(int addr, uint16_t reg, uint8_t *val) { uint8_t buf[2]; buf[0] (reg 8) 0xFF; buf[1] reg 0xFF; struct i2c_msg msg[2] { { .addr addr, .flags 0, .len 2, .buf buf, }, { .addr addr, .flags I2C_M_RD, .len 1, .buf val, }, }; struct i2c_rdwr_ioctl_data data { .msgs msg, .nmsgs 2, }; if (ioctl(i2c_fd, I2C_RDWR, data) 0) { perror(i2c read failed); return -1; } return 0; } int gmsl_link_init(void) { // 1. 打开I2C总线 i2c_fd open(DES_I2C_BUS, O_RDWR); if (i2c_fd 0) { perror(open i2c bus failed); return -1; } // 2. 配置DES的基础参数 i2c_write_reg(DES_I2C_ADDR, 0x0006, 0x00); // GMSL2模式 i2c_write_reg(DES_I2C_ADDR, 0x000A, 0x00); // 锁定检测阈值 i2c_write_reg(DES_I2C_ADDR, 0x0004, 0x04); // DES从地址0x48 i2c_write_reg(DES_I2C_ADDR, 0x0010, 0x00); // 使能接收器 // 3. 配置DES的I2C转发确保后续能访问SER i2c_write_reg(DES_I2C_ADDR, 0x00A0, 0x88); // 使能I2C over GMSL // 4. 等待GMSL链路锁定 uint8_t lock 0; for (int i 0; i 20; i) { i2c_read_reg(DES_I2C_ADDR, 0x0015, lock); // 读取锁定状态寄存器 if (lock 0x01) { printf(GMSL link locked\n); break; } usleep(100 * 1000); } if (!(lock 0x01)) { printf(GMSL link lock timeout\n); return -1; } // 5. 通过DES转发访问SER配置远端串行器 i2c_write_reg(SER_I2C_ADDR, 0x0006, 0x00); // GMSL2模式 i2c_write_reg(SER_I2C_ADDR, 0x0010, 0x00); // 使能发送器 i2c_write_reg(SER_I2C_ADDR, 0x0020, 0x11); // UART通道使能/115200 i2c_write_reg(SER_I2C_ADDR, 0x0023, 0x80); // UART TX引脚映射 // 6. 回读SER寄存器确认配置生效 uint8_t chk 0; i2c_read_reg(SER_I2C_ADDR, 0x0020, chk); printf(SER UART config readback: 0x%02X\n, chk); return 0; }这段代码的核心逻辑不算复杂但有一个细节值得注意对SER的I2C读写操作实际上是在I2C总线上发起了目标地址为0x40的普通I2C事务而DES作为转发节点会监听这个地址然后把它翻译成GMSL链路上的I2C over GMSL包最终由SER响应。所以软件层面看不到任何“转发”的特殊操作写起来和访问普通I2C从设备完全一样。实际项目中我会在初始化代码里加一个读回校验机制。每次写关键寄存器后立即回读如果不一致就报错并记录日志。这个机制在调试早期帮了大忙有一次就是因为SER芯片虚焊写寄存器无响应回读校验直接暴露了故障点。4. 打通UART串口通道数据如何跨过GMSL链路4.1 GMSL2的UART复用原理GMSL2链路在同一根同轴线上并行承载多种数据类型高速视频数据流、双向I2C控制通道、UART数据通道和GPIO状态。这里面的关键点在于UART并不是像传统串口一样有独立的物理引脚而是被封装进GMSL2的帧结构中作为控制通道的一部分传输。具体来说GMSL2在物理层上用高速串行帧承载数据帧格式里划分了不同的槽位视频数据占大头控制通道I2C、UART、GPIO复用在相对低速的时隙中。对于应用层而言SER端的UART TX引脚收到远端MCU发出的串行数据后芯片内部的UART控制器会把数据打包进GMSL2帧的控制通道传送给DESDES解出后从自己的UART TX引脚输出主控MCU就能收到。反向路径同理。这种设计的直接好处是两端设备的UART控制器不需要做任何协议适配只要设置好相同的波特率、数据位、停止位和校验位GMSL芯片就会像一根透明的导线一样把数据从一端搬到另一端。主控MCU甚至感知不到中间还有一对SerDes芯片存在。4.2 UART通道配置的细节UART通道的配置看起来只是写几个寄存器但有几处细节会直接影响通信质量。第一处是波特率必须两端一致而且要确认链路本身支持的波特率上限。MAX96752F和MAX96763的UART通道在GMSL2模式下我实际验证过115200bps下长时间传输完全稳定460800bps在短距离1米内也能跑但链路余量下降比较明显建议量产保守使用115200或230400。第二处是数据格式。GMSL2的UART控制通道默认支持8N1格式8数据位、无校验、1停止位这是最常见的配置。如果远端设备用7位数据位或者带校验位需要查对应芯片是否支持严格来说这不是芯片是否“认识”校验位的问题而是链路对数据帧的裁剪方式。第三处是流控。GMSL2控制通道承载UART数据时不建议启用硬件流控RTS/CTS因为流控信号如果要跨链路传输需要额外占用GPIO通道资源配置复杂度会明显上升。如果两端设备对数据丢包敏感我建议在应用层做协议重传机制不要依赖串口硬件流控。第四处是缓冲区和丢包行为。GMSL2链路对UART数据是“尽力而为”的转发如果远端MCU在短时间内连续发送大量数据超过DES端UART控制器的缓冲区就可能出现数据覆盖丢弃。实测下来115200bps下连续发送1KB数据块没有丢包但如果远端MCU用中断方式频繁发送小数据包注意不要每次进中断只发一个字节就退出最好凑满几个字节再发。4.3 验证方法示波器实测波形与回环测试UART通路调通之后的验证方法我习惯分三步走。第一步是环回测试。这种方式用于确认DES和SER端的UART引脚映射、使能配置是否正确。具体做法是在远端SER的UART TX引脚上手动接一根杜邦线到本板的UART RX引脚形成远端环回主控端DES的UART TX和RX直接短接主控端环回然后主控MCU向串口发送测试数据看能否收到自己的发送数据。如果两端环回都正常说明GMSL链路通道本身没问题如果只有一端正常问题就锁定在另一端。第二步是信号完整性测量。用示波器探头接在SER的UART TX引脚上发送一串已知数据比如AA 55 AA 55这种交替位模式测量信号幅度、上升沿和波特率精度。UART信号是3.3V电平如果幅度低于2.8V或者上升沿超过100ns需要检查主控MCU和SER之间的电平匹配、走线长度和上拉电阻。第三步是实际链路测试。把远端MCU和主控MCU的程序都烧录好主控端通过串口向远端发送一帧带长度和CRC校验的指令远端收到后回传一帧状态数据。统计往返时间、误码率和丢包率。这个测试持续跑24小时以上用来验证长时间运行的稳定性。项目里最初版固件在连续运行约3小时后出现一次UART通信中断排查发现是远端MCU看门狗复位导致SER侧短暂失联链路恢复后UART通道自动重同步但那段窗口期的数据丢了。后来在应用层加了异常重试机制才解决。5. 实战排查我在这套系统上踩过的坑5.1 常见问题速查表把这套系统调试过程中最容易遇到的问题整理成一张表方便现场排查时对照处理现象可能原因排查/解决方法DES的LOCK一直为0链路速率不匹配、线缆过长、POC电感自谐振异常确认SER/DES两端GMSL2速率一致缩短线缆长度更换电感I2C写入SER无响应读回0xFFDES的I2C转发未使能检查DES 0x00A0寄存器转发位是否置1UART数据乱码两端波特率不一致、SER/DES波特率档位寄存器不一致同步配置两端0x0020寄存器视频正常但UART不通UART使能位没开、引脚映射不一致检查0x0020能否使能UART0x0023引脚映射是否与原理图一致远端板偶发复位POC供电压降过大、供电电流不足测量远端端电压确认电感额定电流和线缆线径近距离正常、远距离锁定失败线缆损耗超出链路预算检查GMSL2速率是否为3Gbps适当的降为1.5Gbps5.2 三个典型的调试案例第一个案例是远端SER配置写不进去的问题。当时现象是DES上电后锁定正常视频也能出画面但I2C怎么都访问不到SER。回读SER寄存器不是0xFF就是0x00完全不像正常的寄存器值。排查到后面才发现DES的I2C转发功能没有正确开启配置代码里把0x00A0的寄存器写成了0x80而实际要求的使能值是0x88。差了一个bit转发功能就完全失效。这类寄存器位定义问题在芯片手册里藏在很深的章节建议调试时把手册里的寄存器图打印出来逐个bit核对。第二个案例是UART接通后持续乱码。链路锁定正常用示波器看DES的UART TX引脚也能看到波形但帧格式完全不对。最后用逻辑分析仪抓包发现DES的输出波特率大约是230400而远端MCU和主控MCU都是按115200配置的。原因在于SER端的0x0020寄存器当时用的是默认值默认可能是230400这一档只有DES端被改成了115200。这种“一端匹配另一端不匹配”的配置错误最有效的排查办法就是在两端分别读0x0020寄存器的实际值对比是否一致。第三个案例是3Gbps链路在2.5米线缆上偶尔出现锁定丢失。排查发现线缆用的是RG174插入损耗在3Gbps频段已经逼近链路预算上限再加上FAKRA连接器和POC电路板上走线的损耗链路余量不足。最后把链路速率从3Gbps降到1.5Gbps锁定稳定视频分辨率从1080P60降到1080P30应用上可以接受。这个教训说明设计阶段如果知道线缆比较长就要在链路速率档位上留足余量不要一开始就选最高速率。5.3 调试工具推荐工具方面用得最多的是逻辑分析仪和I2C总线抓包工具。逻辑分析仪用于UART波形抓取买24MHz采样率以上的即可几十块钱的足够用。I2C抓包建议用带协议解析功能的调试器方便直接看读写的寄存器地址和值。还有个硬件小技巧在DES的LOCK引脚上接一个LED灯调试阶段非常直观。链路锁定时LED常亮链路抖动时LED闪烁比用示波器反复量电平高效得多。量产时可以把这颗LED取消但Layout上保留测试点方便产线检测。6. 最后想分享的一点经验这套GMSL串口通信系统从画原理图到链路打通前后经历了大概两周时间。回头来看最花时间的不是芯片配置本身而是对GMSL链路机制的理解。理解了“UART其实是复用在GMSL控制通道中”这个本质之后很多问题都能非常快地定位。寄存器配置表一定要以芯片手册为准不要直接照搬网上别人的配置不同批次、不同封装甚至不同电源条件下寄存器行为都会有细微差异。另外强烈建议在项目启动阶段就去下载完整的芯片数据手册和勘误表MAX96763和MAX96752F的寄存器手册加起来几百页但只需要把涉及链路速率、UART控制、引脚映射和I2C转发的章节精读一遍就能避免大部分调试坑。做完这个项目后我对GMSL方案在车载里面的定位理解更深了它不只是传视频的工具更是一条多功能的单线通信管道。串口只是其中一种用法同样的链路还能承载GPIO、I2C甚至以太网后续做扩展时这套底层经验可以直接复用。
网站建设高端定制企业官网