ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OG05B1B全局快门Sensor驱动开发实战:从上电时序到多Sensor同步

OG05B1B全局快门Sensor驱动开发实战:从上电时序到多Sensor同步 简介这份资源是豪威OG05B1B黑白CMOS图像传感器的官方技术手册面向嵌入式视觉、机器视觉与工业成像方向的硬件工程师及驱动开发者帮助其完成传感器选型、寄存器配置与系统集成。手册围绕1/2.53英寸、500万像素2592×1944的核心规格详细说明了PureCel®Plus-S像素工艺、全局快门与Nyxel®红外增强三项关键技术并给出SCCB串行控制接口、CRC校验、MIPI CSI-2高速传输、并行10-bit DVP输出及外部帧同步等接口细节同时列出机器视觉相机、物流扫码、工业条码扫描与机器人等典型应用与订购信息。资源包为1个PDF文件约9.39MB内容为2023年9月发布的Preliminary Specification版本含特性列表、应用场景、封装与订购型号等章节便于快速查阅关键参数与设计约束。目前已有301人学习下载适合需要对照官方规格进行寄存器调试、时序设计与风险评估的开发者参考。1. 拆开一份 5MP 全局快门黑白 sensor 手册OG05B1B 到底能解决什么工业产线上一条物流分拣线跑 60 fps包裹在传送带上高速移动普通滚动快门拍出来的条码边缘全是果冻效应解码率死活上不去。换成全局快门 sensor 之后同一时刻整帧曝光运动物体不再扭曲解码率直接拉满。豪威 OG05B1B 就是为这类场景准备的1/2.53 英寸、2592×1944 有效阵列、2.2 µm 像素、全局快门、黑白、支持 MIPI CSI-2 和 10-bit DVP 双输出还叠了 PureCel Plus-S 和 Nyxel 两代工艺。它面向的是机器视觉相机、物流扫码、工业读码和机器人视觉不是消费级拍照。手册本身是 Preliminary Specification v1.02023 年 9 月89-pin CSP 封装寄存器表从 0x0100 一直铺到 0x6032属于那种“拿到就能对着写驱动”的文档。下面按我实际调这颗 sensor 的顺序把手册里真正影响出图的部分拆一遍。2. 全局快门 Nyxel 的选型逻辑为什么不是随便挑一颗 5MP2.1 全局快门和滚动快门的本质差别滚动快门是逐行曝光逐行读出行与行之间存在时间差。拍静止物体没问题一旦物体在曝光窗口内移动帧内就产生几何畸变——这就是产线上条码“斜了”“弯了”的根源。全局快门是所有像素同时开始曝光、同时结束曝光再逐行读出。手册第 3 章 sensor architecture 和第 6 章 image output interface 里曝光控制和读出是解耦的GLOBAL_SHUTTER 寄存器组0x3A00~0x3AFF、0x3C00~0x3CFF单独控制曝光时序读出走 MIPI 或 DVP。选型时先问自己三个问题被摄物体在曝光时间内位移是否超过 1 个像素如果是滚动快门直接出局。OG05B1B 在 full size 下最高 60 fps按 2592 列算行周期约 8.6 µs全局快门把整帧曝光压到同一个时间窗口运动模糊只取决于曝光时间本身不再叠加行间偏移。2.2 Nyxel 在 850 nm / 940 nm 上的实际收益手册 key specifications 给了三组灵敏度数据530 nm 可见光下 19.6k e-/Lux·sec850 nm 红外下 112k e-/(µW·cm⁻²·sec)940 nm 下 77k e-/(µW·cm⁻²·sec)。这组数字是 Nyxel 技术的核心价值——传统硅基 sensor 在 850 nm 以上量子效率断崖式下跌Nyxel 通过厚硅吸收层把近红外响应拉起来。对物流扫码场景意味着什么很多包裹面单用的是红外油墨或者需要在暗光环境下补红外光。如果用普通 sensor要么加大红外补光功率发热、功耗、寿命都是问题要么拉长曝光运动模糊。OG05B1B 在 940 nm 还有 77k e-/(µW·cm⁻²·sec)补光功率可以降一档曝光时间可以缩短帧率就能保住。2.3 黑白 vs 彩色的取舍这颗是 bw黑白版本。黑白 sensor 没有 Bayer 滤色阵列每个像素都接收全波段光子量子效率比同规格彩色 sensor 高 2~3 倍分辨率也是真实的 2592×1944 而非插值。工业读码、机器视觉里的边缘检测、尺寸测量要的是对比度和信噪比不是颜色。如果应用需要颜色识别这颗就不合适得换彩色版本。2.4 输出接口选型MIPI 还是 DVP手册 features 里写了 up to 4-lane MIPI serial output 和 parallel 10-bit DVP output。MIPI 适合高帧率、长走线、抗干扰要求高的板子DVP 适合接 FPGA 或老平台时序简单但线多。我一般这么选场景推荐接口理由接 SoC如 RV1126BMIPI 4-lane带宽够走线少SoC 原生支持接 FPGA 做预处理DVP 10-bit并行时序好抓逻辑分析仪直接看长排线15 cmMIPI差分抗干扰DVP 容易串扰低功耗 always-onMIPI 低 lane 数手册支持 AO 模式到 720p3. 上电、SCCB 通信与寄存器写入从零把图出出来3.1 上电时序不能乱手册 1.5.1 节 power up sequence 给了明确约束。三路供电模拟 2.8V、数字 1.2V、I/O 1.8V。上电顺序错了轻则 PLL 不锁重则内部闩锁。我一般按这个顺序# 典型上电顺序以 GPIO 控制各路 LDO 为例 # 1. 先给 I/O 1.8V gpio set 10 1 # 1.8V LDO enable sleep 0.01 # 2. 再给数字核心 1.2V gpio set 11 1 # 1.2V LDO enable sleep 0.01 # 3. 最后给模拟 2.8V gpio set 12 1 # 2.8V LDO enable sleep 0.05 # 4. 释放 XSHUTDOWN拉高 gpio set 13 1 sleep 0.1 # 5. 提供 MCLK6~64 MHz # 此时 sensor 内部 ROM 开始加载等待 SCCB 可通信逻辑说明I/O 先上电是为了保证 XSHUTDOWN、SCCB 引脚不会在供电未建立时倒灌电流。数字核心先于模拟上电是因为 PLL 和数字逻辑需要稳定时钟域。XSHUTDOWN 拉高后 sensor 从 standby 退出内部 ROM loader 把出厂校准数据搬到寄存器这个过程大约几十毫秒之后 SCCB 才能正常读写。参数说明手册 table 1-8 给了每步之间的最小延时实际调试时如果 SCCB 读不到 ID先把每步延时加大到 100 ms 排除时序问题再逐步压回手册值。3.2 SCCB 接口和 CRC 校验SCCB 本质上是 I²C 的变体手册第 7 章给了 400 kHz 和 1000 kHz 两档时序。写寄存器时要注意 6.3.1 节的建议在 VSYNC 或 FS 之后写寄存器值避免在帧读出过程中改参数导致撕裂。// SCCB 写寄存器示例基于 STM32 硬件 I2C 封装 // OG05B1B 7-bit 地址通常是 0x608-bit 写地址 0xC0 #define OG05B1B_ADDR 0x60 int og05b1b_write_reg(uint16_t reg, uint8_t val) { uint8_t buf[3]; buf[0] (reg 8) 0xFF; // 寄存器高字节 buf[1] reg 0xFF; // 寄存器低字节 buf[2] val; // 写入值 // 手册 7.2.1 message format先发从机地址再发寄存器地址再发数据 return i2c_master_transmit(OG05B1B_ADDR, buf, 3, 100); } // 带 CRC 的写手册 7.3.1 single write with CRC int og05b1b_write_reg_crc(uint16_t reg, uint8_t val) { uint8_t buf[4]; buf[0] (reg 8) 0xFF; buf[1] reg 0xFF; buf[2] val; buf[3] sccb_crc8(buf, 3); // 前 3 字节的 CRC-8 return i2c_master_transmit(OG05B1B_ADDR, buf, 4, 100); }逻辑说明SCCB 的寄存器地址是 16 位先高字节后低字节这点和很多 8 位地址的 sensor 不同写驱动时容易翻车。CRC 校验是可选的手册 7.3 节给了单写、顺序写、块读写三种模式的 CRC 算法。工业场景下长排线容易受干扰建议开启 CRC读到 CRC 错误就重发。参数说明sccb_crc8的多项式手册没直接给但 SCCB with PEC 用的是标准 CRC-8多项式 0x07初值 0x00。如果 sensor 返回 NACK先查上拉电阻一般 2.2k~4.7k和总线电容。3.3 PLL 配置和时钟树手册 3.4 节给了 PLL1、PLL2、PLL3 三个锁相环。PLL1 通常给像素阵列和读出PLL2 给 MIPI 高速时钟PLL3 给 ISP 或辅助模块。输入时钟 6~64 MHz我一般用 24 MHz 晶振。// PLL 配置示例以 24 MHz 输入、MIPI 4-lane、full size 60fps 为目标 // 具体倍频值需按手册 A.2 PLL_CTRL 寄存器表计算 void og05b1b_pll_init(void) { // 先软复位 PLL og05b1b_write_reg(0x0300, 0x01); delay_ms(1); og05b1b_write_reg(0x0300, 0x00); // PLL1像素时钟目标约 360 MHz og05b1b_write_reg(0x0301, 0x03); // 预分频 og05b1b_write_reg(0x0302, 0x1E); // 倍频 // PLL2MIPI 时钟目标 720 Mbps/lane og05b1b_write_reg(0x0305, 0x02); og05b1b_write_reg(0x0306, 0x2D); // 等待 PLL 锁定查 PLL_LOCK 寄存器 0x0440 while (!(og05b1b_read_reg(0x0440) 0x01)) { delay_ms(1); } }逻辑说明PLL 配置是这颗 sensor 最容易翻车的地方。手册 A.2 节 PLL_CTRL 寄存器表里每个 PLL 有预分频、倍频、后分频三级算错了要么 MIPI 不出图要么帧率不对。我一般先用示波器量 MIPI 时钟 lane 的频率反推 PLL 是否锁在预期值。参数说明PLL_LOCK 寄存器 0x0440 的 bit0 是 PLL1 锁定标志bit1 是 PLL2bit2 是 PLL3。如果 100 ms 内没锁先查输入时钟是否稳定、供电是否干净。手册 table 9-4 给了时钟抖动容限晶振选型时注意。3.4 输出格式和 MIPI 数据类型手册 6.1 节 image output format 和 table 6-1 给了 MIPI RAW 数据类型。OG05B1B 输出 10-bit RAWMIPI 数据包用 RAW10 格式。配置 MIPI 时要设对 lane 数、数据速率、虚拟通道。// MIPI 输出配置4-laneRAW10 void og05b1b_mipi_init(void) { og05b1b_write_reg(0x4800, 0x04); // 4-lane 使能 og05b1b_write_reg(0x4801, 0x00); // 连续时钟模式 og05b1b_write_reg(0x4802, 0x0A); // RAW10 og05b1b_write_reg(0x4803, 0x00); // 虚拟通道 0 // 设置帧长帧率 og05b1b_write_reg(0x3800, 0x00); // HTS 高字节 og05b1b_write_reg(0x3801, 0x0A); // HTS 低字节 og05b1b_write_reg(0x3802, 0x00); // VTS 高字节 og05b1b_write_reg(0x3803, 0x08); // VTS 低字节 }逻辑说明MIPI 配置错的话接收端要么收不到包要么收到包但解不出正确像素。常见问题是 lane 数不匹配、数据速率超出接收端能力、虚拟通道号对不上。我一般先用 MIPI 分析仪抓包确认有 FSFrame Start、FEFrame End和有效的长包。参数说明0x4800 的 bit2~bit0 控制 lane 数0x4802 设数据格式。HTS/VTS 决定帧率公式是帧率 PCLK / (HTS × VTS)。手册 table 3-1 给了 normal mode 下各分辨率的推荐值。4. 避坑与排查调这颗 sensor 最容易翻车的五个地方4.1 上电后 SCCB 读不到 ID现象XSHUTDOWN 拉高、MCLK 给了SCCB 读 0x0000 或 0x0001 返回全 0 或全 FF。原因最常见的是上电顺序不对模拟 2.8V 先于数字 1.2V 建立导致内部 ROM loader 没跑起来。其次是 MCLK 频率超出 6~64 MHz 范围或者 XSHUTDOWN 释放后延时不够。解决用示波器按手册 table 1-8 逐条核对上电时序每步延时先放大到 100 ms。MCLK 用信号发生器给一个干净的 24 MHz 方波。如果还是读不到查 SCCB 上拉电阻和地址8-bit 写地址 0xC0读地址 0xC1。4.2 PLL 不锁现象PLL_LOCK 寄存器 0x0440 一直读不到锁定标志MIPI 无输出。原因PLL 倍频参数算错或者输入时钟抖动太大。手册 3.4 节每个 PLL 的配置有约束条件比如 VCO 频率范围超出就不锁。解决按手册 A.2 节寄存器表重新算一遍预分频/倍频/后分频确保 VCO 落在规定范围。输入时钟换低抖动的晶振或有源晶振。如果用的是 SoC 输出的 MCLK查 SoC 时钟树是否配错。4.3 MIPI 出图但画面撕裂或错位现象接收端能收到帧但图像上半部分和下半部分对不上或者有横向条纹。原因寄存器写入时机不对。手册 6.3.1 节明确建议在 VSYNC 或 FS 之后写寄存器如果在帧读出过程中改曝光、增益或窗口参数当前帧就会撕裂。解决把所有动态参数更新放到 VSYNC 中断里做或者用 group hold 机制手册 6.4 节。Group hold 允许你把一组寄存器配置缓存起来在下一帧起始时原子生效避免中间态。4.4 红外补光下图像过曝或噪点大现象850 nm 补光一开画面中间过曝边缘噪点明显。原因Nyxel 在近红外响应很高如果 AEC/AGC 还是按可见光调的目标亮度红外一进来就过曝。另外黑白 sensor 没有 IR cut filter环境红外和补光红外叠加。解决手册第 4 章 AEC/AGC 算法支持 average-based 自动调整可以设目标亮度。红外场景下把目标亮度调低或者切到 manual 模式固定曝光增益。如果噪点大查 BLC黑电平校准是否使能手册 3.5 节 BLC 寄存器 0x4000~0x40F9 要按温度配置。4.5 高温下图像出现坏点或黑电平漂移现象环境温度升到 60°C 以上画面出现固定白点或整体偏亮。原因sensor 结温升高暗电流增大黑电平漂移。手册 9.2 节 functional temperature 给的是 -30°C 到 85°C 结温但高温下 DPC坏点校正和 BLC 需要重新校准。解决使能 DPC 模块手册 5.3 节寄存器 0x5240~0x525B并定期在遮黑条件下重新校准 BLC。如果应用环境温度高PCB 设计时注意散热手册 10.3 节给了 PCB design recommendations。5. 进阶技巧用 group hold embedded data 做多 sensor 同步多 sensor 同步是工业视觉里的硬需求比如双目测距、多角度检测。OG05B1B 手册 3.8 节给了 FSINFrame Sync Input引脚支持外部帧同步。我一般这么用主 sensor 输出 VSYNC 给从 sensor 的 FSIN从 sensor 配成 external frame synchronization 模式这样两颗 sensor 曝光起始时刻对齐到同一个时钟沿。// 从 sensor 配置为外部帧同步模式 void og05b1b_slave_sync_init(void) { // 使能 FSIN 输入 og05b1b_write_reg(0x3A00, 0x01); // FSIN enable og05b1b_write_reg(0x3A01, 0x00); // 上升沿触发 // 配置为 external frame sync 模式 og05b1b_write_reg(0x3A02, 0x01); // 设置 FSIN 到实际曝光的延时按手册 3.8.1 计算 og05b1b_write_reg(0x3A03, 0x10); // 使能 group hold确保参数原子更新 og05b1b_write_reg(0x3200, 0x01); // group hold enable }逻辑说明FSIN 同步的精度取决于主从之间的时钟同源。如果两颗 sensor 共用同一个 MCLK同步误差在一个时钟周期内如果各自用晶振误差会累积。手册 3.8.1 节给了 FSIN 到 VSYNC 的时序图配置延时寄存器时要按图算。参数说明0x3A00 的 bit0 使能 FSIN0x3A01 设触发边沿0x3A02 设同步模式。Group hold 的寄存器在 0x3200~0x3254手册 6.4 节给了 group configuration、group hold、group launch 三步流程。AB mode6.4.4 节支持两组配置交替生效适合需要快速切换曝光的场景。另一个实用技巧是 embedded data。手册 6.5 节给了 embedded data formatsensor 可以在每帧图像数据前后插入一行嵌入式数据包含曝光时间、增益、帧号、温度等信息。接收端解析这行数据就能知道当前帧的实际参数不用去读寄存器。对调试和日志非常有用。// 使能 embedded data 输出 void og05b1b_embedded_data_init(void) { og05b1b_write_reg(0x4600, 0x01); // embedded data enable og05b1b_write_reg(0x4601, 0x04); // 每帧 4 行 embedded data // 选择要输出的字段曝光、增益、帧号、温度 og05b1b_write_reg(0x4602, 0x0F); }逻辑说明embedded data 占用帧的有效行数配置时注意别和图像窗口重叠。手册 6.5.1 节给了数据格式每行有固定的 header 和字段偏移。接收端解析时先找 header再按偏移取字段。参数说明0x4600 使能0x4601 设行数0x4602 是字段掩码。如果接收端发现图像高度比预期多几行先查 embedded data 是否使能。从那以后我每次调新 sensor都强制先跑一遍上电时序核对、SCCB 读 ID、PLL 锁定检查、MIPI 抓包这四步确认底层通了再动 ISP 和算法。这颗 OG05B1B 的手册寄存器表很全A 章从 0x0100 铺到 0x6032对着表写驱动基本不会迷路但上电和 PLL 这两块一定要按手册时序来省这一步后面全是玄学问题。希望帮到你。本文还有配套的精品资源点击获取
返回列表