4、系统结构:Camera子系统框图

搞MIPI摄像头,光会调驱动和看log是不够的。你得在脑子里画出一张完整的子系统框图。说白了,就是知道图像数据从哪来、经过哪、最后到哪去。我刚开始做这个的时候,也以为只要信号通就行,结果碰到一个诡异的无图像问题,折腾了两天才发现是DMA配置错了。从那以后,我习惯先把框图写下来,再动手调。

下面这张图,就是我最常用的Camera子系统数据流框架。每个模块我都用实际项目里踩过的坑来给你讲清楚。

Camera 子系统数据流框图 图像传感器 Sensor MIPI PHY D-PHY / C-PHY DMA 直接存储器访问 ISP 图像信号处理器 CPU 接口 I2C / SPI / 中断 DDR 内存 帧缓冲区 数据流方向 Sensor → PHY → DMA DMA → 内存 (RAW) 内存 → ISP → 显示/编码 控制流方向 CPU → I2C → Sensor CPU → DMA 配置

图像传感器(Sensor)

传感器是整个链路的源头。它把光信号转成电信号,再转成数字RAW数据通过MIPI接口发出来。我遇到过一个问题:上电后READY信号正常,但MIPI lane上就是没数据。查了半天,发现是传感器的PLL配置没生效——I2C写进去了,但寄存器没锁存。嗯,这里要注意,很多传感器在写寄存器后需要发送一个“刷新”命令。

  • 常见问题:上电时序不对、PLL锁定失败、MCLK频率偏差大。
  • 检查方法:用示波器看MCLK和PCLK,再用逻辑分析仪抓I2C读写。

MIPI PHY

PHY负责MIPI物理层的信号收发。说白了就是差分信号转换成数字比特流。我个人习惯在看无图像问题时,先用示波器量一下D0+和D0-的差分幅度——如果低于150mV,基本可以断定PHY没正常工作。我以前调过一块板子,sensor输出明明是1.2V,但SoC的PHY支持的是1.8V,电平不匹配导致无图像,最后加了个电平转换才搞定。

⚠️ 特别注意: 检查MIPI PHY的参考时钟(REFCLK)是否稳定。我见过好几次REFCLK频率偏移导致PHY无法锁定lane,图像全黑。

DMA(直接存储器访问)

DMA是个“搬运工”。它把MIPI PHY解出来的数据搬到DDR里。别小看这步——我印象最深的一次,图像一直出不来,最后发现DMA通道的burst长度配错了,导致数据顺序错乱,ISP吃了乱序的数据直接崩溃。配置DMA时,务必确认以下参数:

参数推荐值排查方向
Line length等于sensor水平分辨率×每像素字节算错会导致帧偏移
Frame buffer地址32字节对齐不对齐会触发总线错误
DMA channel优先级高(避免被其他模块抢占)低优先级可能丢帧

ISP(图像信号处理器)

ISP拿到RAW数据,做黑电平校正、去噪、白平衡、色彩转换,最后输出YUV或RGB。很多无图像故障其实发生在ISP内部——比如RAW数据的bayer pattern顺序和ISP配置的不一致,出来的画面就是错色的,严重时全黑。

💡 我的排查方法: 先用dump工具把DMA里的原始RAW数据导出到PC,用第三方软件(如RawTherapee)预览。如果能正常显示,说明Sensor→PHY→DMA链路OK,问题在ISP或后续。

CPU接口(I2C/SPI/中断)

CPU通过I2C或SPI配置传感器和ISP寄存器。还得管中断——比如传感器输出帧同步信号(VSYNC)给CPU,CPU收到后启动DMA搬运。我曾经遇到一个坑:中断信号抖动导致CPU频繁触发DMA,数据还没Ready就开始搬运,结果每帧都缺一行。后来加了个软件消抖才解决。

  • 常见接口速率:I2C通常100kHz~400kHz,SPI可达10MHz。
  • 排错建议:用逻辑分析仪抓一次完整的配置序列,核对寄存器地址和值是否与datasheet一致。

整体排查思路

拿到一个无图像问题,我通常按这个顺序点检:

  1. 上电时序:sensor、PHY、SoC各电源是否在正确时间到达?(用示波器看)
  2. 时钟:MCLK、REFCLK、PCLK是否有且频率正确?
  3. MIPI物理层:差分信号幅度、共模电压、HS-TX时序。
  4. DMA配置:地址、长度、burst、使能位是否写完?
  5. ISP处理:格式、分辨率、bayer排列是否匹配?
  6. CPU侧:中断是否响应?buffer是否被及时消费?

你看,整个框图里每个模块都可能是瓶颈。掌握了这张图,你就能像剥洋葱一样,一层层定位到问题模块。下次遇到无图像,别慌张——先从框图上找到当前卡在哪一步,再对症下药。