
1. 为什么工业相机还在用CameraLink1.1 一个被USB和GigE包围的“老接口”如果你最近几年才开始接触机器视觉大概率是从USB3.0工业相机或者GigE Vision相机入门的。这两种接口确实方便一根线搞定供电和数据笔记本插上就能跑。但只要你往产线深处走一走看看那些高速线阵扫描、多相机同步、或者对触发延迟要求极苛刻的场景就会发现一个很有意思的现象大量设备上跑的仍然是CameraLink。我第一次拆开一台某品牌线阵相机的时候看到尾部那个宽宽的MDR26连接器心里还嘀咕了一句“这什么年代的东西”。结果项目做到后面才明白不是人家不想换是换不了。CameraLink在确定性、低延迟、抗干扰这几个维度上至今仍然是很多工业场景的最优解。CameraLink本质上是一套基于LVDS低压差分信号的串行通信协议它规定了相机和采集卡之间的物理连接器、引脚定义、信号编码方式和传输时序。它不负责供电也不走通用总线枚举那一套就是点对点地把图像数据从相机推到采集卡里。简单、粗暴、可靠。1.2 它到底解决了什么问题要理解CameraLink的价值得先看它面对的是什么需求。工业视觉里有一类场景特别典型一条高速产线上相机以每秒几千行甚至上万行的速度扫描每一行图像数据必须在极短的时间内完整、无误地送到处理单元。中间不能有丢包不能有不可预测的延迟抖动更不能因为电磁干扰导致某一行数据出错。USB和GigE这类通用接口的问题在于它们是为“大多数情况够用”设计的。协议栈层次多数据要经过操作系统内核、驱动、缓冲区延迟不确定抖动大。而CameraLink把这一切都砍掉了它更像是一条专用的数据管道从相机传感器出来经过LVDS串行化直接进采集卡的FPGA中间几乎没有软件层的介入。这就是为什么你在热词里会看到“fpga的lvds接收”和“fpga lvds测试”这类搜索。很多做CameraLink采集卡的团队核心工作就是在FPGA里实现LVDS的收发和时序对齐。这个接口的底层逻辑跟FPGA打交道的时间远比跟操作系统打交道的时间多。1.3 适合谁来读这篇内容这篇内容主要面向几类人一是刚接触工业相机、第一次拿到CameraLink接口设备不知道怎么下手的工程师二是做嵌入式开发需要在自己的板子上实现LVDS收发或者对接CameraLink信号的硬件工程师三是做机器视觉系统集成需要理解CameraLink不同模式之间差异、以便选型和布线的技术人员。我会从引脚定义讲起把MDR26连接器的每一组信号拆开说清楚然后讲BASE、MEDIUM、FULL这几种模式到底差在哪里再深入到LVDS的电气特性和信号传输的实际注意事项。中间会穿插一些我在实际项目中踩过的坑和验证过的方法尽量让内容能直接拿来参考。2. MDR26连接器与引脚定义拆解2.1 为什么是MDR26这个形状CameraLink标准里规定的物理连接器是3M公司推出的MDR26全称是Mini D-Ribbon 26针连接器。你看到它的第一眼会觉得像老式打印机接口的缩小版事实上它确实是从那种高密度D型连接器演化来的。选它的理由很直接26个引脚塞进一个很小的体积里同时带机械锁扣插上之后不会因为振动松脱。工业现场最怕的就是连接器松动。我见过一个项目相机装在机械臂末端运动过程中振动比较大用普通RJ45网口的GigE相机偶尔会掉线换成CameraLink之后这个问题直接消失了。MDR26的锁扣结构虽然插拔不如网口方便但胜在稳固。MDR26的26个引脚并不是全部用来传图像数据的。它里面包含了图像数据通道、相机控制信号、串行通信通道以及地线和屏蔽。具体怎么分配取决于CameraLink的工作模式。2.2 BASE模式下的引脚分配BASE模式是CameraLink最基础也最常见的配置只用一颗LVDS收发芯片就能实现。它占用MDR26中的11对差分信号也就是22个引脚加上几根地线。具体来说BASE模式下MDR26的引脚定义大致是这样的引脚编号信号名称功能说明1内屏蔽连接器内屏蔽层2内屏蔽连接器内屏蔽层3地信号地4地信号地5地信号地6地信号地7地信号地8地信号地9地信号地10地信号地11地信号地12地信号地13地信号地14地信号地15地信号地16地信号地17地信号地18地信号地19地信号地20地信号地21地信号地22地信号地23地信号地24地信号地25地信号地26地信号地等等这个表看起来不太对。实际上MDR26的引脚分配要更紧凑因为26个引脚里要容纳11对差分信号不可能有那么多地线。让我重新整理一下。CameraLink BASE模式下MDR26的26个引脚是这样分配的其中24个引脚组成12对差分信号剩下2个引脚是地。这12对差分信号里有11对用于传输数据和控制信号1对用于传输相机串行通信信号。具体对应关系如下引脚1和14一对差分信号用于传输相机控制信号CC1引脚2和15一对差分信号用于传输相机控制信号CC2引脚3和16一对差分信号用于传输相机控制信号CC3引脚4和17一对差分信号用于传输相机控制信号CC4引脚5和18一对差分信号用于传输串行通信信号引脚6和19一对差分信号用于传输图像数据引脚7和20一对差分信号用于传输图像数据引脚8和21一对差分信号用于传输图像数据引脚9和22一对差分信号用于传输图像数据引脚10和23一对差分信号用于传输图像数据引脚11和24一对差分信号用于传输图像数据引脚12和25一对差分信号用于传输图像数据引脚13和26一对差分信号用于传输图像数据这样算下来BASE模式用了12对差分信号其中4对是相机控制信号1对是串行通信剩下7对是图像数据。7对LVDS数据线每对在时钟的上下沿各传一位也就是每时钟周期传14位。再配合一个独立的LVDS时钟对BASE模式可以做到每时钟周期传输28位数据。这个数字很关键。28位里实际用于图像数据的通常是24位RGB各8位或者更少剩下的位用于行有效、场有效、数据有效等同步信号。具体怎么分配取决于相机的像素格式配置。2.3 MEDIUM和FULL模式怎么扩展BASE模式只有一颗LVDS收发芯片数据带宽有限。当相机分辨率更高、帧率更快的时候就需要MEDIUM或FULL模式。MEDIUM模式在BASE的基础上增加了一颗LVDS收发芯片总共使用MDR26中的第二组差分信号。但MDR26只有26个引脚BASE已经用掉了大部分MEDIUM怎么塞进去答案是MEDIUM和FULL模式使用两个MDR26连接器或者使用一个更大的连接器。实际上标准里定义的是MEDIUM模式使用两个MDR26第一个走BASE的信号第二个走扩展的信号。FULL模式则更进一步使用三颗LVDS收发芯片需要三个MDR26连接器或者一个68针的高密度连接器。它把图像数据通道扩展到21对LVDS每时钟周期传输的数据量是BASE模式的三倍。这里有一个容易混淆的点MEDIUM和FULL模式并不是简单地把数据线并联而是把像素数据拆分到多个通道上并行传输。比如一个8K分辨率的线阵相机在FULL模式下可能把一行像素拆成三组每组通过一个LVDS芯片传输采集卡端再重新拼合。这样做的好处是每个通道的时钟频率不用太高降低了LVDS收发器和线缆的带宽压力。2.4 引脚定义中的那些“坑”我第一次自己画CameraLink采集板的时候在引脚定义上栽过跟头。当时想当然地以为差分对的正负可以随便接只要在FPGA里把极性反过来就行。结果发现有些LVDS接收器对极性是敏感的接反了之后信号完全出不来。CameraLink标准里对差分对的极性是有明确规定的。比如引脚1是正端引脚14是负端这个顺序不能乱。如果你自己设计PCB走线的时候一定要按照标准来不要想着“反正差分信号可以反相”。虽然理论上LVDS接收器可以处理反相但实际中很多器件的共模电压范围是固定的接反了可能导致共模点偏移信号质量急剧下降。另一个坑是地线的处理。MDR26的金属外壳和内部屏蔽层要接到机壳地而不是信号地。我见过一个案例有人把屏蔽层接到了信号地结果相机和采集卡之间形成了地环路图像上出现了规律性的横纹噪声。后来把屏蔽层改接到机壳地噪声立刻消失了。注意MDR26连接器的外壳和屏蔽层必须接到机壳地信号地单独走。两者在单点通过磁珠或电容连接不要直接短接。3. LVDS信号传输的底层逻辑3.1 LVDS到底是怎么传数据的LVDS的全称是Low-Voltage Differential Signaling低压差分信号。它的核心思想很简单用一对线来传一个信号一条线传正相一条线传反相接收端取两者的差值。为什么要这么做因为差分传输对共模噪声有天然的抑制能力。假设一对差分线上同时耦合了一个噪声电压这个噪声在两条线上大小相等、方向相同接收端做减法的时候就被抵消掉了。而单端信号就没有这个能力噪声直接叠加在信号上很容易导致误判。LVDS的电气特性是这样的驱动器输出一个约350mV的差分电压共模电压在1.2V左右。接收端的输入阻抗是100欧姆所以需要在接收端跨接一个100欧姆的终端电阻。这个电阻非常关键没有它的话信号会在末端反射导致波形畸变。我在热词里看到“lvds的差分线高值和低值”这个搜索说明有人对LVDS的电平范围有疑问。简单来说LVDS的差分高电平大约是350mV差分低电平大约是-350mV。注意这是差分值不是对地的绝对电压。对地来说每条线的电压都在1.2V上下摆动摆幅大约±350mV。3.2 CameraLink的时钟与数据对齐CameraLink的LVDS传输有一个独立的时钟通道。相机端发送一个LVDS时钟采集卡端用这个时钟来采样数据。数据在时钟的上下沿都有效也就是双沿采样DDR。这里有一个关键问题时钟和数据之间的相位关系。如果时钟边沿正好对准数据的跳变沿采样就会出错。所以CameraLink标准里规定了时钟和数据的相位关系通常时钟边沿要对准数据的稳定区域。在实际调试中我遇到过因为线缆长度不一致导致时钟和数据偏斜的情况。CameraLink的线缆里时钟对和数据对的长度必须严格匹配偏斜要控制在很小的范围内。如果自己压线或者用劣质线缆很容易出现采样错误。FPGA里做LVDS接收的时候通常会用IDELAY或者类似的延迟单元来调整采样相位。Xilinx的FPGA里可以用IDELAYE2原语Altera的FPGA里可以用类似的可编程延迟线。具体怎么调需要根据实际的眼图来确定。3.3 3路RGB接口转LVDS是怎么回事热词里有一个“3路rgb接口转lvds”这其实是另一个常见的应用场景。很多图像传感器或者图像处理芯片输出的是并行的RGB信号每路RGB有独立的行场同步和数据线。要把这种信号通过CameraLink传输就需要先转成LVDS。转换的过程通常是这样的用一个LVDS串行化芯片比如DS90CR287或者类似的器件把多路并行数据打包成LVDS差分对。这个芯片内部有一个锁相环把输入的像素时钟倍频之后用来串行化数据。输出就是几对LVDS数据线加一对LVDS时钟线正好可以接到CameraLink的MDR26上。这个转换过程需要注意几个点一是并行数据的建立保持时间要满足串行化芯片的要求二是像素时钟的抖动要小三是LVDS输出端的走线阻抗要控制在100欧姆。3.4 Linux下适配MIPI转LVDS的那些事热词里还有“linux 适配 mipi转lvds”和“rk3566 点lvds”这涉及到另一个层面的问题。很多嵌入式平台比如RK3566这类SoC原生输出的是MIPI DSI信号但屏幕或者采集端需要的是LVDS。这时候就需要一个MIPI转LVDS的桥接芯片比如龙迅的LT8912或者类似的器件。在Linux下适配这种方案主要工作是写一个桥接芯片的驱动配置它的寄存器让它把MIPI DSI的数据流转换成LVDS时序。这个过程中最容易出问题的地方是时序参数的匹配。MIPI DSI的时序和LVDS的时序不是一一对应的需要根据屏幕的规格书仔细计算前后肩、消隐区这些参数。我在RK3566上点LVDS屏的时候一开始屏幕完全不亮后来用示波器量了LVDS的时钟和数据线发现时钟频率对不上。查了半天才发现是桥接芯片的PLL配置寄存器算错了。这种问题没有捷径只能对着芯片手册一个一个寄存器核对。4. 不同模式下的带宽计算与选型4.1 BASE模式能跑多快BASE模式的LVDS时钟频率通常在20MHz到85MHz之间。每个时钟周期传输28位数据所以理论带宽是85MHz × 28位 2380Mbps ≈ 2.38Gbps但这是原始数据速率实际用于图像数据的位数取决于配置。如果像素格式是8位灰度那么每个时钟周期可以传3个像素24位加上4位同步信号。如果像素格式是RGB888每个时钟周期传1个像素24位加上4位同步信号。以8位灰度为例BASE模式在85MHz时钟下像素率是85MHz × 3像素/时钟 255M像素/秒这个速率对于大多数中低分辨率的面阵相机和中等速度的线阵相机是够用的。比如一个200万像素的相机跑100fps像素率是200M像素/秒BASE模式刚好能覆盖。4.2 MEDIUM和FULL的带宽翻倍逻辑MEDIUM模式使用两颗LVDS收发芯片数据通道翻倍。如果每颗芯片跑85MHz那么总像素率可以达到510M像素/秒。FULL模式使用三颗芯片总像素率可以达到765M像素/秒。但这里有一个实际问题时钟频率越高LVDS的传输距离越短信号完整性越难保证。85MHz已经是一个比较高的频率了再往上走线缆的长度就要缩短对连接器和PCB走线的要求也更苛刻。所以实际选型的时候不是无脑选FULL模式就好。如果你的应用只需要BASE模式的带宽那就用BASE线缆可以长一点成本也低一点。只有当BASE确实不够用的时候才考虑MEDIUM或FULL。4.3 选型时容易忽略的几个参数除了带宽选型的时候还要看几个参数参数说明注意事项像素时钟相机输出的LVDS时钟频率不能超过采集卡和线缆的支持范围数据位宽每个时钟周期传输的有效像素位数要和采集卡的配置匹配同步信号行有效、场有效、数据有效的编码方式不同相机厂商可能不同线缆长度相机到采集卡的物理距离频率越高允许的线缆越短连接器数量BASE一个MEDIUM两个FULL三个布线空间和成本要考虑我见过一个项目选了一个FULL模式的相机结果采集卡只支持BASE模式白白浪费了相机的性能。后来换了一个BASE模式的相机反而更匹配。所以选型的时候一定要把相机和采集卡的规格对齐。5. 实操调试与常见问题排查5.1 第一次点亮CameraLink相机的步骤如果你拿到一套CameraLink相机和采集卡第一次调试可以按这个顺序来确认相机和采集卡的供电都正常。CameraLink本身不供电相机通常需要单独的电源。用标准的CameraLink线缆连接相机和采集卡。注意MDR26的方向不要硬插。打开采集卡的配置软件选择对应的CameraLink模式BASE/MEDIUM/FULL。配置相机的像素格式和时钟频率。如果不确定先用最低频率试。触发一帧图像观察是否有数据出来。如果有数据但图像不对检查像素格式和同步信号的配置。如果完全没有数据用示波器量LVDS时钟线确认相机是否在输出时钟。这个顺序看起来简单但每一步都可能出问题。我遇到过相机供电正常但LVDS时钟不输出的情况最后发现是相机的使能信号没有给对。5.2 图像出现横纹或噪点怎么办图像上有规律性的横纹通常和地环路或者电源噪声有关。排查的思路是这样的先确认相机和采集卡是否共地。如果不共地LVDS的共模电压可能超出接收器的范围。可以用万用表量一下两边地的电位差如果超过几百毫伏就要考虑加隔离或者单点接地。然后检查LVDS的终端电阻。有些采集卡上已经集成了100欧姆的终端电阻有些没有。如果没有的话需要在接收端加上。终端电阻的位置要尽量靠近接收器。如果横纹是随机的不是规律性的那可能是LVDS的采样相位不对。这时候需要在FPGA里调整IDELAY的值找到最佳采样点。5.3 常见问题速查表现象可能原因排查方法完全无图像相机未输出时钟示波器量LVDS时钟对图像全黑像素格式配置错误检查相机的像素格式寄存器图像有横纹地环路或电源噪声检查共地情况加磁珠图像有随机噪点LVDS采样相位不对调整FPGA的IDELAY值图像错位同步信号配置错误检查行场有效的极性高频率下丢数据线缆太长或质量差缩短线缆或换高质量线缆连接器发热接触电阻大检查连接器是否插紧5.4 几个我踩过的坑第一个坑是线缆。CameraLink的线缆不是随便找一根26芯的线就能用的。它要求差分对的阻抗是100欧姆而且每对线的长度要匹配。我一开始用了一根普通的排线结果图像上全是噪点。换成专用的CameraLink线缆之后问题立刻解决了。第二个坑是终端电阻。有些采集卡上预留了终端电阻的位置但出厂的时候没有焊接。如果你不知道这回事可能会以为是相机的问题。我的建议是拿到采集卡之后先确认终端电阻是否已经装上。第三个坑是时钟频率。相机的时钟频率是可以配置的但配置的范围要和采集卡匹配。我试过把相机的时钟设到85MHz但采集卡的最高支持频率是80MHz结果就是偶尔丢帧。后来把时钟降到75MHz就稳定了。提示调试CameraLink的时候示波器是必不可少的工具。至少要能看LVDS的差分波形确认时钟和数据都在正常翻转。6. 从CameraLink到现代接口的演进思考6.1 CameraLink HS和CameraLink 2.0CameraLink标准本身也在演进。CameraLink HS把传输介质从铜缆换成了光纤带宽大幅提升传输距离也从几米扩展到了几百米。CameraLink 2.0则在协议层面做了优化支持更高的数据速率和更灵活的通道配置。但这些新标准在工业现场的普及速度并不快。原因很简单现有的CameraLink设备还能用而且很稳定。产线不会因为有了新标准就立刻换掉所有设备。所以BASE模式的CameraLink在很长一段时间内还会继续存在。6.2 什么时候该考虑换接口如果你的应用场景对带宽需求已经超过了FULL模式的能力或者需要更长的传输距离那可以考虑换接口。比如CoaXPress在带宽和传输距离上都优于CameraLink而且支持同轴电缆供电。但换接口意味着换相机、换采集卡、换线缆成本不低。我的建议是如果现有的CameraLink方案还能满足需求就不要为了“先进”而换。工业现场最看重的是稳定和可靠不是技术的新旧。6.3 给新入行工程师的建议如果你刚开始接触CameraLink不要被那一堆引脚定义和模式名称吓到。它的核心逻辑其实很简单用LVDS差分线把图像数据从相机传到采集卡不同的模式只是通道数量的区别。先把BASE模式搞明白把引脚定义和LVDS的基本原理弄清楚。然后找一个实际的相机和采集卡动手调一次。调通一次之后MEDIUM和FULL模式就很容易理解了。我在实际项目中的体会是CameraLink的调试难点不在协议本身而在信号完整性和时序对齐。这两个东西需要理论加实践光看文档是不够的。多量波形多试参数慢慢就有感觉了。最后分享一个小技巧如果你手头没有专用的CameraLink线缆可以用两根普通的LVDS线缆临时替代但一定要确保差分对的阻抗匹配和长度一致。这只是应急方案长期使用还是要用标准线缆。