☰
GMSL2链路UART串口通信实战:MAX96763/MAX96752F寄存器配置指南
2026/9/28 7:20:02 网站建设 项目流程

车载项目里只要牵扯到摄像头,早晚都会遇到GMSL这对东西。以前做模拟信号传输,视频是出来了,但控制信号还得单独拉线,一根同轴线只干一件事,成本高、布线麻烦、故障点还多。后来项目换了GMSL2方案的串行器/解串器,也就是通常说的SerDes芯片,用MAX96763配MAX96752F,一根同轴电缆把视频、I2C、UART、供电全跑通,这一下清爽多了。这篇文章就把我这段时间在GMSL链路上调UART串口通信的过程和寄存器配置整个完整记录下来,主要针对想在GMSL链路里跑通串口通信的嵌入式工程师,尤其是做车载摄像头、域控制器、AVM环视、电子后视镜这类方向的朋友,看这一篇能少走不少弯路。

先说清楚,不管你是想在视频链路上顺带传个串口,还是要用I2C控制远端的模组,本质上都需要先把GMSL链路打通,再把控制通道配置对。GMSL2的back-channel控制通道不只是传I2C,它也能承载UART数据,这正是标题里“GMSL串口通信”的基础。下面从系统设计、硬件PoC方案、寄存器配置到调试排查,按实际项目推进的顺序来讲。

1. 项目背景与GMSL串口通信方案设计

1.1 为什么非要在GMSL链路上跑UART

先说场景。我这次的项目是做一个带云台控制的摄像头模组,主机端是域控制器,远端是摄像头+云台电机。视频必须实时回传,云台控制指令也得实时下发。早期方案里视频走GMSL,云台控制单独拉了一根UART线,想着反正车规线束多一根也不算什么。结果实测下来问题一堆,线束长度超过两米,UART信号质量就开始拉胯,波特率上到115200就偶尔丢包,上到460800直接不能看。而且接口连接器、线缆、装配工时全是成本,主机端接口也不够用,项目评审时被硬件负责人追着问能不能把控制信号并到视频链路里。

这才仔细去翻GMSL2的协议。GMSL2的back-channel是一个从解串器发往串行器的反向控制通道,跑在同轴电缆上,方向和数据通道相反,频段不同。这个控制通道协议上叫control channel,它不只是给I2C用的,UART数据也能映射到这个控制通道里传输。也就是说,只要把解串器本地的UART端口接到主机MCU,把串行器本地的UART端口接到远端设备,中间通过寄存器把两边的UART端口都路由到控制通道上,一根线就能把远端设备和主机打通,视频、I2C、UART全在一个物理链路上,互不干扰。

这个方案最大的意义在于,远端设备不再需要额外拉电源线、信号线、地线,只要同轴线到达的地方,供电和控制信号都能到。车规场景里线束减重、减少连接器、提高可靠性,这几点都是实打实的收益。

1.2 MAX96763与MAX96752F的分工

这套方案里两颗芯片的角色要理清楚:

MAX96763是串行器,放在摄像头模组那一端,也就是远端。它负责把摄像头sensor输出的MIPI CSI-2或者并行数据转换成GMSL2高速串行信号,同时把远端设备的I2C、UART数据复用进链路的控制通道里。MAX96763本身也有一颗内置的MCU寄存器空间,可以通过back-channel被主机远程访问,这是调试远端寄存器非常方便的地方。

MAX96752F是解串器,放在主机端。它接收同轴电缆上的GMSL2串行信号,还原出MIPI CSI-2视频数据给主机SoC,同时把控制通道里的I2C、UART数据分离出来,通过本身的I2C接口和UART接口和主机MCU相连。

打个比方,MAX96752F像是主机侧的“翻译官”,负责把主机MCU说的话封装进控制通道发出去;MAX96763是远端侧的“翻译官”,负责把控制通道里的内容解出来交给远端设备。两边都配置对了,主机和远端之间就像有一条看不见的虚拟串口线。

另外要注意,GMSL2同一颗解串器可以接多个串行器,常见的是四通道,也就是一颗MAX96752F的配置加上三颗其他解串芯片组合成四路环视,但每路都是一对一的串行器配置逻辑,串口通信的配置思路完全一致。

