尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于XS9922B的4路模拟高清视频采集:MIPI接口调试与避坑指南

基于XS9922B的4路模拟高清视频采集:MIPI接口调试与避坑指南 最近手里一个项目要用到4路模拟高清视频采集主控端只留了MIPI CSI接口最后选型选到了国产解码芯片XS9922B。前前后后从硬件设计、驱动移植到图像调试折腾了大半个月中间踩的坑一个接一个花屏、黑屏、偏色、锁不住信号基本都遇了一遍。这篇文章就把整个过程整理出来重点围绕“如何用XS9922B的MIPI输出在SoC端稳定拿到4路高清视频”这条主线展开硬件、软件、调试一条龙讲清楚。不管你是正在选型、画板子还是已经开始调驱动这篇都值得花几分钟看完。我尽量用做工程的人之间说话的方式来讲不绕弯子把关键参数、配置思路、排查路径都摊开。文章后面专门留了一大段避坑指南这些都是常规文档里不会写、但实际项目里一定会碰到的内容。方案里涉及的具体寄存器值我不写死因为不同批次、不同封装、不同参考设计有差异我会教你按什么逻辑去配置和验证这样哪怕你用的是不同主控平台也能直接套用思路。如果你正要拿XS9922B做多路视频采集这篇文章应该能帮你省下不少时间。1. XS9922B这颗芯片到底能干什么1.1 为什么需要一颗“模拟转MIPI”的解码芯片先聊一个基础问题为什么不能用普通摄像头直接接主控现在市面上比较新的应用处理器无论是瑞芯微、全志还是其他国产物料视频输入接口通常只会保留MIPI CSI和DVP。但安防、车载领域大量存量摄像头都是模拟高清信号常见的有AHD、TVI、CVI还有老的CVBS。这些信号走的是同轴电缆可以传很远抗干扰能力强成本也低直接丢弃不现实。这就需要一个“翻译官”把模拟高清信号转成SoC能吃的MIPI CSI-2格式。XS9922B干的正是这个活。它内部有模拟前端和解码器把复合模拟信号解码成数字视频流再从MIPI接口送出去。一颗芯片可以同时接4路摄像头正好匹配车载360环视、四路行车记录、安防DVR这类典型应用。从项目角度看如果你用4个独立USB采集卡或者SDI转接方案成本高板子面积大时序同步也是问题。XS9922B这类多通道解码芯片则把所有输入统一到一个MIPI链路上SoC只需要开一个CSI控制器就能拿到全部4路画面这种集成度对量产项目非常友好。1.2 芯片关键参数与硬件形态XS9922B的核心价值是“多进单出”。输入端支持4路模拟视频兼容AHD/TVI/CVI/CVBS多种协议分辨率从960H到1080P都有覆盖。这个兼容范围很关键因为市面上的模拟摄像头品牌太多车载和安防的协议不同甚至同协议不同版本也有差异芯片能自动检测输入格式省去很多手动配置的麻烦。输出端支持MIPI CSI-2常见配置是1路时钟lane加1到4路数据lane。具体能跑到多少速率、支持几路1080P要以芯片手册和原厂支持为准不同版本会有区别。我自己验证过4路720P30是没有问题的画面流畅同步也好。芯片还带有BT.656/BT.1120这类并行输出方便接一些老的DVP接口平台。硬件形态上它是一颗普通的QFN封装芯片外围电路不复杂电源、晶振、I2C、MIPI差分对、模拟输入端口基本就这些。小尺寸封装对板子面积紧张的车载摄像头主板来说算是个优点。工作温度范围覆盖工业级车载项目直接可以用。具体功耗我没有单独测过整颗芯片初步估算在几瓦量级散热压力不大但长时间高温环境还是要留意。1.3 常见应用场景和方案选型逻辑XS9922B最常见的落地场景就是车载360环视。车头、车尾、左右后视镜各放一颗模拟摄像头四路信号汇总进XS9922BMIPI输出到车机SoC做拼接和畸变校正。这种方案成本远低于数字摄像头方案而且模拟摄像头在强光、逆光环境下的表现比较稳定这是行业里大量使用的原因。另一个场景是安防和工业检测。仓库监控、工地监控、工业产线的多路画面采集很多时候不需要太高的分辨率720P已经够用但要求路数多、延时低、布线简单。用同轴线一根线走几十米远距离供电也容易做PoC。此时XS9922B这类解码芯片就成了性价比很高的选择。还有一类比较有意思的场景是配合边缘计算盒子做多路视频分析。SoC本身只跑AI算法视频采集用这颗解码芯片搞定软件上按虚拟通道区分4路画面。选型时有个逻辑可以分享先定主控平台的MIPI CSI能力再看解码芯片输出的lane数和速率是否匹配最后确认每路视频的分辨率需求。顺序反了容易出现选了一颗很强的解码芯片结果主控接不住的尴尬。2. MIPI接口与视频链路先弄懂再动手2.1 MIPI CSI-2到底是怎么传视频的MIPI CSI-2是摄像头串行接口标准物理层走D-PHY。它和并行接口最大的区别在于数据和时钟都使用差分信号对传输抗干扰能力强速率高布线也省。一个MIPI CSI-2链路包含1对时钟lane和1到4对数据lane数据lane越多同一时间能传的数据量越大。D-PHY有高速传输和低功耗两种模式。传输视频像素数据时用高速模式时钟lane持续输出时钟传输控制信息时用低功耗模式时钟可以停。这里有个常见坑很多SoC的CSI控制器需要配置“连续时钟”还是“非连续时钟”。如果芯片实际输出是连续时钟而你在dts里配成了非连续就会导致信号锁不住。视频数据在MIPI链路上是按包头、数据类型、像素数据、包尾这样的结构组织的。CSI-2协议里有个虚拟通道的概念一个物理链路上最多可以传4个虚拟通道的数据。XS9922B四路视频输出正好对应虚拟通道0到3SoC端按虚拟通道区分画面。理解这一点对后面排查“图像串路”很有帮助。2.2 从模拟摄像头到MIPI输出的完整数据流整个数据通路可以拆成几段理解。首先是模拟前端每路模拟信号进入芯片后先做箝位和AD转换把模拟电压变成数字信号。接着是解码器负责把AHD、TVI这些协议中调制过的视频数据解出来恢复成完整的YCbCr图像。解码之后芯片内部一般还会做去隔行、缩放、色彩空间转换等处理。这是因为模拟高清信号通常按隔行方式传输而MIPI输出端希望拿到逐行数据。如果主控看到画面有横向梳齿状条纹多半就是去隔行没有配置好。最后经过处理的各通道视频数据按照CSI-2协议组包在时钟lane的节拍下由数据lane逐字节发送出去。SoC端的MIPI CSI控制器负责接收这些串行数据再把它们还原成并行视频数据写入内存。整套链路里任何一段出了问题最终都表现为图像异常后面排查部分我会逐个讲。2.3 分辨率和lane数怎么算才合理配置MIPI lane数和数据速率时如果心里没谱很容易把速率配得过高或者过低。这里给一个估算方法像素率等于分辨率横向乘以纵向再乘以帧率。以720P30为例1280乘720乘30大约是27.6M像素每秒。像素率乘以每像素位数就是原始数据率。YUV422格式每像素16bit所以原始数据率约443Mbps实际还要加上行场消隐和协议头尾开销按20%~25%折算实际链路速率大约在550Mbps上下。也就是说一路720P30差不多要占500多Mbps。如果4路全部是720P30总数据率大约2.2Gbps。使用4条数据lane时每条lane大约承担550Mbps这个速率在D-PHY规范里处于很舒服的区间。但如果是4路1080P30总数据率就会接近8Gbps普通4lane D-PHY已经撑不住必须确认芯片和SoC是否支持更高规格。我自己项目里就是用4路720P30配4条lane余量很充足。提醒配置dts里的lane速率时宁可高估一点也不能低估。估算不足会导致帧率上不去出现卡顿、丢帧而且这类问题在抓包时不一定能一眼看出来。3. 硬件设计实战电路与PCB的关键细节3.1 最小系统搭建要注意什么XS9922B的硬件最小系统包括电源、晶振、复位、I2C、模拟输入和MIPI输出。电源方面芯片内部通常有模拟电源和数字电源两类引脚设计时建议用磁珠把模拟电源和数字电源隔开避免数字开关噪声窜入模拟前端。每个电源引脚旁边都要放0.1uF去耦电容靠近引脚摆放这是老生常谈但我在实际项目中真见过因为电容放远了导致画质有斜纹的情况。晶振一般用27M或25M具体频率跟着芯片参考设计走。晶振旁边要配负载电容匹配不好会导致起振不稳进而影响MIPI时钟质量。起振后用示波器看波形幅度和频率确认在规格范围内再往下调。复位电路最容易忽略。有些芯片对复位时序有严格要求必须先供电、时钟稳定再释放复位。太简单的做法是复位脚直接接一个RC延时但在复杂系统里建议用SoC的GPIO控制复位这样软件可以精确控制时序调试时还能随时复位芯片方便验证。I2C上拉电阻接入对应电平域上拉到1.8V或3.3V根据主控和芯片IO电平来定。3.2 MIPI差分走线和布局经验MIPI信号是高速差分信号PCB布局布线非常重要。两条差分线之间要保持等长长度差控制在几十mil以内这个精度在常规PCB工艺下完全可以做到。差分对要做100欧差分阻抗控制这要求叠层设计时提前规划好介质厚度和线宽线距。走线要尽量短从芯片引脚到连接器或者SoC引脚之间不要绕远。差分对尽量走同一层避免打过孔换层如果必须换层需要在换层位置加回流地过孔保证参考平面连续。MIPI差分线要远离晶振、时钟芯片、电源转换芯片等干扰源特别是不能和它们平行长距离伴走。时钟lane要特别照顾。时钟lane是整套MIPI链路的基准信号质量差一点整条链路都会受影响。曾经遇到过板子打样回来后MIPI信号总是不稳定后来用示波器发现是时钟lane太靠近一个DCDC电感串扰严重。调整走线后问题消失这种问题在原理图阶段很难发现只能靠布线规范来规避。3.3 模拟输入端的匹配与保护模拟视频输入端的处理直接关系到画质。标准模拟视频传输特性阻抗是75欧所以芯片每个模拟输入引脚对地要接75欧匹配电阻。这个电阻如果省了长线传输时信号反射会特别明显画面上出现重影和振铃。ESD保护器件建议加但选型要慎重。很多ESD保护管引脚电容较大对高速视频信号来说会影响边沿质量。选择低电容ESD器件尽量靠近输入连接器放置。这样既起到保护作用又不至于让信号恶化到影响解码。输入端还可以考虑串入共模电感或者磁珠抑制共模干扰。特别是车载环境电机、发电机等设备带来的共模噪声会让画面上出现横纹或者噪点。不用每个项目都加但做车载项目时建议预留位置调试时有需要再贴。3.4 电源和地平面的处理模拟视频对电源纹波极其敏感。AVDD上如果有一点点高频纹波画面上就会表现为周期性横条纹。实际排查过一例用示波器量AVDD纹波有30mV以上画面在暗场景下能明显看到滚动条纹最后在电源路径上加了一个PI型滤波纹波压到10mV以内画面才干净。地平面设计的关键是保持完整不要让MIPI差分信号跨过地平面分割区。如果不得以必须跨区也要确保两侧地平面有足够的缝合过孔连接。模拟地和数字地之间可以单点连接或者用磁珠连接但具体策略视整体系统而定不要无脑把地全劈开那样反而容易造成回流路径不连续。电源走线要加宽避免因为走线阻抗导致供电跌落。多路模拟通道同时工作时电流并不小走线上压降过大会让芯片工作电压偏低进而影响信号幅度和画质。Layout完成后可以大概估算一下各路电流和走线长度心里有数。4. 软件配置让4路图像真正跑起来4.1 先确认I2C通道和芯片地址硬件回来后第一步不是写驱动而是确认I2C能读到芯片。使用Linux系统时先用i2cdetect扫描I2C总线上有哪些设备。扫描命令类似i2cdetect -y 0如果总线上有XS9922B一般会显示一个设备地址在列表中。需要注意的是芯片的I2C地址可能有多根地址引脚控制也可能是固定地址不同封装版本不一样。确认地址后再用i2cget读取一个寄存器验证通信例如i2cget -y 0 0x40 0x00能正常读到数值说明I2C通信没问题可以进入初始化阶段。如果读不到先检查地址对不对再看I2C上拉电阻、电平匹配。曾经遇到过主控和芯片I2C电平域不一致芯片地址完全扫不到加了电平转换电路后解决这类硬件问题在原理图阶段就要留意。4.2 初始化序列与常见寄存器配置思路初始化序列通常是原厂提供的不建议自己凭空想象寄存器怎么配。但拿到的初始化序列往往是一长串I2C写操作需要理解它分哪几类方便调试时定位问题。大致上寄存器分为四类系统控制类、输入检测类、输出格式类和MIPI发送类。系统控制类包括软复位、时钟选择、芯片工作模式。输入检测类负责选择每路输入的信号协议和分辨率有些芯片支持自动检测但为了系统稳定我更倾向于手动指定避免自动检测在某些边界场景下出错。输出格式类确定输出分辨率、帧率、色彩空间和虚拟通道分配。MIPI发送类则设置lane数、时钟极性、连续时钟还是非连续时钟。配置代码可以用一个简单的I2C读写函数来执行初始化序列static int xs9922b_write_reg(struct i2c_client *client, u8 reg, u8 val) { int ret; struct i2c_msg msg; u8 buf[2] {reg, val}; msg.addr client-addr; msg.flags 0; msg.len 2; msg.buf buf; ret i2c_transfer(client-adapter, msg, 1); if (ret 0) return ret; return 0; }初始化序列执行完毕后再回读一些关键寄存器确认芯片状态。如果某个输入通道的信号没有被识别寄存器里通常会有一个锁定状态位可以查看。调试时时刻关注寄存器里的状态位比直接看图像更省时间。4.3 SoC侧的MIPI CSI驱动配置芯片这边配置好SoC这边还得同步配好MIPI CSI控制器。以常见的嵌入式Linux平台为例设备树中会有一个csi节点需要配置数据lane数量、时钟连续模式、数据极性、最大分辨率、像素格式等。一段典型的设备树配置片段如下csi2 { status okay; lanes 4; clock-continuous; >media-ctl -p如果链路中各个节点都显示“active”说明MIPI信号已经能被接收可以进入抓帧阶段。4.4 抓帧验证与图像自检确认链路建立后就可以抓帧验证。v4l2-ctl是Linux下常用的抓帧工具先列出可用设备v4l2-ctl --list-devices找到对应的video节点后设置格式并抓取一帧v4l2-ctl -d /dev/video0 --set-fmt-videowidth1280,height720,pixelformatYUYV v4l2-ctl -d /dev/video0 --stream-mmap --stream-count1 --stream-toframe.raw抓下来的raw文件可以用ffmpeg转换或直接用于查看ffmpeg -s 1280x720 -pix_fmt yuyv422 -i frame.raw -frames:v 1 out.jpg看到图像后先确认四路画面都能正常显示再观察分辨率、颜色、帧率是否正常。如果图像正常那么整个通路基本打通。接下来的问题往往是细节层面的比如某一路不亮、颜色偏、偶尔丢帧这些就进入排查阶段了。5. 避坑指南我踩过的坑和排查思路5.1 花屏、雪花、横纹先查电源再查匹配现象画面一片雪花或者有很多横纹像是信号不好。这时候很多人第一反应是摄像头坏了或者线太长但实际项目中有一半以上是电源问题。排查思路先用示波器看芯片各路电源的纹波特别是模拟电源。纹波超过20mV就要考虑加滤波。另一个主要原因是输入端的75欧端接没做好或者同一个摄像头在另一块板子上正常说明这块板的输入端参考地处理有问题。还有一个隐蔽的原因是输入线缆接触不良模拟视频线是BNC或者FAKRA接头长时间插拔后内芯松动这种问题在产品测试返修时特别常见。解决措施电源加LC滤波输入端确认75欧端接线缆连接处加固定胶当这些全部处理后画面往往很快就干净了。5.2 MIPI锁不住信号从时钟和数据线上找原因现象SoC完全收不到数据media-ctl链路正常但v4l2-ctl抓帧超时内核日志里报CSI超时或者同步丢失错误。这个问题的定位思路系统性更强需要从物理层往上逐层排查。先用示波器查看MIPI时钟lane波形确认有没有时钟连续性。如果不是连续时钟模式时钟可能只是偶尔出现。此时看波形不能只看一瞬间要观察一段时间内的输出。如果MIPI输出端芯片已经启动但时钟lane没有波形问题大概率在XS9922B的初始化序列也可能芯片没有进入正常发送状态。如果时钟lane有波形但数据lane没有任何信号检查初始化序列中的lane数配置是否和SoC端一致。比如芯片输出4条laneSoC却配了2条lane必然锁不住。还有一种情况是MIPI极性接反高速差分信号正负对调后信号会反相SoC就无法解析。处理方法是调整dts中的时钟极性和数据极性配置每次改完重新抓帧验证。定位时建议备一份“寄存器配置前后对照表”把初始化序列里的关键寄存器值、更改原因都记录下来排查时才能知道改了哪个值才让问题消失。否则改来改去很容易乱。5.3 偏色和色调异常多半是视频制式没选对现象图像能出但颜色明显不对比如整体发红、发绿或者饱和度异常。这个问题的本质是输入视频制式和内部色彩空间配置不匹配。AHD、TVI、CVI三种协议虽然都输出YCbCr信号但不同协议下Y、Cb、Cr的取样方式和极性处理存在差异。如果芯片设置中选择了错误的输入协议类型解码出来的颜色自然不对。所以当发现偏色时先确认摄像头实际支持的是哪种协议再核对芯片输入配置。调节色度寄存器也是常见手段。色度增益、饱和度、色相偏移都有对应的寄存器可以调。但我不建议一上来就去调这些颜色寄存器等确认协议和色彩空间匹配之后再动否则只会越调越乱。经验是先排查协议再看色彩空间最后微调色度。有一次调试一个项目图像偏绿折腾了大半天最后发现是摄像头内部菜单把TVI协议输出改成了AHD协议模式而XS9922B端没有同步改动配置一改回来问题马上消失。5.4 通道间干扰和黑屏问题现象四路画面中某一两路黑屏或者画面互相串台时而能看到另一路画面的影子。原因是虚拟通道配置问题或者输入通道没有正确使能。排查顺序先看四路输入的锁定状态寄存器确认芯片内部是否已经检测到所有四路信号。哪一路没检测到就是输入源那一路的信号问题跟MIPI无关。如果四路都检测到了但MIPI输出中某一路黑屏检查虚拟通道映射关系确认每一路数据被分配到了SoC预期的虚拟通道。串台或者画面重叠多半是虚拟通道和数据类型配置冲突。CSI-2链路里不同虚拟通道的数据可以交替传输如果芯片没有按虚拟通道区分或者SoC端解析时把多个通道写入同一缓冲就会出现画面互相覆盖的现象。此时需要重新核对初始化序列中虚拟通道部分的寄存器建议一次只启用一路来做交叉验证先掌握各路画面的正常状态。5.5 稳定性问题热、静电、接触不良大项目调试阶段图像一切正常但设备连续运行几个小时后开始出现丢帧、花屏甚至整条MIPI链路失锁。这种情况通常和温度、电源、静电累积有关。热问题的机理是芯片温度升高后内部某些模拟参数漂移导致信号质量下降。解决措施是改善散热比如芯片下方加大面积接地焊盘散热外壳辅助散热同时检查电源设计是否留足了余量。静电问题往往表现为不定期、偶发的画面闪烁或黑屏。此时的排查方向是检查外壳接地、线缆屏蔽层接地、输入端ESD保护器件是否生效。在工业环境中长距离同轴线很容易感应静电处理不好会反复出现间歇性故障。曾经调试过一台设备白天正常午休后开机就花屏。排查到最后发现是设备面板上有一颗固定螺丝松动导致屏蔽层接地不良静电积累到一定程度后放电把MIPI信号打坏了。这类问题不好复现最好的方式是前期设计时就把接地和屏蔽做好。5.6 问题排查速查表现象大概率原因排查方向解决措施花屏、雪花、横纹电源纹波大、输入端匹配不良示波器量AVDD纹波检查75欧端接电源加LC滤波输入端做匹配完全黑屏抓帧超时MIPI时钟锁不住、lane配置错误示波器看时钟lane核对lane数修正dts lane配置、设置时钟连续性偏色、色调异常输入协议不匹配、色彩空间错误确认摄像头协议核对芯片输入配置修改输入协议配置微调色度寄存器某路黑屏该路输入未锁定、通道未使能查看锁定状态寄存器检查物理连接确认信号接入和通道使能寄存器画面串台、重叠虚拟通道配置错误核对虚拟通道映射一次只开一路验证修正虚拟通道寄存器长时间运行不稳定热、静电、接触不良检查温度、接地、线缆连接改善散热加强接地固定连接器6. 再补充几个容易忽略的实战心得6.1 输入格式要逐路确认别想当然很多项目里四路摄像头型号一样但实际买来的批次不同内部固件可能不同。我就遇到过左右两侧摄像头是TVI协议前后是AHD协议的情况。如果只按一个统一协议去初始化其中几路就会异常。建议上电后先逐路查询芯片的输入状态寄存器确认每一路自动检测到的协议和分辨率。再根据实际状态手动把每一路都固定下来。花几分钟做这个动作能避免后面反复怀疑代码问题。6.2 公版寄存器序列不是万能药原厂提供的初始化序列通常基于他们的官方评估板换到你的板子上不一定所有寄存器都合适。输出分辨率、时钟频率、MIPI lane数这些必须按你的实际方案调整。还有一部分寄存器涉及内部延时和驱动能力在不同PCB布局下需要微调。拿到初始化序列后我建议先原样执行跑通基本通路确认MIPI链路能锁住、图像能出来。然后再逐个调整需要变动的寄存器每改一次就抓一帧验证避免一次性改太多导致问题出现时找不到元凶。6.3 上电时序和复位问题如果复位时序不对芯片可能会进入异常状态表现为I2C能通信但MIPI没有任何输出。调试中发现过复位信号释放太快芯片还没完成初始化的现象。建议用SoC的GPIO控制复位脚复位低电平保持时间至少要满足芯片手册要求释放后再延时几十毫秒再开始I2C配置。有的平台还需要注意复位脚的电平域和芯片IO电平一致最好做一个硬件电平转换或者开漏驱动方案。6.4 量产前预留测试点和调试接口多路视频采集板卡在生产测试阶段如果没有预留测试点会非常痛苦。MIPI差分对如果没有测试点示波器探头没法直接夹只能找焊盘或连接器引脚试探效率极低。打样时就把MIPI时钟lane、数据lane、I2C、关键电源测试点预留出来。另外建议在软件里保留一个测试模式可以单独输出测试图案这样在生产测试时不用插摄像头就能验证主板通路是否正常对提升产线效率和排查故障都有很大帮助。做多路视频采集这块我的体会是硬件上优先解决电源和信号完整性软件上重点核对格式和lane配置一旦这两个方向把它固定住剩下的问题基本都能通过系统排查快速定位。最后再分享一个实用建议板子上一定预留MIPI测试点示波器能夹到信号调试心情和效率都会完全不一样。如果你正在调XS9922B或者类似方案欢迎多交流把实际遇到的坑分享出来。
返回列表