基于 MIPI 的图像数据传输详解(CSI-2、D-PHY/C-PHY、打包与带宽)
总体架构与功能划分
控制通道:通常采用 IC 或 I3C 接口进行传感器配置,包括寄存器设置、工作模式切换及时钟管理,该通路独立于图像数据流。
数据通道:使用 MIPI CSI-2 协议在 D-PHY 或 C-PHY 物理层上传输图像像素流以及行场同步信息。接收端的 CSI-2 模块负责帧重组,并将数据送至 ISP 或系统内存处理。
物理层技术对比:D-PHY 与 C-PHY
D-PHY
- 结构组成:包含一条差分时钟通道和 N 条差分数据通道(N 取值范围为 1 到 4 或 6),数据通过双倍速率(DDR)方式在时钟边沿采样。
- 运行模式:支持 LP(低功耗单端信号,用于空闲或控制)和 HS(高速差分传输,用于有效数据发送)两种状态;空闲状态默认为 LP-11。
- 速率计算:每条 lane 的带宽以 Mbps 表示,总有效吞吐量约为 lane_rate × lane 数量。
C-PHY
- 连接拓扑:以 Trio 为单位(每组 3 根线缆),无需独立时钟线,采用相位过渡编码机制;可并行使用多个 Trio 提升带宽。
- 符号速率:以 Msps(百万符号/秒)计量,等效数据吞吐量经验公式为:Msps × 2.286 × Trio 数量。
Frame Start (FS)
Frame End (FE)
Line Start (LS)
Line End (LE)
Header + Payload + CRC16
CSI-2 协议层解析:包结构与虚拟通道机制
虚拟通道(VC):编号从 0 到 3(高版本支持更多),允许多路视频流或辅助数据在同一物理链路上复用传输。
包类型分类:
- 短包(Short Packet):不携带负载,主要用于传输行同步、帧同步、时间戳及其他控制指令。
- 长包(Long Packet):用于承载实际图像数据或嵌入式信息流。
长包格式(4 字节头部 + 负载 + 尾部校验):
- Data ID:8 位字段,格式为 [DT:6…0 | VC:7],标识数据类型与所属虚拟通道。
- Word Count:16 位,表示 payload 所含字节数。
- ECC:8 位 Hamming 编码,保护前 24 位头部信息,具备单比特纠错能力。
- 尾部 CRC:采用 CRC16-CCITT 对 payload 进行完整性校验。
常见数据类型及其像素打包方式
典型数据类型(DT)包括:
- RAW8 / RAW10 / RAW12 / RAW14
- YUV422 / YUV420(8-bit 或 10-bit)
RAW10 打包规则(每 4 像素压缩为 5 字节):
B0 = P0[7:0]
B1 = P1[7:0]
B2 = P2[7:0]
B3 = P3[7:0]
B4 = P0[9:8] | (P1[9:8] << 2) | (P2[9:8] << 4) | (P3[9:8] << 6)
RAW12 打包规则(每 2 像素对应 3 字节):
B0 = P0[7:0]
B1 = P1[7:0]
B2 = P0[11:8] | (P1[11:8] << 4)
FS → (LS → LongPacket(Payload 行像素) → LE) × 行数 → FE
图像行帧时序与 LP/HS 模式切换机制
图像帧由一系列行构成,每行前后伴随特定控制序列。传输过程中:
- 进入有效数据阶段前,链路从 LP 状态切换至 HS 模式开始高速传输。
- 数据发送完成后退出 HS 回到 LP-11 空闲态,便于维持低功耗并准备下一次传输。
- 非图像数据时段(如消隐期)使用 LP 模式进行低速通信或保持待机。
带宽估算与链路设计方法
粗略计算图像负载(忽略协议开销):
- 所需带宽 ≈ 分辨率宽度 × 高度 × 帧率 × 每像素字节数
Payload_bps ≈ width × height × fps × bits_per_pixel
D-PHY 链路容量评估:
- 理论最大吞吐 = lane 数 × lane 速率
- 实际效率受包头、空隙、短包等因素影响,效率因子通常取 0.85~0.92。
Link_bps ≈ lanes × lane_rate × η
η
C-PHY 链路容量参考:
Link_bps ≈ trios × Msps × 2.286 × η
应用示例:12MP 图像(4000×3000)@30fps,RAW10 格式
- 原始数据量 ≈ 4000 × 3000 × 30 × 1.25 = 4.5 Gbps
- 考虑协议开销后需 ≥ 4.0 Gbps 有效带宽
- D-PHY 4-lane @ 1.2 Gbps 可提供 4.8 Gbps,满足需求且有余量
Payload ≈ 4000×3000×30×10 ≈ 3.6 Gbps
η=0.9
行步长与对齐要求:RAW10 每行 payload 字节数约为 (width × 10)/8,常按 16 或 32 字节边界对齐,具体 Word Count 应以传感器寄存器配置为准。
ceil(width × 10 / 8)
错误检测与系统健壮性保障
- 头部 ECC:8 位 Hamming 码,可检测并纠正单比特错误,提升头部可靠性。
- 负载 CRC:CRC16-CCITT 校验 payload 数据,主机据此判断是否丢弃受损帧或尝试恢复。
- 抗干扰设计:针对噪声与信号抖动引起的误码,应确保 PCB 布线匹配、阻抗连续、终端匹配良好;接收端宜具备丢包处理、重同步与帧重建机制。
RAW 数据解包与行步长计算实例
以下为 Python 实现的 RAW10 解包代码示例,将压缩字节流还原为 16 位像素数组(仅低 10 位有效):
# RAW10 解包为 16-bit(低 10 位有效)
import numpy as np
def unpack_raw10(line_bytes, width):
n_groups = width // 4
out = np.zeros(width, dtype=np.uint16)
i = 0
j = 0
while i < n_groups:
b0 = line_bytes[j+0]
b1 = line_bytes[j+1]
b2 = line_bytes[j+2]
b3 = line_bytes[j+3]
b4 = line_bytes[j+4]
out[i*4+0] = b0 | ((b4 & 0x03) << 8)
out[i*4+1] = b1 | (((b4 >> 2) & 0x03) << 8)
out[i*4+2] = b2 | (((b4 >> 4) & 0x03) << 8)
out[i*4+3] = b3 | (((b4 >> 6) & 0x03) << 8)
i += 1
j += 5
return out
工程实践建议与调试清单
- 确认传感器输出格式(DT、VC、打包方式)与接收端配置一致。
- 检查物理层参数(lane 数、速率、Trio 数)是否满足带宽需求。
- 验证 LP/HS 切换时序是否符合规范,避免建立/保持时间违规。
- 监控 ECC 和 CRC 错误计数,定位潜在硬件问题。
- 关注行步长对齐与内存缓冲区规划,防止 DMA 溢出或错位。
- 优化 PCB 走线长度匹配、差分阻抗控制与电源去耦设计。
- 利用协议分析仪抓包排查短包命令与长包结构异常。
在处理图像数据时,RAW12格式的解包过程需要将原始字节流转换为16位像素值,其中低12位为有效数据。以下是一个基于numpy实现的unpack_raw12函数:
首先计算完整的数据组数量:
n_groups = width // 2
初始化输出数组:
out = np.zeros(width, dtype=np.uint16)
设置索引变量i和j用于遍历输入字节流:
i = 0
j = 0
进入循环处理每组3个字节对应2个像素的数据块:
while i < n_groups:
b0 = line_bytes[j+0]
b1 = line_bytes[j+1]
b2 = line_bytes[j+2]
out[2*i+0] = ((b2 & 0x0F) << 8) | b0
out[2*i+1] = ((b2 >> 4) << 8) | b1
i += 1
j += 3
若宽度为奇数,则最后一个像素单独处理:
if width % 2:
out[-1] = line_bytes[j]
返回结果数组:
return out
Frame Start (FS)
对于另一种打包方式,涉及更复杂的位操作组合,其核心逻辑如下:
b3 = line_bytes[j+3]
b4 = line_bytes[j+4]
out[4*i+0] = ((b4 & 0x03) << 8) | b0
out[4*i+1] = ((b4 & 0x0C) << 6) | b1
out[4*i+2] = ((b4 & 0x30) << 4) | b2
out[4*i+3] = ((b4 & 0xC0) << 2) | b3
i += 1
j += 5
处理剩余不足一组的数据部分:
rem = width % 4
if rem:
tail = line_bytes[j:j+rem+1]
for k in range(rem):
shift = (k*2)
out[4*n_groups+k] = (((tail[-1] >> shift) & 0x03) << 8) | tail[k]
最终返回完整解包后的输出数组:
return out
Frame End (FE)
工程实践中的关键注意事项与排查要点
色彩矩阵与动态范围匹配:确保所使用的色彩标准(如BT.601、BT.709或BT.2020)与位深设置一致,防止因色彩空间不匹配导致显示偏色问题。
低功耗与高速模式切换时序(LP/HS):HS Entry和Exit阶段配置不当可能导致首行或末行数据丢失。应确认LP-11空闲状态维持正确,并合理设定T_HS_SET与T_HS_EXIT参数。
带宽规划与余量预留:依据最大分辨率、帧率及位深进行带宽预算,充分考虑协议开销与信号抖动因素。D-PHY lane速率或C-PHY Msps需合理配置以满足传输需求。
Word Count与对齐要求:确保每行字节数与硬件寄存器中配置的对齐边界相匹配,避免出现行错位或CRC校验失败等异常。
物理层布线规范:差分信号线应保持长度匹配,严格控制阻抗并实施恰当端接措施,以降低反射与串扰风险。
虚拟通道管理:在多数据流复用场景下,必须保证发送端分配的虚拟通道(VC)编号与接收端解析规则一致,防止不同数据流之间发生混淆。
错误监控与响应机制:持续监测ECC与CRC错误统计,以及帧同步事件,一旦发现异常可触发降级策略或系统重启流程,提升链路鲁棒性。
总结
MIPI CSI-2协议依托于D-PHY或C-PHY物理层,采用分包机制高效传输图像信息。短包用于传递行、帧同步信号,长包则承载实际像素数据。构建稳定可靠的图像传输链路,依赖于精确的带宽估算、正确的数据打包与对齐方式、完善的错误检测能力,以及对LP/HS模式切换时序的精细控制。


雷达卡


京公网安备 11010802022788号