1.3 整体系统架构与数据流向

把这个项目的系统框图在脑子里过一遍:

主机MCU(比如STM32H7或者带UART的SoC)→ MAX96752F(解串器)的UART0引脚 → 同轴电缆back-channel → MAX96763(串行器)的UART0引脚 → 远端云台控制MCU。

主机MCU的另一路UART接到MAX96752F的I2C接口,用来初始化和实时监控链路状态。摄像头sensor的MIPI信号进MAX96763,MAX96763的GMSL2输出通过一个bias-T电路和PoC供电叠加在同轴电缆上,远端供电也从这根线上解出来。

这里有一个很多新手会搞混的点:主机MCU用I2C访问MAX96752F和访问远端MAX96763的方式不一样。访问本地的MAX96752F就是普通I2C读写,地址一般是0x80(8位写地址)。访问远端的MAX96763和它下面的其他I2C从设备,需要先通过MAX96752F做地址映射,把一个本地的I2C地址映射到远端设备上,之后主机MCU对这个本地地址的I2C操作,MAX96752F会自动通过back-channel转发到远端的ID对应芯片上。串口通信不需要做地址映射,因为UART就是一个点对点的通道,配置好enable和路由就行。

2. 硬件设计与PoC供电方案

2.1 GMSL2链路速率与线材选型

做一个GMSL2项目,首先得确定视频带宽需求,再决定GMSL2的link rate。MAX96763和MAX96752F都支持GMSL2的1.5Gbps和3Gbps两种速率。3Gbps通常对应对称的摄像头输入,比如1080p30或720p60这种量级的MIPI数据;1.5Gbps对应更低的分辨率或者非对称的更低带宽。这个决定直接关系到线缆的选型和PoC器件参数。

车载项目里绝大多数用的同轴线是75欧姆单芯同轴线,也就是常见的FAKRA连接器配合RG174或更细的线缆。如果使用屏蔽双绞线STP这种差分对模式,连接方式和寄存器配置都会不一样,一般单芯同轴更常见。选线材时,我踩过一个坑,便宜的倒车摄像头线缆标称3GHz带宽,实际使用中发现高频衰减明显,3Gbps模式下眼图张不开,最后降级到1.5Gbps才稳定。所以GMSL2项目放线束阶段就要给线缆供应商明确S参数要求,让链路预算留够余量。

同轴线的特性阻抗在链路中非常重要,GMSL2是高速串行信号,75欧姆阻抗不匹配的地方会有反射。FAKRA连接器、线缆、板端座子都要保证75欧姆连续性。走线时从MAX96752F输出到连接器这段,也要计算阻抗控制,不能拍脑袋走。

2.2 PoC供电的实现方法

PoC的全称是Power over Coax,通俗讲就是电源信号叠加。电源是直流,信号是高频,直接用电容和电感就能把它们分开。

电路结构分为两部分:发送端和接收端。

发送端(接近MAX96752F的一侧)在同轴信号路径上要串联一个AC耦合电容,用来隔直流,同时把直流电源通过一个电感(bias-T电感)馈入同轴线的中心导体。接收端(接近MAX96763的一侧)的同轴输入也要一个AC耦合电容,把高频信号耦合给MAX96763,直流通过另一个电感取出来作为摄像头的供电。

电容选型上,信号路径上的耦合电容一般选100nF到220nF,封装0402或0603,材质要求C0G或者X7R,注意耐压要够,尤其是供电电压超过5V时。不能随便拿个电容就上,有些电容的谐振点落在工作频带内,会造成信号严重凹陷。

电感选型是整个PoC电路里最容易出问题的地方。电感要满足三个条件:

  • 自谐振频率要明显高于GMSL2的工作频率。3Gbps速率下信号能量到1.5GHz甚至更高,电感如果自谐振在这个频段就废了。所以要选高自谐振频率的电感,比如村田LQW18A系列,自谐振频率能到3GHz以上。
  • 额定电流要大于摄像头模组最大工作电流。比如摄像头+云台电机瞬时电流能到500mA,那电感额定电流至少留30%以上余量。
  • 直流电阻要尽量低,线缆本身就长,电源远端压降不能忽略。电感的DCR如果超过1欧姆,长线供电时压降会很明显。

