简介:围绕 Camera Link 相机输出 Base、Medium、Full 三种接口配置的技术文档,面向工业相机选型、图像采集卡调试及机器视觉入门与进阶读者,帮助梳理不同模式在通道数量、并行视频位宽与线缆连接上的差异。文档以 doc 格式收录,压缩包仅含 1 个文件,大小约 168KB,篇幅紧凑,适合作为接口协议速查与方案比对资料。内容从标准产生背景、Channel Link 与 LVDS 技术优点切入,说明 Base 模式一对收发器对应 28 位并行数据,Medium 模式扩展至两对、最高 56 位,Full 模式采用三对、最高 84 位,并交代相机控制与串行通信线对的分配关系。文中还涉及端口 A 至 H 的定义、不同配置下所需标准电缆数量等细节,可辅助读者理解相机与采集卡链路匹配、带宽估算及连接方案取舍。已有 2116 人学习,适合需要快速建立 Camera Link 模式整体认识的工程人员查阅。
1. 三种模式的真相:Base 不是“低频版”,砍掉的是通道,频率本身没有变
拿到一台工业相机,手册上印着 Base / Medium / Full 三档,多数人第一反应是“低、中、高三档速率”。这个直觉在 Camera Link 上站不住,而且最容易带偏排查方向。三种模式跑的是同一个像素时钟,Base 每个时钟周期送 28 位,Medium 送 56 位,Full 送 84 位,带宽差异全都来自并行复用了几个 Channel Link 通道。频率不变、通道加倍的代价是线缆数和连接器数量上涨,这也是为什么 Medium 和 Full 必须插两根 26 针电缆,而 Base 一根就够。把这条结论先摆在这里,后面出现的所有细节——为什么八个端口只够分到三个通道、为什么多出来的通道一定落在第二个连接器上、为什么 Full 模式在长线上更容易出问题——都是它的推论。Camera Link 的全部设计取舍,都压在这 28 位的粒度上。
2. 从 28 位到 4 对差分:Channel Link 到底怎么把并行数据串出去
2.1 7:1 这个比例由什么决定
Channel Link 的发送器输入端是 28 根单端并行数据线加 1 根时钟,输出端是 4 对 LVDS 差分数据加 1 对 LVDS 时钟。要把 28 位平均摊到 4 条串行链路上,唯一的整数解就是 7。所以每条差分线在每个像素时钟周期里搬 7 个比特,串行时钟频率是像素时钟的 7 倍。这个 7 决定了后面所有数字:85MHz 像素时钟下,单通道的串行速率是 85 × 7 = 595Mbps,四条加起来 2.38Gbps,正好等于 28 × 85MHz。它们其实是同一个数。
我一般这么理解这个设计:Camera Link 并没有追求更高的单对线速率,它只是把“28 位”这个整数固定下来,然后让通道数去乘。这么做的直接后果是扩容路径非常线性——想要双倍带宽就再加一颗 Channel Link 芯片、再加五对差分线,接口协议、时钟结构、控制信号全都不用动。对采集卡厂商来说,这意味着 Base 卡和 Full 卡可以共用同一套 FPGA 前端逻辑,只是例化几次接收器而已。这种“横向复制”的思路在 2000 年前后是相当务实的选择,因为那时候能把 28 位并行数据可靠地串出去的芯片已经成熟、便宜,而更高速率的串行方案还没形成生态。
代价也很明确:通道数是离散的,只有 1、2、3 三档。相机如果只需要比 Base 多一点点带宽,也得整颗芯片、整根电缆地加上去。这个“粒度粗”的问题一直伴随 Camera Link 到今天。
算一下三种模式各自的原始带宽,代码比文字直观:
def link_bandwidth(clk_mhz, links, bits_per_link=28): """ clk_mhz : 像素时钟频率,单位 MHz。三种模式共用同一个时钟。 links : Channel Link 通道数,Base=1 / Medium=2 / Full=3 bits_per_link : 每个通道每周期搬运的位数,固定 28 """ raw_bps = clk_mhz * 1e6 * links * bits_per_link # bit/s return raw_bps / 8 / 1e9 # 换算成 GB/s print(link_bandwidth(85, 1)) # Base -> 0.2975 GB/s print(link_bandwidth(85, 2)) # Medium -> 0.5950 GB/s print(link_bandwidth(85, 3)) # Full -> 0.8925 GB/s函数里clk_mhz是像素时钟,它不随模式变化,这是整段代码最容易被误改的参数;links才是区分三种模式的唯一变量。算出来的 0.2975 / 0.595 / 0.8925 GB/s 是名义值,包含了 FVAL、LVAL、DVAL、Spare 这四个不承载像素的位。真正能拿来传像素的,每个通道只有 24 位,也就是端口 A、B、C 那一组。把名义值直接当像素吞吐去做相机选型,是新手非常典型的一个坑。
2.2 位映射为什么是“乱序”的
打开 Channel Link 的引脚定义表,第一眼会觉得编排得很乱:端口 A 的 bit0 对应 TX0,bit1 对应 TX1,bit2 对应 TX2,可到了 bit5 却跳到 TX6,bit6 直接跑到 TX27,bit7 又折回 TX5。端口 B、C 同样如此,一段连续的端口位会被打散到芯片引脚的不同区域。
这个排布不是随手写的。串行器内部是一组移位寄存器,28 位数据在片内先被分配到四条并串转换通道,每条通道负责 7 位。为了让四条通道的输出偏斜最小、片内走线最短,设计者把“同一端口的 8 个位”在物理上摊开到不同通道上,而不是让它们挤在同一个移位寄存器里。常见的实现思路是:先按串行通道分组,再在组内按建立保持窗口排序,最后才把结果固化成引脚表。所以引脚顺序反映的是硅片内部的布线优先级,而不是逻辑上的端口顺序。
对写代码的人来说,这件事的后果是:你不能假设“端口 A 的八位在接收端也是连续的八根线”。采集卡 FPGA 侧必须严格按照标准的位分配表去重组,任何一位接错,图像都会呈现规律性的错误色块或者周期性条纹,而不是简单地全黑。这也解释了为什么很多采集卡的“点序配置”里会有一堆看起来莫名其妙的选项——它们对应的是不同厂商相机在端口内部做过的位序微调。
2.3 一对时钟怎么让四条数据线对齐
28 位数据加 1 个时钟,最终只传了 1 对时钟线,而不是每对数据线配一根。接收端靠这一对时钟同时采样四条数据通道,前提是四条通道的传输延迟必须落在同一个采样窗口内。
这里有两层保证。芯片层面,发送器保证四条串行通道的输出偏斜在规格内;线缆层面,Camera Link 强制使用阻抗受控的双绞屏蔽结构,把每一对差分线的传播延迟拉齐。标准里对“对间偏斜”的要求,本质上就是给这个单时钟架构留余量。
余量是有限的,而且会随速率和长度恶化。像素时钟越高,一个比特的窗口越窄;线缆越长,各对之间的延迟差被放大得越多。这就是为什么同样的电缆,Base 模式能跑十米,Full 模式跑八米就开始丢行。它不是玄学,是把四对线的偏斜预算除到更窄的窗口里去了。
3. 端口 A 到 H:八个 8 位字是怎么切给像素的
3.1 端口、抽头、像素,这三个词经常被混着用
端口(Port)在 Camera Link 里是一个严格定义:一个 8 位的逻辑字,编号 A 到 H,一共八个。它不是一个物理引脚组,而是一个数据组织单位。驱动器上标注的 TX0 到 TX27,接收器上的 RX0 到 RX27,才是物理层的东西,端口位通过 2.2 节那张映射表落到具体的 TX/RX 引脚上。
抽头(Tap)是相机侧的术语,指的是“每个像素时钟周期并行输出几个像素”。四抽头相机每个周期吐四个像素,每个像素 8 位的话就是 32 位,需要占用四个端口。
像素是最终结果。三者之间的关系是:像素数 × 每像素位宽 = 需要的端口位总数,端口位总数再决定用几个通道。一台 4 抽头、每像素 10 位的相机,每周期需要 40 位,Base 的 24 位根本装不下,必须上 Medium。
这个换算关系建议直接背下来,选型时非常省事。很多人翻车就翻在这里:只看相机标称的“4 抽头”,没算每像素位宽,结果买了 Base 采集卡回来发现只能跑到一半帧率。
3.2 三种模式的端口和通道对应关系
三种配置下端口和 Channel Link 通道的分配是固定的,没有任何灵活空间:
| 配置模式 | 使用端口 | Channel Link 通道数 | 每周期名义位数 | 电缆根数 | 连接器使用情况 |
|---|---|---|---|---|---|
| Base | A、B、C | 1 | 28(24 数据 + 4 控制) | 1 | 仅第一个 26 针 |
| Medium | A、B、C、D、E、F | 2 | 56 | 2 | 两个都用 |
| Full | A、B、C、D、E、F、G、H | 3 | 84 | 2 | 两个都用 |
注意 Full 那一行:三个通道却只用两根电缆。原因是每个 26 针连接器在物理上能容纳两个通道所需的差分对——第一个连接器在 Medium 和 Full 下都保持 Base 时的布局(X 通道加控制加串口),第二个连接器容纳 Y 和 Z 两个通道。这个安排很妙:一台 Full 相机把第二根线拔了,剩下的部分在电气上和一台 Base 相机完全一致,采集卡不需要做任何特殊处理就能拿到 X 通道的数据。
表格里还有一处值得多看两眼:端口 G 和 H 一共只有 16 位,而第三个通道每周期能搬 28 位。也就是说 Full 模式下第三个通道并没有被数据端口占满,剩下那些位是控制信号和保留位。这也是为什么 8 抽头相机的实际像素吞吐达不到名义上的 84 位——64 位端口数据才是天花板。
3.3 控制面与数据面为什么始终分离
三种模式里,有一组信号是永远不变的:4 对相机控制信号 CC1 到 CC4,加上 2 对异步串行通信 SerTC 和 SerTFG,全部是 RS-644 LVDS,全部固定在第一个连接器的 7 到 12 号引脚上,全部和图像数据在物理上分开走。
这个分离是 Camera Link 最值得称道的设计之一。CC1 到 CC4 的具体含义标准并没有强制定义,只规定了方向(采集卡输出、相机输入),实际使用中厂商各有各的约定:常见的做法是 CC1 接外触发 EXSYNC、下降沿有效,CC2 接像素复位 PRIN、低电平有效,CC3 做扫描方向切换 FORWARD、高电平正转低电平反转,CC4 留空或者做厂商自定义。串口那边更简单,异步格式、8 位数据位、1 位停止位、无奇偶校验,最低波特率 9600。
好处是:无论相机是 1 个通道还是 3 个通道,控制逻辑一行都不用改。采集卡只需要把 CC 信号和串口透传出去,剩下的交给相机厂商自己去定义。对一个由多台相机组成的采集网络来说,这意味着上层软件可以用同一套控制代码管理混插的 Base 和 Full 相机——通道数只影响数据面的搬运量,不影响控制面的语义。
串口还带来一个附加价值:相机的大部分参数配置可以走这条低速链路完成,不需要占用图像带宽。HEX 协议的寄存器读写、曝光时间、增益、触发模式,全都从这里过。标准建议采集卡厂商提供至少一个终端程序,能收发字符串和短文件,实际上就是给你一个不依赖任何图像库的最小调试通道。这条通道在排查问题时极其有用——图像出不来的时候,先确认串口能不能通,能通说明供电、连接器、LVDS 物理层都没问题,问题被锁死在数据面。
3.4 相机配置超出采集卡时如何降级
现场最常见的尴尬是:手上的相机是 Medium 甚至 Full 的,采购回来的采集卡是 Base 的。这时候不是完全不能用,而是要把相机切到 Base 兼容模式——减少每周期输出的像素数,或者降低像素位宽,把需求压到 24 位以内。
降级的代价是帧率。一台 4 抽头 8 位、原本每周期 32 位的相机,切到双抽头后每周期 16 位,Base 完全装得下,但帧率直接掉一半。这个换算要在方案阶段就算清楚,别等到现场调不通了才发现相机没有降级选项——相当一部分工业相机只支持固定的抽头数,软件里根本没有“切 Base”这个开关。
4. 26 针 MDR 与十米上限:物理层被什么约束住了
4.1 差分线对数量如何分配
Base 配置一共需要 11 对差分线:4 对图像数据、1 对图像时钟、4 对相机控制、2 对串行通信。26 根引脚的 MDR 连接器刚好装得下这 11 对(22 根信号脚)加上 4 根屏蔽和地。这个“刚好”不是巧合,连接器选型的时候就是按这个数字倒推的。
对比一下传统方案就知道这个密度有多值:同样传 28 位数据,用 RS-422 需要 28 对差分线,也就是 56 根导线、56 个终端电阻,线缆粗到没法用小型连接器。Channel Link 把它压到 4 对数据加 1 对时钟,只用 11 个终端电阻,线径和屏蔽要求都跟着降下来。这是 Camera Link 能在工业现场迅速铺开的核心原因——不是因为它最快,而是因为它在够快的前提下把线做细了。
第二个连接器在 Medium 和 Full 下启用,承载 Y 和 Z 两个通道,每个通道 5 对差分线,两个通道 10 对,加上终端和屏蔽,26 针同样刚好装满。
4.2 屏蔽、接地与没用到的线对怎么处理
标准对屏蔽有明确要求:连接器和电缆的内屏蔽层(Inner shield)接相机的数字地;采集卡一侧的内屏蔽引脚通过一个 0Ω 电阻连到数字地。用 0Ω 电阻而不是直接短接,是为了留一个单点接地的可控位置,避免两端都硬接地形成地环流,把共模噪声引到差分对上。
未使用的线对同样要处理。标准建议在两端各接一个 100Ω 的终端电阻。原因很直接:悬空的差分对相当于一根天线,在高速信号旁边会感应出共模噪声,还会造成阻抗不连续点的反射。Base 模式下如果用的是 Full 规格的电缆,第二个连接器上的十对线全都是悬空的——这时候终端电阻接不接,直接决定了图像有没有偶发的横条纹。
这部分是硬件工程师的基本功,但对做软件的来说未必知道。看到一个“明明线是好的、图就是偶尔花一下”的现象,往这个方向想一次不亏。
4.3 十米这个数字是怎么来的
LVDS 在理想介质里的理论传输速率上限是 1.923Gbps,而 Camera Link 单通道跑到 595Mbps,看起来余量很大。限制实际距离的不是速率,是偏斜和衰减。
具体拆开看:串行时钟是像素时钟的 7 倍,85MHz 像素时钟对应 595MHz 的串行时钟,一个比特的窗口只有 1.68 纳秒。四条数据通道之间的传播延迟差必须远小于这个窗口,接收端才能用同一对时钟正确采样。电缆越长,各对之间的长度公差、介质不均匀性带来的延迟差就越大;同时高频衰减让上升沿变缓,有效窗口进一步收窄。
标准把上限定在 10 米,成品电缆通常提供 3 米规格,是给实际工程留的余量。这个数字还随通道数变化——Full 模式下三个通道都在跑,对间偏斜的预算被摊薄,长线上出问题的概率明显高于 Base。所以“同样的线,Base 能用 Full 不能用”是完全正常的现象,不是线坏了。
5. Base/Medium/Full 排查:五条踩坑记录
5.1 现象、原因、解决方式对照
坑一:图像只有左边一半,右边全黑。
现象很规整——左半幅正常,右半幅纯黑或者重复最后一行,帧率看起来还正常。
原因是采集卡只收了第一个通道。相机在 Medium 或者 Full 模式下把右半幅的数据放进了端口 D、E、F,走的是第二个连接器,而 Base 采集卡压根没有第二个接收器,那部分数据在物理层上就没人接。
解法只有三条路:换双通道采集卡;把相机切到 Base 兼容模式(如果它支持);或者接受半幅视野。中间没有折中方案,别指望通过改配置把第二通道的数据“挤”进第一通道。
坑二:两根线都插了,还是采不到图。
双通道采集卡加双电缆,硬件看起来齐了,软件里就是没数据。
先查插反。第一个连接器承载 X 通道、4 对控制信号和 2 对串口,第二个连接器只有 Y 和 Z。相机的主口必须接采集卡的第一个口,反过来插的话,控制信号和串口全部落到悬空引脚上,相机可能连触发都收不到。
再查相机是否真的切到了 Medium/Full。有些相机的模式切换需要重新上电,有些需要写寄存器并等待确认,配置文件里改了但没生效的情况很常见。
坑三:偶发的单行错位或者雪花点。
低概率、非固定位置、跑几个小时才出一次,重启就好,过一阵又来。
这类现象九成是物理层余量不够。可能的原因依次是:电缆不是 Camera Link 专用(拿别的双绞线改的,阻抗和偏斜都不达标);长度接近或者超过十米;像素时钟跑在芯片的上限附近;未使用的线对没接 100Ω 终端。
排查顺序建议从最便宜的做起——先换一根标准长度三米的成品电缆跑一遍,问题消失就说明是线的问题,别再折腾软件。
坑四:8 位相机接到 Medium 卡上,图像像被撕碎。
画面不是黑,也不是错位一半,而是呈现规律的条带状错乱,每个像素都像被移了几位。
这是端口映射或者位序配置错了。相机把像素放在端口 A,采集卡却按端口 D 去解析,拿到的自然是一堆控制位和保留位。Camera Link 的端口分配在标准里是死的,但采集卡软件里的“抽头配置”“点序设置”是活的,配错了就是这个现象。
对照相机手册里的位分配表,逐个端口核对,别靠猜。
坑五:串口能通,图出不来;或者图出来了,串口不通。
控制面和数据面只坏了一个,这种“半通”状态最容易让人误判成软件 bug。
物理上这两组信号走的是同一个连接器的不同引脚段:图像在 2 到 6 号,控制和串口在 7 到 12 号。线缆内部断芯、连接器某几针接触不良、插头没插到底,都可能只影响其中一段。
用万用表逐对测通断是最快的定位手段,比反复改配置高效得多。测出来全通,再往芯片和 FPGA 侧查。
5.2 从现象反推故障层的顺序
排查这类问题,我习惯按“物理层 → 链路层 → 配置层”的顺序走,跳步往往会绕远路:
| 现象 | 优先怀疑的层 | 第一步动作 |
|---|---|---|
| 完全无图,串口也不通 | 供电 / 连接器 / 电缆 | 换线、换口、量电压 |
| 串口通,无图 | 数据通道物理层 | 查第二根线、查端口映射 |
| 半幅图 | 通道数不匹配 | 核对相机模式与采集卡通道数 |
| 偶发错行 | 偏斜 / 端接 / 线长 | 换短线、补终端电阻 |
| 规律性错位 | 位序 / 抽头配置 | 对照位分配表逐位核对 |
6. 停在 85MHz:Camera Link 的取舍边界在哪
把三种模式摊开看,会发现一个有意思的事实:Camera Link 扩容的方式始终是“加通道”,而不是“提频率”。像素时钟长期稳定在 85MHz 这个量级,带宽需求涨了就多复用一个 Channel Link。这个选择背后是一组很实在的权衡。
提频率的收益是线少,代价是偏斜预算被压缩、电缆长度缩短、连接器成本上升。加通道的收益是物理层余量保持不变、芯片和电缆都是现成的,代价是线多、连接器大、每增加一个通道就多五对差分线。在那个年代,工业现场对“确定性”的需求远高于对“最高吞吐”的需求——没有协议栈、没有握手、没有重传,从光子打到传感器到数据进内存,延迟是可预测的常数。这个特性在触发同步、多相机拼接这类场景里比带宽值钱得多。
所以 Camera Link 的边界很清楚:它擅长的是短距离、高确定性、多相机同步的场合;一旦距离拉长到几十米,或者需要一根线搞定供电加数据,它就交棒给别的方案了。这不是它设计得不好,是它一开始就没打算覆盖那些场景。
验证一套链路是否真的工作在设计余量内,我的做法是跑图样而不是跑实景。让相机输出棋盘格或者逐像素递增的计数器图样,连续采几千帧,然后在主机侧做逐位比对。棋盘格能暴露相邻位的串扰,计数器能暴露位序错误和丢行——实景图像里这些错误经常被自然纹理掩盖,看不出来。这个测试跑通了,再上真实场景。
从那以后我每次评估一套新的采集链路,都强制先跑一遍计数器图样,哪怕供应商说“已经测过了”。希望帮到你。
本文还有配套的精品资源,点击获取