2. Sensor硬件接口:MIPI CSI-2协议详解、D-PHY物理层、I2C/SPI控制接口、硬件设计要点与信号完整性
做Sensor驱动,绕不开硬件接口。说白了,Sensor和主控之间就干两件事:传图像数据、发控制指令。图像数据走MIPI,控制指令走I2C或SPI。这两条路走不通,你代码写得再漂亮也没用。
我个人习惯,拿到一块新的Sensor模组,第一件事不是看寄存器手册,而是先翻硬件接口原理图。为什么?因为很多坑在硬件设计阶段就埋下了,后面软件怎么调都救不回来。
2.1 MIPI CSI-2协议概览
MIPI CSI-2,全称Camera Serial Interface 2,是移动设备和嵌入式领域最主流的摄像头图像数据传输标准。它定义了从Sensor到应用处理器的数据通道。
整个协议分三层:
- 应用层:定义数据格式,比如RAW8、RAW10、YUV422、JPEG等。
- 协议层:负责数据打包、解包、校验,包括长包、短包、ECC校验。
- 物理层:D-PHY或C-PHY,负责电气信号传输。
我遇到过不少工程师,只关心应用层配什么格式,协议层和物理层基本不管。结果呢?图像花屏、丢帧、信号不稳定,查半天找不到原因。
核心要点:CSI-2是分层设计,每一层都可能出问题。调试时要从物理层往上查,别一上来就怀疑Sensor寄存器配错了。
2.2 D-PHY物理层详解
D-PHY是MIPI联盟定义的物理层标准,目前主流是1.2版本,支持最高2.5Gbps/lane的数据速率。一个典型的D-PHY链路包含:
- 时钟通道:一对差分线,DDR模式,上升沿和下降沿都采样数据。
- 数据通道:1-4对差分线,每lane独立传输数据。
D-PHY有两种工作模式:
| 模式 | 电压摆幅 | 速率 | 用途 |
|---|---|---|---|
| LP(低功耗) | 0-1.2V | ≤10Mbps | 控制信号、总线初始化 |
| HS(高速) | 200mV差分 | 80Mbps-2.5Gbps | 图像数据传输 |
嗯,这里要注意:LP模式和HS模式是分时复用同一对差分线的。LP模式用来传控制指令,比如帧同步、行同步、进入/退出高速模式。HS模式才是真正传图像数据的时候。
我曾经在一个项目里,Sensor输出的图像总是第一帧花屏。查了三天,最后发现是D-PHY从LP切换到HS时,时序没对齐,导致第一帧数据的前几个像素被吞掉了。后来在驱动里加了一个dummy帧,问题解决。
避坑指南:D-PHY的LP→HS切换时序非常关键。建议在驱动初始化时,先发一个空帧让链路稳定,再开始传有效数据。
2.3 CSI-2数据包格式
CSI-2的数据传输以包为单位。包分两种:
- 短包:32位,用于帧同步、行同步、帧结束等控制信号。
- 长包:包含包头、数据负载、包尾。包头有ECC校验,包尾有CRC校验。
一个典型的帧传输流程:
- 发送帧开始短包(FS)
- 发送行开始短包(LS)
- 发送一行图像数据的长包
- 发送行结束短包(LE)
- 重复2-4直到所有行传完
- 发送帧结束短包(FE)
为什么要有这些同步包?你想想看,接收端怎么知道一帧从哪里开始、到哪里结束?全靠这些短包来对齐。如果短包丢了或者ECC校验不过,接收端就会丢帧。
警告:CSI-2的ECC只能纠正单比特错误,检测双比特错误。如果链路噪声大,建议降低速率或增加lane数,而不是指望ECC能救你。
2.4 I2C/SPI控制接口
Sensor的寄存器配置,基本都走I2C或SPI。这两种接口各有优劣:
| 特性 | I2C | SPI |
|---|---|---|
| 引脚数 | 2(SDA+SCL) | 3-4(SCLK+MOSI+MISO+CS) |
| 速率 | 100kHz-3.4MHz | 10MHz-50MHz |
| 寻址方式 | 7位/10位地址 | 片选CS |
| 多设备支持 | 总线式,地址区分 | 每个设备独立CS |
| 适用场景 | 低速配置、多设备 | 高速配置、单设备 |
我个人习惯,如果Sensor的寄存器配置量不大(比如几百个寄存器),用I2C就够了。但如果Sensor需要做在线校准、查表更新、或者有大量参数需要快速写入,我会优先选SPI。
我记得有一次做一款高帧率Sensor,需要每帧更新一组增益和曝光参数。I2C跑400kHz,一帧时间只有8ms,结果I2C写寄存器的时间就占了3ms,留给曝光的时间严重不足。后来换成SPI,速率提到20MHz,写寄存器时间降到0.1ms,问题解决。
技巧:I2C总线上的上拉电阻很关键。4.7kΩ是通用值,但总线电容大时要换小一点(比如2.2kΩ),否则上升沿太慢,速率上不去。
2.5 硬件设计要点与信号完整性
这部分是实战中最容易被忽视的。很多工程师觉得原理图画对了就行,PCB布局布线随便搞搞。结果板子打回来,MIPI信号眼图一塌糊涂。
我总结了几条硬性规则:
- 差分阻抗控制:MIPI D-PHY要求差分阻抗100Ω±10%,单端阻抗50Ω。必须和板厂确认叠层结构。
- 等长布线:同一对差分线内,P和N的长度差不超过5mil。不同lane之间,长度差不超过100mil。
- 远离干扰源:MIPI走线要远离时钟、DC-DC、射频天线。至少保持3倍线宽的距离。
- 减少过孔:每个过孔引入约0.5pF寄生电容,会劣化信号质量。能不走过孔就别走。
- 端接匹配:接收端需要100Ω差分端接电阻,位置尽量靠近接收引脚。
我曾经在一个项目里,Sensor和主控距离只有3cm,但MIPI信号就是不稳定。后来用示波器一看,眼图几乎闭合了。查了半天,发现是PCB上MIPI走线旁边走了一根DC-DC的开关节点,高频噪声耦合进来了。重新改板,把MIPI走线包地处理,问题解决。
警告:MIPI走线严禁跨越分割平面。如果必须跨层,要在换层处加地过孔。否则回流路径被切断,信号完整性会急剧恶化。
2.6 知识结构图
下面这张图梳理了本章的核心知识体系,从硬件接口到协议栈,再到设计要点,一目了然。
2.7 本章小结
Sensor硬件接口这块,说白了就是两条路:MIPI传数据,I2C/SPI传控制。MIPI这边要搞懂D-PHY的LP/HS模式切换、CSI-2的包结构、以及硬件设计上的信号完整性。I2C/SPI这边要选对接口、配好速率、注意上拉和时序。
我个人觉得,很多驱动问题追根溯源,都是硬件接口没搞透。你花一周时间把MIPI眼图调好、把I2C时序测准,后面写驱动会顺畅得多。否则,你会在各种莫名其妙的问题上反复折腾,浪费大量时间。
一句话总结:硬件接口是Sensor驱动的根基。根基不稳,上层代码再漂亮也是空中楼阁。