把电感和电容组成的bias-T电路放在靠近连接器的位置,而且要尽量靠近同轴线的信号入口,保持路径短,减少寄生参数。实测下来,电感离连接器远超过2cm,信号反射就会变差,眼图质量下降。

2.3 UART接口电平与外围电路

MAX96752F和MAX96763的UART引脚一般是1.8V或3.3V电平,车规环境里通常还要做ESD保护和电平转换。

主机MCU如果是3.3V供电,可以直接和UART引脚互连,但要接上拉电阻。如果主机MCU是5V的,必须做电平转换,常用的有TXS0108E这种自动方向检测的电平转换芯片,或者用简单的分压加三极管。我这次用的是STM32H7的UART,3.3V电平,直连没问题,但串口线很短,板内走线不超过5cm,所以没有加额外的保护器件。如果远端设备UART接口要引出到板外,就必须加TVS管并且串一个小阻值电阻做限流,车规的BCI和ESD测试不是吃素的。

远端UART连接云台控制MCU,波特率我设的是115200,8N1格式。理论上GMSL2控制通道的UART透传支持更高的波特率,但实际调试中发现,远端MCU的中断处理能力和云台电机的实时控制要求限制了有效吞吐,115200足够用了。

2.4 PCB布局布线避坑

高频信号部分必须走阻抗控制线,GMSL2的差分对或单端信号线按75欧姆阻抗设计。这个别省,直接在叠层设计时就要考虑。

解串器和串行器的电源引脚旁边要放足够的去耦电容,0.1uF和1uF组合摆放,并且尽量靠近芯片引脚。GMSL2芯片对电源纹波比较敏感,电源纹波过大会直接导致链路失锁。

时钟走线也要注意,MAX96763外接的晶振或参考时钟的走线要短,避免和其他高频信号交叉。晶振附近不要走电源线和数字控制线,防止耦合干扰。

另外一点特别容易忽视,同轴连接器的外壳地一定要可靠接到主地平面,不能单点细线连接。车载环境振动大,连接器地不好会有间歇性的链路失锁问题,而且这种问题极难排查。

3. 寄存器配置实战:让UART穿透GMSL链路

3.1 配置前的准备:I2C探测与芯片确认

拿到板卡后的第一步,先不要急着写一堆寄存器,先把I2C通信打通。

用i2c-tools检查,默认I2C总线上应该能看到MAX96752F的地址。假设接在I2C总线1上,跑一下:

i2cdetect -y 1

如果你看到0x40(7位地址)或者0x80(8位地址)出现,说明解串器的I2C接口是通的。有些板卡的I2C地址引脚接了上下拉电阻,地址会有偏移,正常现象,记录下来就行。

先读一下芯片ID确认型号:

i2cget -y 1 0x40 0x0006 0x00

0x0006寄存器通常存放芯片的device ID,读到0x4F或0x52之类的值,再对照数据手册确认。如果你读到的值是0x00或者0xFF,先不要慌,可能是芯片处于复位状态或者I2C地址被别的东西占用,排查一下硬件连接。

对MAX96763的访问,在链路没建立之前,主机是看不到它的。只有先把MAX96752F配置好,使能GMSL2链路,并且把远端串行器的I2C地址映射到本地,才能用i2cget去读MAX96763的寄存器。

3.2 建立基础GMSL2视频链路

UART要跑通,前提是视频链路已经建立。这里给出一个最简初始化流程,地址和位域含义请务必对照你手里那块芯片对应版本的数据手册,不同版本寄存器地址可能存在差异,但流程框架是通用的。

第一步,复位解串器。写入0x0000寄存器的复位位,一般bit7写1触发软复位。此时要注意,复位之后芯片寄存器会恢复到默认值,所以复位之后需要等待一小段时间再继续配置。

第二步,配置GMSL2速率。3Gbps模式下需要把link rate相关的寄存器位设对,通常涉及0x0010到0x0013这几个PHY配置寄存器,具体要看手册里的“GMSL2 Link Rate”章节,一般有一个表,写着1.5G和3G对应的寄存器值。

