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上升沿前需稳定
我曾经踩过的坑: 有一次板子上I2C上拉电阻选了个10kΩ,结果400kHz下波形圆得跟馒头一样,Sensor偶尔不ACK。后来换成2.2kΩ,问题解决。上拉电阻的选择直接影响上升时间,别忽视。

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;
}
小技巧: 很多IMX Sensor的寄存器地址是16位的,发送时先高后低。你想想看,如果顺序搞反了,写进去的数据全跑到别的寄存器去了,排查起来很头疼。

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的物理层结构理清楚:

MIPI D-PHY 物理层结构 协议层(CSI-2 / DSI) 低层协议(LLP) D-PHY 物理层 时钟 Lane + 数据 Lane(1~4条) 电气层 差分信号(Dp/Dn)、HS/LP 模式 关键配置项 • Lane 速率 • 摆幅电压 • 终端匹配 • HS 预加重 • LP 驱动强度 • 时钟连续/非连续 • 极性反转 • 均衡

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就稳了
我的经验: Lane速率不要刚好卡在临界值。我曾经为了省功耗,把Lane速率压到刚好够用,结果温度一上来,眼图闭合,图像出现条纹。后来留了20%余量,再也没出过问题。

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传输时序参数
注意: 不同IMX型号的寄存器地址可能不同,一定要以对应型号的Datasheet为准。我见过有人拿着IMX290的配置直接往IMX335上套,结果PHY死活不Lock。

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接口才能工作,最后模拟部分再上电,避免浪涌电流。

看一个典型的上电时序图:

IMX Sensor 上电时序要求 时间 VDD (1.2V) t0 VDDIO (1.8V) t1 VANA (2.8V) t2 要求:t0 < t1 < t2,各电源间隔至少 100 μs

2.3.2 下电时序

下电顺序和上电相反:VANA → VDDIO → VDD。而且要注意,下电时各电源之间的间隔也要满足要求,否则可能损坏Sensor。

避坑指南: 我曾经在一个项目里,PMIC的电源轨默认下电顺序是反的,导致Sensor在断电瞬间出现反向电流,烧坏了几个样片。后来加了电源隔离电路才解决。所以,别光看原理图,一定要用示波器实测上/下电波形。

2.3.3 电源纹波要求

IMX Sensor对电源纹波很敏感,尤其是VANA。纹波过大,图像上会出现固定条纹噪声。一般要求:

  • VDD:纹波 < 50 mVpp
  • VDDIO:纹波 < 30 mVpp
  • VANA:纹波 < 20 mVpp(这个最严格)

如果发现图像有横纹,先别急着调算法,拿示波器看看VANA的纹波。我遇到过好几次,都是电源滤波电容没焊好导致的。

2.4 本章小结

硬件接口这部分,说白了就是三个字:看时序。I2C的时序、MIPI D-PHY的时序、电源的时序,任何一个不满足,Sensor都不会正常工作。调试的时候,我建议你按这个顺序排查:

  1. 先量电源,确认上电顺序和电压值
  2. 再测I2C,确认能正常读写Sensor ID寄存器
  3. 最后配MIPI,用示波器看D-PHY的HS信号是否正常

嗯,这套流程我用了好多年,基本没翻过车。