3. Sensor通信接口:MIPI CSI-2物理层与协议层、I2C/SPI控制接口详解

在嵌入式视觉系统中,Sensor与主控SoC之间的通信分为两条独立的链路:数据通道(MIPI CSI-2)负责高速传输图像像素数据;控制通道(I2C/SPI)负责寄存器读写、参数配置与AF对焦控制。本章从物理层到协议层拆解这两条链路,为后续初始化与AF联调打下硬件基础。

3.1 MIPI CSI-2 物理层:差分信号与D-PHY

MIPI CSI-2 物理层基于 D-PHY 标准,采用差分信号传输,具有低功耗、低电磁干扰(EMI)的特点。每个数据通道由一对差分线(Dp/Dn)组成,时钟通道独立传输DDR时钟。

关键指标: 单通道速率通常为 400 Mbps ~ 2.5 Gbps;4-lane 配置下总带宽可达 10 Gbps 以上,满足 4K@60fps 原始数据需求。
实战提示: 硬件设计时,MIPI 差分对必须等长布线(误差 < 5 mm),且远离高频开关电源,否则会导致眼图闭合、误码率上升。
MIPI CSI-2 D-PHY 物理层连接示意 Sensor SoC (ISP) CLK+ / CLK- (DDR) Data Lane 0 (D0+ / D0-) Data Lane 1 (D1+ / D1-) Data Lane 2 (D2+ / D2-) Data Lane 3 (D3+ / D3-) 每个 Lane 包含一对差分线,时钟 Lane 独立;数据 Lane 数量可配置(1/2/4)

3.2 MIPI CSI-2 协议层:数据包结构与帧格式

协议层定义了数据如何打包成 长数据包 和 短数据包,以及帧起始(FS)、帧结束(FE)、行起始(LS)等同步机制。

常见踩坑: 部分 Sensor 在切换分辨率或帧率后,FS/FE 包间隔异常,导致 ISP 无法锁定帧同步。调试时务必用逻辑分析仪抓取 CSI-2 包序列,确认帧头帧尾完整。
CSI-2 协议层:帧数据包流 FS (0x00) Line 1 Data Line 2 Data … Line N Data FE (0x01) 每帧以 FS 短包开始,中间为 N 行长数据包,以 FE 短包结束 行数据包内包含 ECC 校验,帧结束包包含 CRC 校验

3.3 I2C 控制接口:Sensor 寄存器读写

I2C(Inter-Integrated Circuit)是 Sensor 最常用的控制总线,采用两线制:SCL(时钟)和 SDA(数据)。每个 Sensor 有唯一的 7 位或 10 位设备地址,主控通过地址寻址进行读写操作。

3.3.1 I2C 时序与速率

包类型 标识符 内容 长度
帧起始短包 0x00 帧号、时间戳 4 字节
帧结束短包 0x01 帧号、校验 4 字节
行起始短包 0x02 行号 4 字节
图像数据长包 0x2B / 0x2C RAW / YUV 像素数据 可变(最大 64 KB)
模式 时钟频率 最大传输速率 适用场景
标准模式 100 kHz 100 kbps 初始化配置、低速率场景
快速模式 400 kHz 400 kbps 常用模式,AF 对焦控制
快速+模式 1 MHz 1 Mbps 高帧率配置更新
实战建议: 初始化阶段使用 100 kHz 确保兼容性;AF 对焦控制建议提升至 400 kHz 以减少写入延迟。若 Sensor 支持,可启用 I2C 连续写模式(Auto-Increment)批量写入寄存器。

3.3.2 I2C 读写流程示例

以下为 Sensor 寄存器 0x3012 写入 0x42 的典型 I2C 时序(16 位寄存器地址):

// I2C 写操作:设备地址 0x6C (7-bit) + 写位 0
START | 0xD8 (0x6C << 1 | 0) | ACK | 0x30 (Reg High) | ACK | 0x12 (Reg Low) | ACK | 0x42 (Data) | ACK | STOP