第三步,配置线缆补偿。GMSL芯片都有均衡器,用于补偿长线缆的高频损耗,寄存器一般是0x0002或者0x0003附近,需要根据线缆长度调整。短于1m可以设为自动模式或者较小的均衡值;2m以上建议手动增大均衡值,直到眼图质量最佳。这个值调不好,最常见的表现是链路能锁定但是偶尔闪断。

第四步,使能链路。把MAX96752F的link enable位写1,同时确保远端串行器MAX96763上电并进入接收状态。GMSL2链路一旦建立,锁存状态寄存器就会显示LOCKED。

用命令验证链路状态,假设MAX96752F本地地址0x40,LOCK状态寄存器的地址查手册,一般是0x001A,读出来bit0如果是1就表示链路锁定:

i2cget -y 1 0x40 0x001A 0x00

如果看到0x01,说明物理链路已经稳定。只要LOCKED没有置位,后面的UART配置全白搭,因为控制通道根本不通。

3.3 远端芯片的I2C地址映射与访问

视频链路建立后,还需要做一步关键操作:把远端MAX96763的地址映射到主机I2C总线上。

GMSL2的做法是:通过解串器的寄存器组配置一个“remote address”。主机访问这个地址时,解串器会把请求通过back-channel转发给远端的串行器。

以项目中的配置为例,把MAX96763映射到本地地址0x62(7位),写地址就是0xC4:

# 设置远端I2C地址映射,具体寄存器位按手册 i2cset -y 1 0x40 0x0040 0x62 # 例如,这只是示意,实际寄存器以数据手册为准

设置完后,用i2cdetect重新扫描,如果总线多出0x62,说明远端访问已经打通。这一步通了,基本就成功了一大半,因为远端UART配置和普通I2C寄存器读写一样,都是通过这条路径完成的。

3.4 UART控制通道的寄存器配置

UART走GMSL2控制通道,核心是两点:使能UART映射、配置路由方向。

MAX96752F和MAX96763内部都有一组UART相关的控制寄存器,通常在0x0048到0x004B附近:

  • 使能UART to control channel。把对应位写1,芯片内部会把UART引脚接收到的数据打包进控制通道发出。
  • 使能control channel to UART。把对应位写1,芯片会把控制通道收到的远端数据从UART引脚输出。

两边必须全部使能,串口才能双向通信。这里有一个很容易犯的错,只在解串器端使能了UART,远端串行器的UART没有使能,结果串口只能收到数据发不出去,排查了半天。

具体配置以本项目为例,MAX96752F端:

// 伪代码,具体地址查数据手册 // 使能本地UART到控制通道 write_reg(0x0048, 0x01); // 使能控制通道到本地UART write_reg(0x0049, 0x01); // 设置UART波特率相关位(如果寄存器区分速率) write_reg(0x004A, 0x02); // 对应115200

MAX96763端,通过映射地址0x62访问:

// 伪代码,具体地址查数据手册 write_reg_remote(0x62, 0x0048, 0x01); write_reg_remote(0x62, 0x0049, 0x01); write_reg_remote(0x62, 0x004A, 0x02);

写完后不要急着测数据,先把寄存器读回来确认写入成功。GMSL的back-channel写入是异步的,有时序延迟,写完后延时几十毫秒再读,确保值真的写进去,而不是写的时候链路抖动丢了。

3.5 USB转串口接入与回环测试验证

寄存器配置完成后,怎么验证UART通道通没通?最简单的方法是用回环测试。

先看本地方向。把主机MCU的UART TX接到MAX96752F的UART RX,然后从主机端发一串数据,看主机MCU能不能收到自己发的内容。这验证的是:UART引脚 → 芯片 → 控制通道 → back-channel → 芯片 → UART引脚 整条环是否闭合。

接着做远端回环。把MAX96763端的UART TX和RX短接,从主机MCU发数据,如果主机收到了相同的数据,说明远端UART引脚到主机端已经打通。这种回环测试几乎能排除所有配置问题。

我实际测试时,远端MCU还在开发板上没烧程序,直接在串行器板子上飞线短接了UART的TX和RX,然后用串口助手发了一串连续的0x5A,回环正常收到相同字节。那一刻基本可以确信寄存器配置没问题,剩下的就是软件协议层的活了。

