ARTICLE DETAIL

资讯详情

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

MIPI多路合一实战:从物理层信号完整性与协议层VC映射到FPGA实现

MIPI多路合一实战:从物理层信号完整性与协议层VC映射到FPGA实现 MIPI多路合一这个需求我最近半年被问过不下十次。每次有人找我推荐“MIPI多路合一的转接线”我都会先反问一句你要的是物理上的并线还是协议上的合流很多人被问住然后说“反正就是把两路摄像头信号接到一个接口上吧”。问题就出在这里。MIPI多路合一从来不是普通转接线能解决的它同时牵扯高速物理层的信号完整性、协议层的虚拟通道映射、系统层的数据调度任何一个环节做不对结果都是花屏、没信号或者干脆烧接口。这篇文章我就把多路合一背后的逻辑、实现方式和踩坑经验一次说清楚适合正在做嵌入式工业设备、车载环视、多目相机接入或者想用FPGA扩展MIPI接口的工程师也适合被屏厂和模组厂坑过、想搞明白MIPI调试为什么这么难的朋友。1. 为什么“多路合一”从来不是线材问题1.1 多路合一的真实需求出现在哪里先聊聊场景。真正需要多路合一的很少是消费电子更多是嵌入式工业设备。比如一台智能巡检机器人主控用RK3588板子上一路MIPI CSI接口空闲但机器人头部要接两路甚至四路摄像头模组做实时避障再比如车载环视系统四个鱼眼镜头要同时进一颗SoC做拼接还有一些工业视觉设备一个主控要接左右两路线阵相机或者多路普通摄像头分别做检测和监控。在这些场景里主控处理器并不缺算力缺的是MIPI接口数量。瑞芯微、全志、NXP这类主流SoC虽然内部有多个MIPI CSI控制器但核心板引出来的物理接口往往只有一路或者两路接口不够用就成了瓶颈。于是“多路合一”这个词就被提出来了。我遇到过一个做智能巡检的同行第一版方案想省钱买了根标称“MIPI一公两母转接线”来把两路摄像头并联到一个接口上。结果上电以后示波器看波形整个高速差分线上全是串扰和毛刺接收端完全没有同步信号。后来他换了一块自己画的合流小板还是不行直到把物理层和协议层分开看才一步步解决。1.2 转接线与合流板之间的本质差异普通转接线能做什么它只能做物理接口转换和线序匹配。比如A板是30pin的MIPI连接器B板是22pin的FFC软排线转接线把pin定义一一对应起来仅此而已。线材本身是一个无源通道它不改变信号内容也不负责数据组织。多路合一是另一回事。两路摄像头的数据都是连续的、带时序的高速串行流各自有独立的时钟、帧起始、行起始和数据包。你想让它们共用一组差分线就得有一个器件来调度要么直接丢弃一部分数据这在视频场景里是灾难要么用更高带宽的通道把多路数据在时间上交织、加上虚拟通道标识发送出去。这个活在芯片领域叫桥接或者聚合市场上有一类专门的MIPI聚合/桥接芯片还有一类用FPGA自行实现。所以多路合一的本质是在物理层之外附加一个协议层的重组过程。转接线是焊一焊就能用的东西合流方案是一个需要设计、仿真、调试的子系统。这一点必须在一开始就拎清楚不然后面的工作量全是白费。2. 物理层先把带宽和信号完整性算明白2.1 用带宽计算判断方案可行性做多路合一第一个要算的不是线序而是带宽。MIPI D-PHY每一lane的速率常见在1Gbps到1.5Gbps之间四lane就是4Gbps到6Gbps八lane可以到8Gbps到12Gbps。但这只是物理层的链路速率去掉8B/10B或者协议开销实际有效带宽要打个折扣。拿一路1920x108060fps、RGB888的摄像头来算像素时钟约148.5MHz每个像素24bit有效数据率就是148.5M × 24约3.56Gbps。这还没算行消隐和帧消隐算进去之后大约要3.8Gbps到4Gbps的原始带宽。所以单路1080p60就已经吃满四lane在1Gbps下的大部分带宽了稍微有点余量就得上更高频率的lane。再把需求变一下两路1080p60合成一路总带宽需求直接翻倍到7.6Gbps以上。这时候四lane D-PHY已经不够用你要么用八lane要么改用C-PHY的物理层。C-PHY用三线编码不需要单独的差分时钟线同样的引脚数能跑比D-PHY更高的有效吞吐这也解释了为什么现在新的手机相机模组很多都转向C-PHY。我的建议是动手之前先把分辨率、帧率、色彩深度、消隐比例列成一个表算出总带宽再对照目标SoC支持的lane数和物理层类型。如果带宽算出来已经很勉强就别想着用转接线碰运气了直接走FPGA加高带宽PHY的方案。2.2 PCB同层挖空与差分阻抗到底在防什么带宽有富余物理层信号完整性做不好一样白搭。很多人在MIPI调试里见过“横向花屏”“间歇性花屏”“只有上半屏正常”这类毛病根因大多是信号边缘变差了接收端采样窗口不够。MIPI D-PHY是高速差分信号差分阻抗要求通常在100欧姆左右。PCB走线要按微带线或者带状线模型控制线宽、线距和参考平面距离。这里注意一个热词同层挖空。它的意思不是把走线所在的铜皮层挖掉而是把高速差分线附近的其它层铜皮或者说铺铜区域做挖空处理避免不相干的走线、焊盘、过孔残留引入寄生电容破坏传输线的连续性。该处理主要表现在高速信号穿越层别时参考平面必须连续否则回流路径会被迫绕行形成大面积电流环路产生辐射和地弹。我自己做过一个板子MIPI差分对走在顶层参考面是第二层完整地平面但在两个lane中间有一根低速I2C线。串扰不算大可一旦走线长度超过3cmI2C跳变沿就会在MIPI差分对上耦合出明显的毛刺导致屏偶发性闪横条。后来把I2C挪走、对MIPI区域做了同层挖空问题消失。所以多路合一方案里哪怕只是延长了走线长度也值得重新做一次阻抗和串扰仿真别拿“之前这样画没问题”来赌。2.3 线缆、连接器与S参数眼图闭合的真相PCB做对了转接线和连接器仍然会毁掉一切。MIPI的高速率意味着波长变得很短连接器引脚上的一个分支stub就有可能是传输线上不可忽视的不连续点。正规的MIPI转接线缆会用对绞结构、屏蔽层、阻抗匹配的专用连接器而不是普通杜邦线或者扁平排线。很多“MIPI多路合一转接线”把四对差分线全部挤在一个FFC排线里线间距、屏蔽、回流都做不到位插上去之后信号反射严重眼图直接闭合。评估线缆或合流板能不能用最靠谱的手段是看S参数。高速差分通道的插入损耗和回波损耗是核心指标理想情况下插损要平缓回波损耗在目标频率段要尽量低比如在1.5GHz下小于负15dB。很多工业级转接线会给出实测曲线淘宝十几块钱的转接线基本什么都给不出来因为它根本没做过验证。我自己在调试时会在合流板上预留SMA测试点用眼图仪或者示波器看接收端的眼高和眼宽如果眼高不到规范的70%就别指望协议层能挽回。3. 协议层组合数据的核心机制3.1 CSI-2的Virtual Channel如何承载多路数据物理层搞定之后就要处理协议层面怎么把多路数据“合”进来。MIPI CSI-2协议本身就置了一套虚拟通道机制Virtual Channel简称VC。每个数据包头里有一个两比特或者四比特的VC ID最多可以区分四路或更多虚拟通道的数据。多路合一的经典做法不是把两路摄像头的原始比特流强行拼在一个物理通道里而是让两路数据在发送端被标记成不同的VC ID然后在同一个高速链路上分时传输。摄像头A的数据包带着VC0摄像头B的数据包带着VC1接收端根据包头里的VC ID把数据分发到各自对应的图像缓冲。这样协议层就完成了一次逻辑上的“合一”物理链路上跑的仍然是一条完整的数据流。但这里有个关键两路摄像头的像素时钟、帧率可能不相同组合数据需要同步和仲裁。例如一路是30fps 1080p另一路是60fps 720p它们的行有效时间不一样必须在合并时用FIFO做缓冲以输出端的字节时钟为基准把两路数据按时间片交替发送。一旦仲裁算法写得不好低优先级的摄像头就会出现丢帧表现为视频卡顿或者最后几行被截断。我自己用FPGA实现时给每路加了128行的行缓冲再按输出带宽占用率做动态仲裁实测下来比固定时间片丢帧率低很多。3.2 DSI多路合并与屏幕拼接的差异摄像头走CSI屏幕走DSI。MIPI DSI的“多路合一”逻辑和CSI不太一样它更多出现在多屏拼接或者高分辨率单屏需要多个DSI控制器并联的场景。拿一个1920x1080屏但主控只有两路四lane DSI接口来说每路D-PHY带宽不够驱动整个屏幕就拆成左右两半左半屏走DSI0右半屏走DSI1。这两路数据必须严格同步包括像素时钟、水平同步、垂直同步否则屏幕中间会出现一条撕裂线。DSI-2协议里的multi-link机制就是为这个场景设计的让多个DSI输出可以作为一个统一的显示管线来运行。如果你只是想把两块独立的屏幕接到同一个SoC上那其实没什么“合一”必要正常来说SoC的DPHY控制器都支持两个独立的DSI接口各自初始化各自的屏就行。需要合一的往往是带宽不够、接口不够这种硬约束。做屏幕并联时很多工程师忽略了一个问题两块屏的初始化序列不一定完全一样必须各自执行初始化然后再同时送显示数据。我见过有人在两块屏上写了同一份初始化代码结果其中一块花屏排查半天才发现是屏型号一样但生产批次的寄存器配置不同。3.3 用FPGA实现多路合一的完整流程如果不想受限于现成的桥接芯片用FPGA做MIPI多路合一是一条很常用的路难度中等偏上但灵活性很高。整个实现分成四层物理层、解包层、合并层、发送层。物理层要搞定MIPI D-PHY的收发很多FPGA厂商有硬核或者软核IP比如Xilinx的Vivado里可以用MIPI CSI-2 IP或者自己用ISERDES/OSERDES加差分缓冲器实现RXDDR/RX系列引擎。物理层只要真伪就是LP和HS两个状态切换LP是低速控制信号HS才是高速数据传输。新手最容易卡在LP/HS切换时序上切换时间、先导码长度都写在PHY协议里差一个cycle都不行。解包层的工作是把物理层收到的D-PHY字节流还原成协议包提取出包头、像素数据、包尾并且识别出当前包属于哪个VC。合并层是核心内部是一个多端口FIFO加仲裁器各路视频流在这里重新排队。发送层则把合并后的数据重新打包成CSI-2包从另一个D-PHY接口发出去。我用一片XC7A35T做过两路1080p30到一个四lane输出的方案。输入分别是两路四lane MIPI摄像头输出到一颗支持四lane 1.5Gbps的SoC。内部数据通路用了32bit AXI-Stream像素时钟大约74MHz行缓存用了BRAM整个设计的LUT占用大约45%BRAM占用接近70%。如果路由超出这个规模建议考虑更大的芯片。有一点必须提醒FPGA内部的时钟域很复杂输入像素时钟、输出字节时钟、系统时钟三个域之间必须做异步FIFO和跨时钟域处理千万别图省事直接用全局时钟。3.4 RK3588这类主控在1080i信号上的坑很多RK3588项目的人搜过“MIPI输入1080i信号”这个热词。这里有个容易混淆的概念RK3588的MIPI CSI-2接口是标准的逐行扫描接口它根本不理解隔行信号。所谓1080i信号通常来自旧的模拟摄像头或者SDI转MIPI的转换盒这类信号送到CSI接口之前必须已经在外部完成去隔行处理把1080i转成1080p逐行再打包成MIPI包。如果你直接在CSI接口上看到“1080i”的字样别以为是主控支持隔行多半是采集卡芯片内部已经做了去隔行输出的是逐行流。项目上如果碰到隔行摄像头我建议的方案是选一颗带去隔行功能的视频桥接芯片输入CVBS或者SDI输出MIPI CSI-2逐行信号。去隔行的算法有bob和weave两种bob算法延迟低但垂直分辨率损失weave算法画质好但运动场景容易产生毛刺。工业检测设备对延迟敏感选bob居多安防监控对画质敏感选weave居多。这个决策要在总体设计阶段就确定不然等到FPGA里做去隔行就太被动了行缓存资源多出好几倍。4. 调试实录从“没信号”到“横向花屏”4.1 先用测试图案排除物理层问题MIPI调试最难的一点是问题链路很长摄像头、屏、线缆、PCB、主控驱动、初始化序列都可能是嫌疑犯。我的调试顺序永远是先物理层再协议层最后再怀疑驱动和应用。可以用图形发生器让SoC或者FPGA输出纯色测试图案比如全红、全绿、全蓝、黑白竖条纹。如果屏上显示的是纯净的竖条纹说明MIPI物理链路和DPHY配置基本正常如果出现横条闪烁、颜色偏色、画面晃动就说明高速链路不稳定优先检查差分阻抗、线缆长度、连接器接触。我测过一根劣质MIPI软排线插上以后全红画面里隐约有横线用手轻轻一掰排线横线还会移动换了一根带屏蔽的型号就正常了。竖条纹能显示但颜色不对那大概率是颜色编码格式没对齐。MIPI的RGB888、RGB666、RGB565包头里的data type字段不一样屏端按自己支持的格式解包If发的是RGB888屏驱动按RGB666解析颜色就会错乱。最好在像素格式上统一用16bit或者24bit然后再去核对寄存器。4.2 st7701s这类屏驱IC的初始化序列容易踩什么雷默认系统能不能点亮屏很大程度上取决于驱动IC的初始化序列。国产屏里st7701s用得很多你搜“ST7701S MIPI”能搜到一堆初始化寄存器列表。这个东西看起来就是抄一段数组到驱动代码里实际上坑很多。第一初始化序列必须严格按照DataSheet给出的时序头来发很多屏厂给的数组是打包在二进制文件里的发之前要拆成MIPI包包含DCS short write、long write、generic long write等类型发错一个字节类型屏的状态机就乱了。第二出厂初始化序列里通常有Sleep Out命令发送之后要等120ms以上的延迟很多代码里没加延迟命令没生效屏就是黑的。第三同一型号不同批次的屏寄存器会细调比如VCOM电压、Gamma值、摆动幅度直接拿旧屏的配置点新屏可能出现色彩偏冷、偏暖或者轻微闪烁。我调试一个7寸屏时遇到横向花屏所有寄存器都对照过没问题最后发现是初始化序列里最后一位的CRC校验错了。有些屏驱动开着CRC检查任何一包数据出错整包丢弃屏幕表现就是花屏或者缺行。把CRC关掉或者修正校验值以后一切恢复正常。多说一句调屏之前先把屏的ID寄存器读出来看看能不能回读能回读代表MIPI通信链路是通的很多没信号问题不用折腾硬件就能定位。4.3 常见问题速查表这里把我实际踩过的坑整理一个速查表MIPI不管是摄像头还是屏幕排查路径基本通用。现象可能原因处理方式完全无信号上拉电阻缺失或阻值不对LP状态检测失败检查MIPI走线上的上拉D-PHY的LP模式下需要通常1.2V上拉完全无信号PHY差分极性接反P/N互换检查硬件原理图或软件里配置lane polarity翻转完全无信号时钟lane分配错误让SOC端确保时钟lane接到模组对应时钟lane不能随意映射满屏花屏差分阻抗严重不匹配信号反射用示波器看眼图检查100欧姆差分阻抗是否满足横向随机花屏数据lane间延时偏差过大用Vivado/RK平台等工具做lane deskew校准打开PHY的校准功能上半屏正常下半屏花时序参数HBP/HFP/VBP/VFP计算错误按屏规格书重新计算active区域与blanking显示颜色错乱像素格式不匹配确认RGB888/RGB666/RGB565配置一致显示有残影Sleep Out后延迟不够增加120ms以上延时检查PLL稳定时间5. 接口选型MIPI、LVDS、DVP与USB方案该如何取舍5.1 三种接口的本质区别很多人在嵌入式显示和视频接入时会纠结MIPI、LVDS、DVP到底选哪个。简单说DVP是并行总线一根像素时钟各数据线同时并行传输优点是接口简单、没有差分对缺点是高分辨率高帧率下数据线数量多、时钟频率高、抗干扰差适合低速应用LVDS是低压差分串行早期工业屏和摄像头用得多优点是传输距离比MIPI略远、抗干扰好缺点是引脚效率低因为需要独立的收发器MIPI则把控制和数据整合在一组串行差分对里同样跑1080p60MIPI只需要四lane加时钟lane共10根线而DVP可能要24根线以上。从调试角度看DVP最好调逻辑分析仪一抓都是并行信号MIPI最难调高速信号要对协议有充分理解LVDS居中。从功耗看MIPI低摆幅差分功耗最优这也是手机和平板全面转向MIPI的原因。工业设备如果追求长期可靠和可维护性我更愿意推荐LVDS或者DVP前提是分辨率不太高。5.2 什么时候应该绕过MIPI改用USB方案最近“支持USB接口的小封装芯片”成了热门搜索词原因很现实很多工业设备主控没有MIPI接口或者MIPI接口被占满了而USB是每颗SoC都有的标准外设。USB摄像头/UVC设备方案能绕开MIPI协议调试的所有痛苦即插即用驱动层面用标准UVC协议。但代价是延迟。USB传输需要考虑打包、带宽调度、缓存帧到达时会有几十毫秒的延迟波动如果做多目同步USB摄像头本身没有硬件同步机制软件同步只能做到毫秒级这对需要严格曝光的工业检测场景是个大问题。我的倾向是小批量样机、多路不同步要求不高的项目直接上USB方案简洁高效如果做车载、机器人和高精度视觉同步老老实实解决MIPI多路合一因为MIPI的低延迟和硬件同步是USB给不了的。围绕多路合一这个目标方案不是只有一条路。如果只是缺一路接口可以选带MIPI switch的桥接芯片如果带宽不做叠加只做接口切换一颗Switch芯片几百块搞定如果是做产品而非原型建议直接选带更多MIPI接口的算力平台别跟硬件较劲。很多事情的坑本质上都是在错误的方向上过度努力。这句话放到MIPI多路合一的项目里尤其合适。我在几个项目里反复确认过一件事多路合一的前期验证与其买一根转接线去赌不如先花一天时间做带宽计算和协议仿真再决定要不要上FPGA。等板子贴好了再去求一个“能用的转接线”大概率是无底洞。最后给一个很实用的小动作任何MIPI调试遇到怪问题先检查两个最容易忽略的细节一个是I2C地址和寄存器回读是否正常另一个是差分P/N极性是否翻转。这两个问题解决了MIPI项目里一半以上的“灵异现象”剩下的才值得你去翻协议手册。
返回列表