4、系统结构:Camera子系统框图
搞MIPI摄像头,光会调驱动和看log是不够的。你得在脑子里画出一张完整的子系统框图。说白了,就是知道图像数据从哪来、经过哪、最后到哪去。我刚开始做这个的时候,也以为只要信号通就行,结果碰到一个诡异的无图像问题,折腾了两天才发现是DMA配置错了。从那以后,我习惯先把框图写下来,再动手调。
下面这张图,就是我最常用的Camera子系统数据流框架。每个模块我都用实际项目里踩过的坑来给你讲清楚。
图像传感器(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,电平不匹配导致无图像,最后加了个电平转换才搞定。
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配置的不一致,出来的画面就是错色的,严重时全黑。
CPU接口(I2C/SPI/中断)
CPU通过I2C或SPI配置传感器和ISP寄存器。还得管中断——比如传感器输出帧同步信号(VSYNC)给CPU,CPU收到后启动DMA搬运。我曾经遇到一个坑:中断信号抖动导致CPU频繁触发DMA,数据还没Ready就开始搬运,结果每帧都缺一行。后来加了个软件消抖才解决。
- 常见接口速率:I2C通常100kHz~400kHz,SPI可达10MHz。
- 排错建议:用逻辑分析仪抓一次完整的配置序列,核对寄存器地址和值是否与datasheet一致。
整体排查思路
拿到一个无图像问题,我通常按这个顺序点检:
- 上电时序:sensor、PHY、SoC各电源是否在正确时间到达?(用示波器看)
- 时钟:MCLK、REFCLK、PCLK是否有且频率正确?
- MIPI物理层:差分信号幅度、共模电压、HS-TX时序。
- DMA配置:地址、长度、burst、使能位是否写完?
- ISP处理:格式、分辨率、bayer排列是否匹配?
- CPU侧:中断是否响应?buffer是否被及时消费?
你看,整个框图里每个模块都可能是瓶颈。掌握了这张图,你就能像剥洋葱一样,一层层定位到问题模块。下次遇到无图像,别慌张——先从框图上找到当前卡在哪一步,再对症下药。