3.6 与MCU工程集成的UART DMA方式

寄存器配置验证完毕,接下来就是在主机MCU的固件里把这路UART用起来。

在STM32H7上是这么处理的。UART接收那一路,配置DMA循环模式,把收到的数据放进一个环形缓冲区。UART发送那一路也走DMA,发送函数只负责把数据地址和长度告诉DMA控制器,然后启动发送,CPU完全不用等单个字节的发送完成。

这一套下来,虽然GMSL控制通道本身会有微秒级别的延迟,但对115200波特率来说完全感知不到。云台控制指令大概几十个字节,一条指令发送完的时间在1毫秒以内,控制周期没有压力。

发送侧有个小技巧。因为GMSL2控制通道的back-channel带宽是共享的,如果远端同时挂着I2C操作和UART数据流,要注意不要让两边的数据量同时飙高。我在协议层做了简单的流控,当云台指令发送时,后台的传感器轮询I2C读取会暂时让出带宽,避免关键指令延迟。

4. 常见问题与排查技巧实录

4.1 链路锁定失败:先从线材和供电压降查起

症状:MAX96752F回读LOCK状态寄存器一直是0。

排查路径:

先检查摄像头模组有没有正常上电。用万用表在远端模组的电源测试点量电压,如果电压偏低,十有八九是PoC电感压降太大或者线缆太细。我遇到过一次,线缆选了RG178这种特别细的,线阻大,远端电压被拉到3.8V,摄像头虽然能勉强启动但sensor工作异常,GMSL芯片直接不锁定。换回RG174线材,电压恢复到4.9V,链路秒锁。

再查同轴线的连接是否牢固。FAKRA连接器没卡到位的情况在实验室也经常发生,尤其是反复插拔后锁扣松动,用手一碰就接触不良。

最后看寄存器配置的速率是否匹配。MAX96763和MAX96752F的link rate配置必须完全一致,一个配了1.5Gbps另一个默认是3Gbps,永远锁定不了。这种低级错误真的发生过,排查时先对两边速率寄存器值。

4.2 LOCK正常但视频黑屏

如果链路状态是LOCKED,但是主机SoC收到的MIPI数据是黑屏,问题几乎都在MIPI配置上。

确认MAX96752F的MIPI输出lane数、时钟频率和sensor输出一致。常见的错误是sensor输出2-lane MIPI,但解串器配置成了4-lane;或者MIPI时钟极性配置反了。

用示波器量解串器MIPI输出端的差分信号,看有没有明显的数码眼图。如果数据线上一片平线,大概率是MAX96763端和sensor之间的MIPI配置有问题,GMSL链路本身是好的。

其实GMSL芯片的视频配置和UART配置是独立的,黑屏一般不影响UART通信。反过来也一样,UART通信失败不影响视频。这个独立性可以当做一个很好的隔离手段,当链路状态异常时,先把视频功能禁用,只保留控制通道,逐层排查。

4.3 UART只有发送没有接收

症状:主机发数据给远端,远端收不到;但远端发数据给主机,主机能收到。

这是典型的单方向使能问题。排查时先看远端MAX96763的UART到控制通道的使能位是否写入成功。有可能是映射的远端I2C地址没写对,导致远端寄存器操作失败,看起来是写成功了,实际写到了空气里。

我的做法是:配置完成后马上把寄存器的值读回来核对一遍,尤其是远端寄存器的回读,确认数值和写入的一致。如果读回来是0x00,说明写入根本没有生效,检查远端I2C映射和back-channel是否稳定。

另一个原因是波特率不匹配。GMSL2的UART透传要求两边波特率一样,而且建议不要靠自动波特率检测,老老实实把波特率寄存器位写死。手动配错一位,整个数据全乱码。

4.4 实验台上的串口数据偶发丢字节

这个问题困扰了我一天。回环测试一切正常,但接入远端MCU后,数据就有少量丢包。

一开始怀疑波特率不够精确,查了时钟源发现都在误差范围内。后来用逻辑分析仪挂在MAX96752F的UART引脚上,抓取波形,发现RX引脚上有毛刺。一查原理图,发现UART RX引脚没有做上拉,当远端MCU复位后,引脚处于高阻状态,线路上的噪声直接引入干扰。

