简介:Sony IMX678 datasheet 中文解读版,面向安防摄像头、计算机视觉与机器人视觉领域的硬件工程师、驱动开发人员及图像算法研究者。该芯片为索尼半导体推出的对角线8.86 mm(Type 1/1.8)CMOS图像传感器,有效像素约840万,具备低功耗、高灵敏度、低暗电流等特性。解读围绕官方datasheet展开,详细梳理了时序调整电路、多种输入频率、推荐录像像素3840×2160、All-pixel扫描/2/2线合并/窗口裁剪等读出模式、最大60帧/秒输出、数字overlap HDR与Clear HDR、Sensor同步、可变速度快门、CDS/PGA增益范围及CSI-2 RAW10/RAW12输出等内容。包体为1个PDF文件,压缩包大小592KB,方便快速查阅。目前已有2748人学习下载。通过这份解读,读者可快速掌握IMX678的核心参数、功能特性与典型应用场景,节省直接阅读英文原版datasheet的时间,并为安全摄像头、机器人视觉等项目的选型与开发提供直接参考。
1. 从 IMX678 datasheet 能读出什么:一颗为安防而生的 STARVIS 2 传感器
如果你做过监控摄像头的选型,大概率会对 STARVIS 这个词不陌生。IMX678-AAQR1 是 Sony Semiconductor Solutions 在 2021 年至 2022 年期间发布的 CMOS 图像传感器,对角线 8.86 mm,Type 1/1.8 规格,有效像素约 840 万,单位像元尺寸 2.0 μm。真正值得关注的不只是参数表,而是它把安防场景最看重的三件事同时做了:低照度、近红外响应、60 fps 下的 4K 输出。datasheet 里给出的对比图显示,IMX334 在 60 dB 增益下与 IMX678 在 48 dB 增益下获得相同输出亮度,这 12 dB 的差距意味着暗光场景可以用更低增益换取更干净的画面。这篇解读会从 datasheet 的原始数据出发,拆像素结构、电源时序、CSI-2 配置、HDR 模式,再落到实际调试时的参数计算与验证方法。适合正在做摄像头驱动、画质调优或方案选型的工程师,尤其是碰到 IMX678 初始化失败、低照度噪点偏高、HDR 模式切换异常这些实际问题的人。
2. IMX678 核心参数解读:像素阵列、电源与时序约束
2.1 像素结构与有效像素
IMX678 的 datasheet 里一共给了四组像素数,分别是总像素 3856 (H) × 2200 (V)、有效像素 3856 (H) × 2180 (V)、活动像素 3856 (H) × 2176 (V)、推荐记录像素 3840 (H) × 2160 (V)。这组数字不能混用。总像素包含了垂直方向的光学黑体(OB)和边缘 dummy 像素,但在 IMX678 上,水平方向 OB 和 dummy 都是 0 像素,垂直方向 OB 只有前端 20 像素,dummy 为 0,所以有效像素和活动像素的差值只有垂直方向的 4 行。推荐记录像素 3840×2160 正好是 UHD 4K 标准,实际应用时通常从活动像素区域中心裁出这块区域,或者通过 window cropping 模式直接输出该尺寸。单位像元 2.0 μm 属于当前安防传感器的主流规格,2.0 μm 的像素在 8.86 mm 光学格式下能放下 8.4 MP,兼顾了分辨率与光学镜头适配难度。
值得注意的是,IMX678 采用 R、G、B 三原色马赛克滤色片,而不是某些安防 sensor 使用的 RYYB 或 RGB-IR 排列。这意味着在近红外补光场景下,RGB 滤色片的红外透过率会直接影响灵敏度,Sony 的 STARVIS 2 背照式技术正是为了弥补这一点。datasheet 中 STARVIS 2 的描述强调,在 706 cd/m² 光源、F5.6、1 秒累积等效条件下,彩色产品每 1 μm² 灵敏度可达 2000 mV 以上,并且与同像素尺寸的上一代 STARVIS 相比,单次曝光 AD 12 bit 的动态范围有超过 8 dB 的提升。背照式结构把光电二极管放在金属布线层上方,入射光不需要穿过金属层,量子效率自然更高,这也是 IMX678 能在 0.2 lux 照度下工作的底层原因。
2.2 三路电源与输入时钟
IMX678 的电源设计是模拟 3.3 V、数字 1.1 V、接口 1.8 V 三路独立供电。模拟 3.3 V 主要给像素的电荷转移和源极跟随器供电,噪声会直接影响暗电流和读出噪声,建议用低噪声 LDO 并靠近电源引脚放置 0.1 μF 与 10 μF 去耦电容。数字 1.1 V 供给逻辑和时序电路,电流随帧率与输出路数变化,需要根据实际功耗计算。接口 1.8 V 用于 CSI-2 的 I/O 和串行通信,电平标准必须匹配主控的 MIPI 接口,如果主控 I/O 是 1.2 V 或者 3.3 V,就需要加电平转换,否则通信不稳定。
输入频率 datasheet 列出了 13.5 / 18 / 24 / 27 / 36 / 37.125 / 72 / 74.25 MHz 八种。这里最常见的一个误区是认为任意频率都能用。实际上这组频率对应不同的输出时序和帧率组合,比如 74.25 MHz 是 UHD 60 fps 的典型像素时钟来源,37.125 MHz 是 30 fps 的常用参考。选择原则是让 PLL 分频后能得到整数像素周期,避免行场时序抖动。如果主控只能提供非标准频率,比如 25 MHz,需要看 IMX678 是否支持外部时钟分频到标准输入范围,datasheet 没有写明这一项,实际调试时可以先在 I2C 里读 0x0000 之类的 chip ID 确认通信正常,再检查时钟锁定寄存器。串行通信电路内置在 sensor 内部,芯片地址在 datasheet 里有指定,常见的是 0x34(7-bit 地址 0x1A),这个值可以通过 silkscreen 和参考设计确认。
2.3 帧率与读出模式
Basic Drive Mode 表格里只列了两种模式:All-pixel 3840×2160 @ 60 fps 和 Horizontal/Vertical 2/2-line binning 1920×1080 @ 60 fps,ADC 都是 10 bit。这里的 60 fps 是 12 bit 和 10 bit 都支持的最大帧率,也就是说 IMX678 并不需要为了 60 fps 牺牲为 10 bit,12 bit 下同样能跑满 60。这与很多 sensor 只能 10 bit 高速不同,IMX678 的 ADC 位深和输出路径是匹配的。2/2 binning 模式下,水平和垂直方向各把 2 个像素合并为 1 个,输出 1920×1080,但等效像素尺寸变成 4.0 μm,灵敏度理论上提升 4 倍,适合电子变焦或低照度预览流。
Window cropping 模式可以在活动像素区域内任意裁剪窗口,适合做 PTZ 摄像头的电子放大。需要注意裁剪窗口的起始坐标必须按 sensor 规定的对齐单位,比如水平 2 像素、垂直 2 像素对齐,否则会产生奇偶行错位。水平/垂直方向支持正常和倒置读出,这是为了适配不同的镜头安装方向,倒置读出时寄存器里会把行扫描方向和列扫描方向同时反转,而不仅仅是翻转图像数据,如果只做镜像就会导致 Binning 模式下的色彩错位。同步传感器功能是 IMX678 的一个亮点,多颗 sensor 可以同时曝光,用于全景拼接或多目摄像头,外部需要给 master 和 slave 提供同一个触发信号,sensor 内部按 1H 单位对齐,这颗信号在 datasheet 里通常叫 XHS/XVS 或者 GPIO,具体引脚名以硬件参考设计为准。
2.4 增益与 CDS/PGA
CDS(相关双采样)和 PGA(可编程增益放大器)是 sensor 模拟前端的两部分。CDS 通过采样像素复位电平和信号电平做差值,消除复位噪声和固定模式噪声,IMX678 的 CDS 是内置的,不需要外部配置。PGA 的增益范围 datasheet 写的是 0 dB 到 30 dB 为模拟增益,步进 0.3 dB;30.3 dB 到 72 dB 是模拟增益 30 dB 加上数字增益 0.3 dB 到 42 dB,步进也是 0.3 dB。这个分界很重要,因为 30 dB 以上引入的是数字增益,数字增益放大的是整个信号链路的噪声,等效于把噪声一起放大,所以实际调参时应优先提升模拟增益,模拟增益到头后再用数字增益补余量。
关于增益的计算,常见做法是把 datasheet 的 dB 值转换成倍数:Gain = 10^(dB / 20)。30 dB 对应 31.6 倍,72 dB 对应 3981 倍。在驱动里配置增益时,通常写入的是寄存器原码,而寄存器值和 dB 之间的映射表不一定会直接写在 datasheet 正文里,而是放在寄存器列表的附录中。如果你的 SDK 只给了 0x3000 到 0x3030 之类的增益寄存器,没有给换算公式,可以用一个简单的标定方法:对着均匀光源,每增加一个 step 抓一帧,看平均亮度是否按预期增加 0.3 dB 的倍率,如果出现一段平台期,说明你在模拟/数字增益切换边界没有处理跳变。
下面用一个 Python 脚本表示增益换算过程,方便在调试时快速计算:
import math def gain_db_to_linear(db): return 10 ** (db / 20) for db in [0, 10, 20, 30, 30.3, 40, 50, 60, 72]: linear = gain_db_to_linear(db) print(f"{db:5.1f} dB -> {linear:8.1f}x")这段代码把 datasheet 里给出的 dB 增益值转换为线性倍数。10 ** (db / 20)的 20 对应的是功率增益公式,因为电压幅值与光强成正比,图像传感器里的 dB 一般以电压为参考。调试时看到 datasheet 说模拟增益最大 30 dB,不要直接跳到 30.3 dB,那个点已经切换到了数字增益,噪点特性会变化。
3. IMX678 驱动开发实战:CSI-2 配置与寄存器初始化流程
3.1 输出接口与 Lane 配置
IMX678 支持 CSI-2 串行数据输出,可选 2 Lane、4 Lane、8 Lane、4 Lane × 2ch,输出格式为 RAW10 或 RAW12。Lane 数量的选择取决于主控的 MIPI CSI-2 控制器能力、接口时钟频率和带宽需求。以 4K 60 fps RAW12 为例,像素时钟按 297 MHz 计算时,单 lane 数据率需要达到 1.2 Gbps 左右,4 lane 共 4.8 Gbps,这已经接近很多 SoC 的 MIPI 极限。如果主控只支持 4 lane,可以考虑改用 RAW10,数据率降为原来的 5/6。
CSI-2 配置的核心是算出每个 lane 的比特率。公式是:
MIPI bit rate per lane = width * height * frame_rate * bits_per_pixel / lane_count + overhead其中 overhead 包括每行的包头发送时间和消隐时间,sensor 输出的行消隐由 HTS(Horizontal Total Size)决定,datasheet 通常会给出各模式下的 HTS/VTS 寄存器默认值。我一般会先读回这两个寄存器,再用它们计算实际有效带宽。举个例子,IMX678 在 3840×2160 RAW10 60 fps 4 lane 下,如果 HTS 是 4400,VTS 是 2250,实际像素速率是 4400×2250×60 = 594 MHz,每个 lane 的比特率约 594MHz×10/4 = 1.485 Gbps,加上 10% 左右的开销,需要主控支持 1.6 Gbps 以上的 per-lane 时钟。如果你的 SoC MIPI 最高只支持 1.5 Gbps,就要把 RAW12 降成 RAW10,或者降低帧率到 30 fps。
3.2 寄存器初始化序列示例
IMX678 的寄存器初始化顺序在所有 Sony sensor 上都有固定套路:先设置输出格式和分辨率,再配置 lane 数和时钟,然后设置增益与曝光,最后启动流。下面给出一段伪代码风格的寄存器写入流程,其中寄存器地址用的十六进制占位,实际值必须从你手中的 datasheet 寄存器表里替换:
// IMX678 initialization sequence (pseudo-code) void imx678_init(void) { // 1. software reset write_reg(0x0001, 0x01); // soft reset, wait 50ms wait_ms(50); // 2. set output format: RAW10, 4 lane write_reg(0x0340, 0x03); // CSI-2 lane select: 4 lane write_reg(0x0342, 0x01); // RAW10 output // 3. set resolution 3840x2160 write_reg(0x0344, 0x00); // X output size high byte write_reg(0x0345, 0xF0); // X output size low byte write_reg(0x0346, 0x00); // Y output size high byte write_reg(0x0347, 0x08); // Y output size low byte // 4. set exposure time (unit: 1H lines) write_reg(0x0202, 0x00); // shutter high write_reg(0x0203, 0xB4); // shutter low, example 180 lines // 5. set analog gain 24 dB (example) write_reg(0x0205, 0x06); // gain high write_reg(0x0206, 0x80); // gain low // 6. start streaming write_reg(0x0002, 0x01); // stream on }这段代码里的注释说明了每一组的用途。第 1 步软件复位必须做,否则寄存器可能处于未知状态。第 2 步 lane 和格式要先于分辨率配置,因为部分寄存器只有在正确格式下才能写入有效值。第 3 步的地址和值来自 datasheet 的 output size 寄存器组。第 4 步曝光时间以行为单位,1H 时间由像素时钟和 HTS 决定,所以在调曝光前必须先确认 HTS 已经按目标帧率设置好。第 5 步增益寄存器是 16 位,需要分两次写入,ADS(数字增益)和 PGA(模拟增益)可能共用同一个寄存器对,也可能分离,务必按寄存器表确认。
3.3 同步传感器功能
多目摄像头中,多颗 IMX678 需要精确同步曝光,否则运动物体会出现时间戳不一致。IMX678 的同步有两种实现:一种是通过外部硬件触发信号,sensor 进入 slave 模式,等待 master 的 XHS/XVS;另一种是 master 输出同步信号给 slave。datasheet 强调同步分辨率为 1H 单位,意味着两颗 sensor 的曝光起始误差可以控制在一条水平扫描线的时间以内,在 60 fps 时 1H 约为 27 μs 量级。
驱动里配置同步时,需要把 master 和 slave 的寄存器设置成完全相同的模式和时序,然后让 slave 的同步模式寄存器指向外部输入。常见错误是只配了 slave,没给 master 配置同步输出,或者两边 HTS/VTS 不一致,导致同步信号对不上。调试时可以先让 master 单独输出流,用示波器量 master 的同步引脚波形,再确认 slave 的同步引脚能收到同样波形。如果 slave 图像出现水平撕裂,多半是同步信号相位没对齐,sensor 其实不支持亚行级相位调整,只能通过外部 delay line 或者 SoC 的 GPIO 相位控制来补偿。
3.4 常见错误排查
初始化 IMX678 最常见的三个问题分别是:I2C 通信不稳定、MIPI 没有时钟输出、图像色彩不对。I2C 首先检查地址是否正确,Sony sensor 通常支持 8-bit 地址 0x34 和 7-bit 地址 0x1A,如果地址错,读 chip ID 会返回 0xFF。其次检查 1.8 V 接口电源是否在 I2C 通信前稳定,某些电源芯片上电时序不满足要求会导致内部逻辑未复位。MIPI 没有时钟时,先确认 sensor 是否已经进入流模式,再确认 lane 极性是否和 SoC 一致,如果 datasheet 支持 lane 极性反转,寄存器里需要设置好。图像色彩不对通常是 CSI-2 数据位序和 RAW 格式配置不匹配,比如寄存器设成 RAW12 但 SoC 解析为 RAW10,每个像素会错位两 bit,画面会出现规则横条纹。
4. IMX678 HDR 与低照度性能:从 datasheet 到图像调优
4.1 DOL HDR 与 Clear HDR 选择
IMX678 支持两种 HDR:Digital Overlap HDR(DOL HDR)和 Clear HDR。DOL HDR 的原理是连续采集两帧或三帧不同曝光时间的图像,在 sensor 内部或 ISP 端合成。这种方式对 motion artifact 的处理取决于曝光时间交错的速度,表现为运动物体边缘可能出现鬼影。Clear HDR 则是 Sony 的专利技术,在一个曝光周期内读出多次信号并合成,具体细节 datasheet 没有公开,但从命名和 Sony 其他 sensor 的行为来看,Clear HDR 的合成发生在 sensor ADC 之前,能够保留更多高光细节,并且不会有 DOL 的长曝光和短曝光之间的时间差。
从驱动开发的角度,DOL HDR 通常需要配置多组曝光寄存器和增益寄存器,每一组对应一帧短曝光和一帧长曝光。Sony 的 DOL 模式在寄存器里一般会有一组 SHR1、SHR2、SHR3 的地址,分别代表不同曝光段的快门时间。Clear HDR 只需要配置普通的曝光和增益,sensor 内部自动处理。如果你的项目同时需要运动物体抓拍和环境高动态范围,Clear HDR 更合适;如果主要场景是静态交通卡口,DOL 的动态范围更可控。datasheet 最后提到与 STARVIS 相比单次曝光动态范围超过 8 dB,这应该是 Clear HDR 的贡献。值得注意的是,HDR 模式下 RAW 的位深仍然是 12 bit,但实际有效动态范围可能超过 12 bit 的线性表达,ISP 端需要用 HDR 解包曲线把数据映射到显示器可感知的亮度空间。
4.2 低照度与 NIR 表现
datasheet 给出的灵敏度典型值是 F5.6 下 15886 Digit/lx/s,这个数字是 12 bit ADC 转换后的值。换算成物理灵敏度,需要知道 ADC 满量程对应的电子数。如果饱和信号是 3895 Digit(12 bit),那么满量程 4095 对应的电子数大约是 3895 的 1.05 倍,也就是约 4090 e-,考虑到单位像元 2.0 μm,这个满阱容量偏低,但这是安防传感器常见的取舍,为了低照度灵敏度牺牲满阱。15886 Digit/lx/s 意味着在 1 lux 光照下,曝光 1 秒可以得到 15886 个数字值,接近满量程的 3.9 倍,因此 0.1 lux 下只需 80 ms 曝光就能得到中等亮度画面。实际上,安防摄像头通常用 F1.2 或 F1.6 镜头,光圈比 F5.6 大很多,进光量增加 (5.6/1.6)^2 ≈ 12 倍,所以 0.01 lux 以下也能出图。
NIR 性能方面,datasheet 给出了 850 nm 下 IMX678 与 IMX334 的对比图,两者增益都是 0 dB,曝光时间 33.3 ms,IMX678 的亮度明显更高。STARVIS 2 的背照式结构对近红外的提升主要来自两方面:一是背照式减少了片上金属布线的遮挡,二是像素深沟槽隔离和光电二极管深度优化让长波光子被吸收的路径更有效。如果你在 850 nm 波段做补光,IMX678 的灵敏度通常能比传统前照式 sensor 高 3 倍左右,这从数据里 12 dB 的增益优势也能看出来。但注意,NIR 下 RGB 滤色片对 850 nm 的透过率远低于可见光,如果对红外灵敏度要求极高,应该考虑黑白版本或专门的 NIR sensor,IMX678 的彩色滤光片会让红外光产生偏色。
4.3 增益与噪声平衡
图像调优时,增益分配的目标是在满足目标亮度的前提下把噪声压到最低。IMX678 的增益范围 0 dB 到 72 dB 看起来很大,但超过 30 dB 后的数字增益会放大 ADC 之前的噪声。假设 PGA 后信号为 V,噪声为 N,数字增益放大 G,则输出信噪比仍然是 V/N,而模拟增益 G_ana 同样放大信号和噪声,理论上不改变 SNR。但数字增益会受到 ADC 量化噪声限制,如果模拟增益已经让信号接近满量程,数字增益会让量化噪声更明显,所以实际做法是尽量把模拟增益用满。比如在 1 lux 环境下需要 40 dB 总增益,应该设模拟增益 30 dB,数字增益 10 dB,而不是模拟 20 dB,数字 20 dB。
那么如何验证当前增益组合是否最优?可以在固定光照下,分别用模拟增益和数字增益组合达到同样的输出亮度,抓多帧计算图像噪点标准差。噪点标准差可以用下面的 Python 脚本计算:
import cv2 import numpy as np def measure_noise(image_path): img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) if img is None: return None # 选取画面中央 100x100 的平坦区域,排除边缘 h, w = img.shape y0 = h // 2 - 50 x0 = w // 2 - 50 roi = img[y0:y0+100, x0:x0+100] std = np.std(roi.astype(np.float32)) mean = np.mean(roi) return mean, std for path in ["gain_comb1.png", "gain_comb2.png", "gain_comb3.png"]: result = measure_noise(path) if result: print(f"{path}: mean={result[0]:.1f}, std={result[1]:.2f}")这段代码用 OpenCV 读取 8-bit 灰度图,计算中心区域的均值和标准差。std越小说明噪声越低。要注意的是,必须在同一均匀光源下拍摄多帧并取平均来消除时间噪声的随机性,建议每组合拍 10 帧,计算平均 std。另外,图像中心区域的 lens shading 最小,适合做噪声对比;边缘区域会有暗角,可能影响结果。通过对比不同增益组合的 std,你可以找到 IMX678 在你当前曝光设置下的最优增益分配点。
5. 验证 IMX678 图像质量的三个实用技巧
5.1 用 datasheet 的灵敏度换算曝光时间
拿到 IMX678 后,在还没有完整驱动时,可以根据灵敏度估算合适的曝光参数。datasheet 给出 15886 Digit/lx/s 的 12 bit 转换值,这意味着在 1 lux 照度、F5.6 光圈、1 秒曝光下,输出约为 15886。实际镜头光圈和曝光时间已知时,需要达到的 target 亮度对应的曝光时间可以用这个公式计算:曝光时间 = target / (照度 × 15886 × (F5.6/F_actual)^2)。例如在 0.1 lux、F1.4 镜头下,目标亮度 2000 Digit,先计算光圈比 (5.6/1.4)^2 = 16,那么曝光时间 = 2000 / (0.1 × 15886 × 16) ≈ 0.0079 秒,也就是约 8 ms。
这个估算不考虑 IR cut 滤镜和镜头透过率损失,实际值会比计算值略低。调试时可以先按这个值设曝光,再根据图像的直方图微调。注意灵敏度值是在 Tj = 60°C 下测的,温度升高暗电流会增大,较低亮度时灵敏度表现可能不如 60°C 下的典型值。
5.2 帧率与曝光时间窗口的验证
IMX678 在 4K 60 fps 下,每一帧的周期约 16.67 ms,但曝光时间不能超过帧周期的上限。实际限制因素不是帧周期,而是 VTS(垂直总行数)和 1H 时间的乘积。如果曝光寄存器值设置过大,会导致上一帧的电荷没有完全清空就进入下一帧,图像出现拖影或滚动光带。可以通过以下方法验证正确性:设置一个接近最大值的曝光时间,比如 VTS 的 90%,然后在暗场下提高 gain 到 72 dB,观察顶部和底部亮度是否一致。如果底部明显偏亮,说明曝光时间已经与读出信号重叠,需要减小曝光或者增大 VTS 来降低帧率。
在驱动里常见做法是把曝光时间限制在 VTS 减去一个安全余量,比如 VTS - 6 行,因为末几行要留给 ADC 读出和清空像素。具体余量在 datasheet 的 timing 章节里有最小行的规定,如果没有写明,推荐从 VTS - 10 开始尝试,逐步逼近边界。
5.3 黑电平与暗电流的校正
IMX678 有垂直方向前端 20 行 OB 像素,这些像素被遮光,输出值可以反映黑电平。理想情况下 OB 区域输出应该是一个固定值,但实际会随温度和曝光时间变化。调试时可以在特定曝光下读取 OB 行的平均值,把它作为 black level 写入 ISP。暗电流造成的黑电平漂移在 60°C 下可能达到几十个 LSB,所以很多方案会在 sensor 端做一次 OB 自动校正,也就是让 sensor 读出 OB 信号并自动扣除偏移,驱动里只要开启该功能即可。
验证暗电流随温度的影响,可以用一个简单的实验:把 sensor 放进可调温箱,固定曝光时间和增益,分别记录 25°C、40°C、60°C 下的 OB 区域平均输出。用脚本对比差值,如果 60°C 比 25°C 高出超过 10% 的满量程,就需要确认是否开启了暗电流校正。如果校正后的图像仍然出现暗角偏紫的现象,可能是因为 OB 行只覆盖垂直方向的 20 行,水平方向没有 OB 像素,导致不同列的黑电平一致性存在偏差,这种 column FPN 只能靠 DPCC 或其他 ISP 降噪算法去处理。
本文还有配套的精品资源,点击获取