2. 硬件接口与电气特性:I2C控制接口时序分析、MIPI D-PHY物理层配置、电源管理与上电时序要求
做Sensor驱动,说白了就是跟硬件打交道。你代码写得再花哨,硬件接口没配好,Sensor就是死活不干活。这一章我们重点聊聊三个硬骨头:I2C怎么调通、MIPI D-PHY怎么配、电源时序怎么控。嗯,这些都是我当年踩坑踩出来的经验。
2.1 I2C控制接口时序分析
IMX系列Sensor的寄存器读写,基本都走I2C。速度一般支持标准模式(100kHz)和快速模式(400kHz)。我个人习惯,调试阶段先用100kHz,稳定了再切400kHz。
2.1.1 时序参数关键点
I2C时序,说白了就是SCL和SDA两根线的配合。有几个参数你必须在Datasheet里找到:
| 参数 | 符号 | 典型值(快速模式) | 说明 |
|---|---|---|---|
| SCL时钟频率 | fSCL | 400 kHz | 不要超,超了Sensor不认 |
| 保持时间(起始条件) | tHD;STA | 0.6 μs | SDA下降沿后SCL下降沿的最小间隔 |
| 建立时间(停止条件) | tSU;STO | 0.6 μs | SCL上升沿后SDA上升沿的最小间隔 |
| 数据保持时间 | tHD;DAT | 0 ns | SCL下降沿后数据需保持 |
| 数据建立时间 | tSU;DAT | 100 ns | 数据在SCL上升沿前需稳定 |
2.1.2 典型的读写时序
IMX Sensor的I2C地址通常是0x1A(7位地址),写操作就是发设备地址+写位(0),然后发寄存器地址,再发数据。读操作稍微麻烦点,要先写寄存器地址,再发设备地址+读位(1),然后收数据。
下面是我常用的一个I2C写操作代码片段,注意看时序的严谨性:
// IMX Sensor I2C 单字节写
int imx_i2c_write_reg(struct i2c_client *client, uint16_t reg, uint8_t val)
{
int ret;
uint8_t buf[3];
buf[0] = (reg >> 8) & 0xFF; // 高字节地址
buf[1] = reg & 0xFF; // 低字节地址
buf[2] = val; // 数据
ret = i2c_master_send(client, buf, 3);
if (ret != 3) {
dev_err(&client->dev, "I2C write error: %d\n", ret);
return -EIO;
}
return 0;
}
2.2 MIPI D-PHY物理层配置
MIPI D-PHY是Sensor和SoC之间传输图像数据的高速串行接口。IMX系列Sensor通常支持1-4 Lane的配置。我个人建议,能走4 Lane就别走2 Lane,带宽冗余大一些,调试起来也省心。
2.2.1 D-PHY 分层结构
先看一张图,把D-PHY的物理层结构理清楚:
2.2.2 Lane速率与带宽计算
IMX系列Sensor的Lane速率通常在400 Mbps到1.5 Gbps之间。怎么算?很简单:
总带宽 = Lane速率 × Lane数量 × 2(DDR)
举个例子,IMX335在1080P 60fps下,RAW10格式,每像素10bit。需要的带宽大约是:
- 1920 × 1080 × 60 × 10 = 1.244 Gbps
- 如果用4 Lane,每条Lane需要 1.244 / 4 = 311 Mbps
- 留点余量,配到400 Mbps就稳了
2.2.3 D-PHY 配置寄存器
IMX Sensor的D-PHY配置通常集中在几个关键寄存器里:
| 寄存器名 | 地址 | 功能 |
|---|---|---|
| PHY_CTRL | 0x3000 | 使能/禁用PHY,选择HS/LP模式 |
| LANE_EN | 0x3002 | 使能各Lane,按bit位控制 |
| CLK_LANE_CTRL | 0x3004 | 时钟Lane驱动强度、极性 |
| DATA_LANE_CTRL | 0x3006 | 数据Lane驱动强度、均衡 |
| HS_TIMING | 0x3008 | HS传输时序参数 |
2.3 电源管理与上电时序要求
Sensor的电源管理,是驱动移植中最容易被忽视、但又最容易出问题的地方。IMX系列Sensor通常需要三路电源:
- VDD(核心电压): 1.2V,给数字核心供电
- VDDIO(IO电压): 1.8V,给I2C、GPIO等接口供电
- VANA(模拟电压): 2.8V,给像素阵列和模拟电路供电
2.3.1 上电时序要求
IMX Sensor对上电顺序有严格要求。一般来说,顺序是:VDD → VDDIO → VANA。为什么?因为数字核心先起来,IO接口才能工作,最后模拟部分再上电,避免浪涌电流。
看一个典型的上电时序图:
2.3.2 下电时序
下电顺序和上电相反:VANA → VDDIO → VDD。而且要注意,下电时各电源之间的间隔也要满足要求,否则可能损坏Sensor。
2.3.3 电源纹波要求
IMX Sensor对电源纹波很敏感,尤其是VANA。纹波过大,图像上会出现固定条纹噪声。一般要求:
- VDD:纹波 < 50 mVpp
- VDDIO:纹波 < 30 mVpp
- VANA:纹波 < 20 mVpp(这个最严格)
如果发现图像有横纹,先别急着调算法,拿示波器看看VANA的纹波。我遇到过好几次,都是电源滤波电容没焊好导致的。
2.4 本章小结
硬件接口这部分,说白了就是三个字:看时序。I2C的时序、MIPI D-PHY的时序、电源的时序,任何一个不满足,Sensor都不会正常工作。调试的时候,我建议你按这个顺序排查:
- 先量电源,确认上电顺序和电压值
- 再测I2C,确认能正常读写Sensor ID寄存器
- 最后配MIPI,用示波器看D-PHY的HS信号是否正常
嗯,这套流程我用了好多年,基本没翻过车。