解决方法是把远端MCU发送脚的初始状态设成高电平,并且在UART RX线上加一个10k欧姆上拉电阻到3.3V。之后丢包问题彻底消失,逻辑分析仪上的毛刺也没了。这个问题在普通UART直连场景也有,但在GMSL链路里会更隐蔽,因为控制通道内部有协议转换,物理层的抖动经过GMSL芯片后可能被放大。

4.5 问题排查速查表

现象直接原因排查/解决手段
LOCK始终为0差分信号不平衡、远端供电不足、速率配置不一致万用表量远端电源;示波器看同轴线波形;核对速率寄存器
视频正常但UART完全不通两边UART使能位没配对回环测试定位断点;回读寄存器的值
串口只能发不能收远端UART到控制通道方向没使能检查远程I2C映射;回读远端0x0048类寄存器
数据偶发丢包引脚悬空、电平不匹配、干扰增加上拉电阻;检查TX/RX电平;逻辑分析仪抓波形
远端模块间歇性失联连接器松动、线缆弯折导致反射换线缆对比测试;检查FAKRA连接器卡扣
PoC供电不稳电感饱和、电容自谐振更换大电流电感;检查耦合电容谐振频率

4.6 调试工具与效率技巧

GMSL链路调试,我离不开三样工具:i2c-tools、逻辑分析仪、示波器。

i2c-tools用来快速验证寄存器配置,批量按顺序初始化时,写成shell脚本逐个执行,比在MCU固件里反复编译烧录快得多。脚本里每写一个寄存器,读回来打印核对值,这样即使某个步骤出错,也能定位到具体寄存器。

逻辑分析仪挂在UART端,同时抓UART和使用I2C工具的终端输出,对比时间戳,能很直观地看到整个初始化流程是不是卡在某个I2C读写上。

示波器用来看同轴线上的信号波形。用高阻探头在同轴连接器后端量信号,可以看到有没有严重的过冲和振铃。如果波形上有明显的长尾振铃,多半是阻抗不匹配或者PoC器件选型不当。眼图虽然不那么标准,但大致能看出信号质量好坏。

调试效率方面有个经验:把一套能正常工作的寄存器序列保存成文本文件,按芯片和板卡单独命名存档。版本升级时,用diff对比不同版本寄存器差异,能快速定位芯片驱动升级引入的行为变更,也方便把板卡硬件改版前后的寄存器值做比对,排查硬件问题。

5. 项目中积累的几点核心经验

这次项目最大的收获,是理解了GMSL控制通道的带宽不是免费的午餐。UART数据占用的是控制通道的带宽,这条通道同时还要承载I2C的commands,如果I2C访问频率过高,比如每毫秒轮询一次远端传感器,UART数据的实时性会受到影响。我在系统层做了一个简单的仲裁机制:传感器轮询I2C每隔5毫秒才做一次,云台UART指令的优先级更高,保证控制指令不被I2C流量阻塞。

另外有一个经验是关于固件版本的。GMSL芯片的数据手册更新频率不低,同一颗芯片的不同批次寄存器默认值都可能不一样。调试时如果发现寄存器写入后行为不符合预期,先去官网下载最新版数据手册,对照勘误表看看有没有已知问题。我遇到过一次,芯片手册旧版写的某个寄存器是“保留”,新版手册才说明该位必须写1,否则UART功能不工作。

最后再说一下GMSL链路的长期可靠性验证。实验室调通只是第一步,车规环境里温度、振动、线束老化都会影响链路质量。建议做长期拷机测试,跑一整天的串口数据收发,统计丢包率和错帧率,同时监控LOCK状态和误码率统计寄存器。这个数据能反映真实工程化水平,也是后续做PPAP和客户演示时最有说服力的证据。

如果后续还要在这个项目上扩展,可以考虑用GMSL控制通道跑更上层的协议,比如把UART数据封装成私有协议做远程固件升级,或者直接用GMSL2的GPIO功能远程控制远端设备的信号灯、复位脚。整个系统从单纯的视频传输,进化成集视频、控制、供电、升级于一体的综合链路,这才是GMSL方案在车载项目里真正的价值所在。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询