简介Sony IMX678 datasheet 中文解读版面向安防摄像头、计算机视觉与机器人视觉领域的硬件工程师、驱动开发人员及图像算法研究者。该芯片为索尼半导体推出的对角线8.86 mmType 1/1.8CMOS图像传感器有效像素约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 mmType 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 里有指定常见的是 0x347-bit 地址 0x1A这个值可以通过 silkscreen 和参考设计确认。2.3 帧率与读出模式Basic Drive Mode 表格里只列了两种模式All-pixel 3840×2160 60 fps 和 Horizontal/Vertical 2/2-line binning 1920×1080 60 fpsADC 都是 10 bit。这里的 60 fps 是 12 bit 和 10 bit 都支持的最大帧率也就是说 IMX678 并不需要为了 60 fps 牺牲为 10 bit12 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/PGACDS相关双采样和 PGA可编程增益放大器是 sensor 模拟前端的两部分。CDS 通过采样像素复位电平和信号电平做差值消除复位噪声和固定模式噪声IMX678 的 CDS 是内置的不需要外部配置。PGA 的增益范围 datasheet 写的是 0 dB 到 30 dB 为模拟增益步进 0.3 dB30.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 输出的行消隐由 HTSHorizontal Total Size决定datasheet 通常会给出各模式下的 HTS/VTS 寄存器默认值。我一般会先读回这两个寄存器再用它们计算实际有效带宽。举个例子IMX678 在 3840×2160 RAW10 60 fps 4 lane 下如果 HTS 是 4400VTS 是 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 支持两种 HDRDigital Overlap HDRDOL 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 Digit12 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 msIMX678 的亮度明显更高。STARVIS 2 的背照式结构对近红外的提升主要来自两方面一是背照式减少了片上金属布线的遮挡二是像素深沟槽隔离和光电二极管深度优化让长波光子被吸收的路径更有效。如果你在 850 nm 波段做补光IMX678 的灵敏度通常能比传统前照式 sensor 高 3 倍左右这从数据里 12 dB 的增益优势也能看出来。但注意NIR 下 RGB 滤色片对 850 nm 的透过率远低于可见光如果对红外灵敏度要求极高应该考虑黑白版本或专门的 NIR sensorIMX678 的彩色滤光片会让红外光产生偏色。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:y0100, x0:x0100] 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 降噪算法去处理。本文还有配套的精品资源点击获取