// I2C 读操作:先写寄存器地址,再重新发起读
START | 0xD8 | ACK | 0x30 | ACK | 0x12 | ACK | REPEATED START | 0xD9 (读) | ACK | 0x42 (Data) | NACK | STOP
调试陷阱: 部分 Sensor 在 I2C 读操作前必须发送 STOP 信号,否则会返回错误数据。务必查阅 Sensor 手册的“Read Sequence”章节。

3.4 SPI 控制接口:高速配置场景

SPI(Serial Peripheral Interface)采用四线制:SCLK、MOSI、MISO、CS。相比 I2C,SPI 速率更高(可达 10 MHz+),适合需要批量写入大量寄存器的高端 Sensor。

特性 I2C SPI
线数 2 (SCL, SDA) 4 (SCLK, MOSI, MISO, CS)
最大速率 1 MHz (Fast+) 10 ~ 50 MHz
寻址方式 设备地址 + 寄存器地址 片选 + 命令/地址
多设备支持 总线式,地址区分 独立片选线
典型应用 寄存器配置、AF 控制 固件下载、批量校准参数
选型原则: 消费类 Sensor 普遍使用 I2C(引脚少、成本低);工业/车载 Sensor 倾向 SPI(抗干扰强、速率高)。AF 对焦控制通常走 I2C,因为数据量小且需要频繁读写。
I2C 与 SPI 控制接口对比 I2C 总线 主控 Sensor EEPROM SCL / SDA SPI 总线 主控 Sensor Flash SCLK / MOSI / MISO / CS I2C 适合多设备共享总线;SPI 适合高速单设备通信,片选线独立

3.5 控制接口在 AF 对焦中的实战应用

AF 对焦控制通常通过 I2C 写入 VCM(音圈马达)驱动芯片的寄存器来实现。典型流程如下:

  1. 初始化 VCM 驱动: 写入模式寄存器,设置驱动电流范围(如 0 ~ 1023 DAC 值)。
  2. 写入目标位置: 向 VCM 数据寄存器写入 10 位或 12 位位置码。
  3. 读取状态: 轮询 VCM 状态寄存器,确认马达到位。
  4. 异常处理: 若超时未到位,执行复位或重新校准。
// 示例:通过 I2C 控制 VCM 移动到位置 512 (0x200)
// VCM 设备地址: 0x18, 数据寄存器: 0x03
uint16_t target_pos = 512;  // 10-bit 范围 0~1023

// 写操作:寄存器地址 0x03,数据高字节 + 低字节
i2c_write(0x18, 0x03, (target_pos >> 8) & 0x03);  // 高 2 位
i2c_write(0x18, 0x04, target_pos & 0xFF);          // 低 8 位

// 读取状态寄存器 0x01,检查 bit[0] 是否置位
uint8_t status = i2c_read(0x18, 0x01);
if (status & 0x01) {
    printf("AF 到位\n");
} else {
    printf("AF 移动中或异常\n");
}
联调技巧: 使用 I2C 总线分析仪抓取 AF 控制时序,确认写入值与 Sensor 实际响应一致。部分 VCM 驱动需要等待 5~10 ms 才能读取到位状态,切勿连续轮询导致总线阻塞。

3.6 本章小结

  • MIPI CSI-2 物理层 基于 D-PHY 差分信号,时钟 Lane 独立,数据 Lane 可配置 1/2/4 条。
  • 协议层 以 FS/FE 短包界定帧边界,行数据长包携带像素,ECC/CRC 保障传输可靠性。
  • I2C 是 Sensor 控制的主流接口,两线制、支持多设备,速率 100 kHz ~ 1 MHz。
  • SPI 四线制、速率更高,适用于固件下载和批量参数写入。
  • AF 对焦控制 通常走 I2C,通过 VCM 驱动寄存器写入位置码,需注意时序等待和状态轮询。