最早啃MIPI,是在一个摄像头模组死活出不了图的下午。I2C能读能写,寄存器配置看着也没问题,电源、复位、时钟全查了一遍,示波器一挂上去,数据lane上干干净净,连HS都进不去。后来才发现是设备树里lane的顺序写反了,软件层面没人报错,硬件层面就是不出波形。这件事让我意识到,MIPI这东西光看协议文档是学不会的,必须把电气层、协议层和软件配置三条线串起来看。这篇笔记就是我前后折腾了几个月整理下来的东西,从D-PHY的电气特性、CSI-2的包结构,到Linux下的V4L2调试、示波器抓波形的实操,再到踩过的那些坑,尽量写成一个能直接照着复现的版本。不管你是刚接手摄像头或屏幕调试的驱动工程师,还是做硬件设计、需要判断走线是否满足要求的Layout人员,或者只是想搞明白手机里那颗摄像头是怎么把数据送进主控的,下面的内容应该都能对得上你的需求。
1. 先把MIPI这件事拆开看
1.1 为什么移动设备内部非要用MIPI
MIPI全称是Mobile Industry Processor Interface,字面意思是移动产业处理器接口。它不是某一个具体的接口,而是一整套面向移动设备内部互连的规范集合。理解它的定位有一个很直观的参照:以前的摄像头用并口,DVP那种,PCLK、HSYNC、VSYNC、D0到D11一堆线,一根线传一位,速率上不去,引脚还特别多。到了千万像素级别,并口的时钟频率和走线数量都撑不住了,PCB上二十多根线绕来绕去,EMI也难压。
MIPI的思路是把并行变成高速串行差分,一条lane就是一对差分线,速率可以做到每lane上千Mbps,同时用低功耗状态机来处理控制信号,不需要额外的控制线。对手机这种寸土寸金、又要省电的设备来说,这个方案几乎是必然选择。它解决的核心问题可以概括成三条:用更少的引脚跑更高的带宽、用差分信号压制共模干扰、用LP和HS两套状态兼顾功耗和吞吐。
我第一次把并口摄像头换成MIPI模组的时候,最直观的感受就是接线从二十多根变成了一组时钟加一到四组数据,布线上从“每一根都要等长”变成“每组差分对内部等长、对间控制偏差”,设计复杂度下降了一大截,但随之而来的是对阻抗控制和时序裕量的要求变高了。这是一个典型的取舍:把复杂度从数量转移到质量上。
1.2 协议家族全景与各自的分工
MIPI下面规范很多,初学时最容易犯的错是把物理层和协议层混为一谈。比如有人问“MIPI速率能到多少”,这个问题本身就不严谨,因为要看你问的是D-PHY还是C-PHY,是CSI-2还是DSI。下面这张表是我自己整理的分层视角,建议先把这个框架记住,后面看任何一份规范都能对号入座。
| 层次 | 规范名称 | 主要用途 | 关键特征 |
|---|---|---|---|
| 物理层 | D-PHY | 摄像头、显示的主流物理层 | 1对时钟+1到4对数据,HS/LP双模,差分100欧 |
| 物理层 | C-PHY | 高像素摄像头、高分辨率显示 | 三线一组,嵌入式时钟,无独立时钟lane |
| 物理层 | M-PHY | 存储、板间高速互连 | 支持多种速率档位和低功耗状态 |
| 协议层 | CSI-2 | 摄像头串行接口 | 短包加长包,虚拟通道,RAW/YUV/RGB数据类型 |
| 协议层 | DSI | 显示串行接口 | 命令模式和视频模式,DCS命令集 |
| 协议层 | UniPro | 配合M-PHY的上层协议 | 面向存储和通用数据传输 |
| 控制类 | I3C | 替代I2C的传感器控制总线 | 更高速率,支持带内中断 |
| 控制类 | RFFE | 射频前端控制 | 低引脚、低延迟 |
| 音频类 | SoundWire | 音频器件互连 | 多通道、低功耗 |
从这张表能看出来,实际项目里说的“调MIPI”,八成是在调D-PHY加CSI-2或者D-PHY加DSI这一对组合。C-PHY出现的场景通常是像素特别高、D-PHY的lane数不够用的时候,三线一组天生比两线一组的带宽密度高。M-PHY更多出现在存储和板间互连里,和摄像头调试关系不大,但做系统架构的时候需要知道它的存在,免得选型时把接口搞混。
提示:看到“MIPI”这个词,先问一句是哪个物理层加哪个协议层,能省掉很多无效沟通。我见过团队里两个人争“MIPI是几根线”,一个说的是D-PHY的4 lane共10根,一个说的是C-PHY的3线组,其实都没错,只是不在一个频道上。
1.3 我的学习路径设计:从电气特性倒推协议
市面上的MIPI资料大致分两类:一类是规范原文,几百页,术语密集,直接啃容易劝退;另一类是别人的总结,往往只讲结论不讲推导,看完还是不会调。我自己的路径是这样安排的,实测下来效率最高。
第一步,先搞清楚物理层在干什么,重点是HS和LP两种状态怎么切换、差分信号的电气门限大概在什么范围、时序参数里哪几个是真正卡脖子的。这一步不需要背具体数值,但要知道每个参数在波形上对应哪一段。第二步,看协议层的包结构,重点是短包和长包各自装什么、虚拟通道怎么用、数据类型编码怎么查。第三步,把软件链路的配置对上,设备树里的lane配置、link-frequencies、V4L2的格式设置,这些和前面的物理层参数是一一对应的。第四步才是实际抓波形验证,用示波器看HS进入序列,用协议分析仪看包内容,用v4l2-ctl看帧数据。
这个顺序的理由很简单:出错的时候,现象往往在软件层,根因却在物理层。如果一开始就盯着驱动代码看,很容易在无关的地方打转。先把波形和时序的“正常长什么样”印在脑子里,再去排查,判断速度会快很多。
2. 物理层是所有问题的起点
2.1 D-PHY的HS与LP两种状态机
D-PHY最核心的设计就是每条lane都有两套工作状态。LP是低功耗状态,用单端信号,电平幅度大约在0到1.2V这个量级,速率很低,主要用来传控制序列和进入HS前的握手。HS是高速状态,用差分信号,差分摆幅在200mV左右,共模电平在200mV上下,速率从几百Mbps到每lane数Gbps。同一条物理走线,靠状态机在两种模式之间切换,这就是D-PHY省引脚的关键。
LP状态有四个组合,记作LP-11、LP-01、LP-00、LP-10,对应P线和N线的高低组合,顺序是P在前N在后。停止态是LP-11,两条线都是高。进入HS的序列是LP-11到LP-01到LP-00,然后发出同步序列SoT,进入HS-0。退出HS的时候,发送端发完最后一个bit,进入EoT,然后回到LP-11。双向lane还要支持Turnaround,序列是LP-11到LP-10到LP-00到LP-01再到LP-11,把总线控制权交给另一端。
这里有个很容易忽略的点:HS进入序列里的LP-01和LP-00是有严格时序要求的,也就是T_LPX,常见规范里最小值在50ns这个量级。如果发送端的驱动能力或者软件配置导致这个时间不够,接收端可能压根识别不到进入请求,表现出来就是“没有波形”或者“波形畸变”。我在一次调试里遇到过LP-00持续时间偏短的情况,示波器上看只是一点点差别,但接收端就是不入HS,把发送端的时序参数调大之后立刻正常。
注意:D-PHY的LP模式电压和HS模式摆幅完全不是一个量级,用示波器抓的时候一定要切换量程和探头衰减档位。我见过有人用抓LP的档位去看HS,屏幕上就是一条粗线,误以为信号有问题,其实是垂直档位不合适。
2.2 关键时序参数到底卡在哪
时序参数是D-PHY里最容易被跳过、又最容易出问题的地方。规范里参数很多,但真正影响能不能通信的其实就那么几个。下面这张表是我按“出问题频率”排序整理的,数值只给量级,具体一定要翻对应版本的规范表格,不同版本之间差异不小。
| 参数 | 物理含义 | 常见量级 | 出问题时的现象 |
|---|---|---|---|
| T_LPX | LP状态切换的最短持续时间 | 不小于50ns | 接收端识别不到进入序列,完全无HS |
| T_HS-PREPARE | 从LP-00到HS-0的准备时间 | 40ns+4UI到85ns+6UI | 首bit采样错误,包头CRC失败 |
| T_HS-ZERO | HS-0的持续时间 | 105ns+6UI到145ns+10UI | 同步不稳定,间歇性丢包 |
| T_HS-TRAIL | HS最后一个bit到LP的过渡 | 不小于60ns+4UI | 末bit错误,包尾CRC失败 |
| T_HS-EXIT | 退出HS到LP-11的时间 | 不小于100ns | 下一包进入失败 |
| T_CLK-PREPARE | 时钟lane进入HS的准备 | 38ns到95ns | 时钟数据相位对不上 |
| T_CLK-ZERO | 时钟lane HS-0持续时间 | 不超过300ns | 时钟建立异常 |
UI这个概念要单独说一下,它指的是一个bit的时间宽度。比如每lane 1Gbps,UI就是1ns;每lane 500Mbps,UI就是2ns。很多时序参数写成“40ns加4UI”这种形式,意思是最小值里有一部分是固定的,另一部分随速率变化。这就是为什么同样的配置,降速能跑、提速就挂,因为固定部分没变,UI变小之后总时间反而不够了。
我个人的经验是把T_HS-PREPARE和T_HS-TRAIL这两个参数当成重点观察对象。前者决定包头能不能正确采样,后者决定包尾CRC能不能过。如果调试时出现“图像大部分正常但边缘有几行花”或者“CRC错误计数缓慢增长”,优先怀疑这两个参数的裕量。
2.3 差分走线与PCB上的几个硬指标
物理层的另一半在PCB上。D-PHY的差分阻抗目标是100欧,这个大家都知道,但实际执行时有几个细节经常被忽略。第一是差分对内部的等长,一般要求控制在5mil以内,严格一点的场景要求更小;第二是对与对之间的偏差,通常建议控制在几十mil量级,具体看速率;第三是参考地的完整性,差分线下面不能有跨分割,否则回流路径断了,共模抑制会明显变差。
还有一个坑是过孔和连接器。模组和主控之间如果经过板对板连接器,连接器的阻抗不连续会直接反映在眼图上。我遇到过一版硬件,走线本身没问题,但连接器选型时没注意差分阻抗,抓波形能看到明显的反射,降速能跑,全速就间歇性出错。这种情况软件层面怎么调都没用,只能改硬件。
提示:速率超过每lane 1Gbps之后,走线长度本身也开始变得敏感。不是说到不了,而是裕量在缩小。如果产品要过温度循环和振动测试,建议在设计阶段就把眼图裕量留足,别等量产了再返工。
2.4 C-PHY和M-PHY什么时候该关注
大多数摄像头项目用D-PHY就够了,但有两种情况会把目光引向C-PHY。一种是像素堆得太高,4 lane D-PHY的带宽算下来不够,又不愿意增加引脚;另一种是结构空间受限,希望用更少的线。C-PHY用三根线组成一组,靠三线之间的电平组合编码,一个symbol携带的信息量比差分对多,等效带宽密度更高,而且时钟是嵌入在数据里的,省掉了独立的时钟lane。
代价是C-PHY的电气特性和D-PHY完全不同,调试方法也不一样,用惯了D-PHY的人第一次看C-PHY的波形会很不适应,因为它是三根线一起看才有意义。M-PHY则更多出现在存储和板间互连场景,它的速率档位和低功耗状态设计得更复杂,和摄像头调试的交集不大。
我的建议是:先把D-PHY吃透,这是绝大多数项目的实际需求。等遇到带宽瓶颈或者特殊结构要求时,再去看C-PHY,那时候你对物理层的理解已经足够迁移了。
3. 协议层:CSI-2的包结构怎么读
3.1 短包、长包与虚拟通道
CSI-2跑在D-PHY上面,它把数据组织成包。包分两种,短包固定4个字节,长包是4字节包头加数据加2字节包尾。短包的结构是1字节的数据标识DI、2字节的字数WC、1字节的ECC。长包在ECC后面跟有效数据,最后是2字节的CRC。这个设计的好处是开销可控,同时ECC和CRC给了两层校验,出问题的时候能大致判断是包头错了还是数据错了。
DI这个字节是理解CSI-2的钥匙,它拆成高2位的虚拟通道VC和低6位的数据类型DT。虚拟通道的意义在于一条物理链路上可以复用多路数据流,比如一个主控接一个四合一摄像头模组,里面有多颗传感器,就可以用不同的VC区分。实际项目里VC用满的情况不多,大部分是VC 0,但做多摄方案时必须搞清楚。
ECC只保护包头4个字节,CRC保护整个长包的数据部分。调试时如果ECC错误计数在涨,说明包头在传输中出了问题,重点查时序和信号质量;如果CRC错误在涨而ECC正常,说明包头能正确解析但数据段有误,重点查数据lane的裕量和走线。这个区分方法我在排查时用得最多,比盲目换线有效得多。
3.2 数据类型的编码与RAW打包规则
数据类型决定了后面的数据怎么解释。常用的几个编码:0x2A是RAW8,0x2B是RAW10,0x2C是RAW12,0x2D是RAW14,0x1E是YUV422的8bit格式,0x24是RGB888。帧起始是0x00,帧结束是0x01,行起始是0x02。这些值建议直接背下来或者贴在工位上,因为看协议分析仪的时候第一眼就是看DT。
RAW10的打包规则是初学者最容易栽跟头的地方。10bit数据在字节流里没法直接对齐,CSI-2的做法是四个像素打包成5个字节:前4个字节分别是四个像素的高8位,第5个字节里塞四个像素的低2位。这样4个像素正好40bit,5个字节整。RAW12是2个像素打包成3个字节,RAW14是4个像素打包成7个字节。如果解析的时候按8bit直接读,出来就是花屏或者颜色全错。
我第一次解RAW10的时候就是没注意这个打包规则,把缓冲区按字节直接映射成16位,结果图像上是规律的条纹,一度以为是时序问题,查了半天才发现是解析代码写错了。这类问题在软件层面排查成本很高,因为现象看起来很像硬件故障。判断方法很简单:看条纹是否有规律,如果周期和打包周期对得上,基本就是解析问题。
3.3 DSI与CSI-2的差异点
DSI和CSI-2共用D-PHY,包结构也相似,但用途和细节差别不小。DSI是显示接口,分命令模式和视频模式。命令模式下发的是DCS命令,短包用来传命令和参数,长包用来传像素数据或者较长的命令序列。视频模式则更接近CSI-2的连续流,按行或者按帧推送像素。
DSI里有一个容易被忽略的配置是时钟lane的工作模式,分连续时钟和非连续时钟。连续时钟模式下时钟lane一直保持在HS,非连续模式下在两次传输之间会回到LP。这两种模式对功耗和时序的要求不同,选错了会出现屏幕闪烁或者初始化失败。我在一个屏调试项目里遇到过非连续时钟模式下偶尔白屏的问题,改成连续时钟后稳定,代价是待机功耗略高。
另一个差异是DSI的初始化序列通常由屏厂提供,一长串寄存器写操作,通过DCS长包发下去。这个过程对时序比较敏感,尤其是上电后的延迟和复位释放的顺序。我的做法是把初始化序列单独做成一个表,每一步都标注延迟要求,调试的时候逐步打印,哪一步失败一目了然。
4. 动手环节:从硬件链路到抓波形
4.1 上电前的链路检查清单
真正坐到工位上调之前,有一张检查清单能省掉大量时间。这张清单我是按“排查成本从低到高”排的,先做便宜的检查,避免一上来就动硬件。
| 检查项 | 具体内容 | 常见错误 |
|---|---|---|
| 供电 | 传感器或屏的各路电源是否按时序上电 | 上电顺序错,器件不工作 |
| 复位 | 复位引脚极性、释放时机 | 极性搞反,一直处于复位 |
| 时钟 | 外部晶振或主控提供的参考时钟是否起振 | 频率不对,PLL锁不上 |
| I2C | 器件地址是否能扫到,寄存器能否读写 | 地址写错,上拉电阻缺失 |
| Lane配置 | 设备树里的lane数和实际硬件是否一致 | 硬件4 lane,软件配2 lane |
| Lane顺序 | 数据lane的P/N极性和排列顺序 | 顺序反了,图像错位 |
| 电源噪声 | 模拟电源是否有足够滤波 | 图像上有噪声条纹 |
这张表里最值得强调的是lane顺序。硬件上lane 0到lane 3的物理排列和软件里data-lanes属性的顺序必须对应,P和N接反也是常见问题。P/N接反的表现通常是图像能出但颜色或者位置错乱,因为差分信号反相之后逻辑会翻转。有些主控支持在寄存器里交换极性,有些只能改硬件,选型时要确认清楚。
4.2 用示波器看HS进入与退出
示波器是排查物理层问题的第一工具。抓D-PHY波形有几个要点:探头要用差分探头或者至少是两个单端探头做数学运算,带宽要足够,一般建议是信号速率的3到5倍,垂直档位要能覆盖LP的1.2V和HS的200mV两个量级。
抓的时候先看时钟lane,找到LP-11到LP-01到LP-00再到HS的完整序列。这个序列在屏幕上很好认:前面是大幅度慢速跳变,后面突然变成小幅度的密集振荡。确认序列形状正常之后,再量T_LPX的宽度,看是否满足最小值。然后看数据lane,确认它在时钟进入HS之后也跟着进入,两者的相位关系是否在合理范围。
退出序列同样要看,HS结束后应该回到LP-11,中间经过EoT。如果退出不干净,下一包的进入会受影响。我遇到过一次间歇性丢帧,最后定位到是T_HS-TRAIL偏短,末bit没传完就切回LP了,把发送端的驱动参数调大之后问题消失。
注意:抓HS波形时示波器的时间基准要设得比较细,因为一个UI可能只有几百ps。先用大时间尺度找到序列位置,再放大看细节,不要一上来就开到最细,否则屏幕上什么都找不到。
4.3 Linux下CSI-2的调试链路
软件侧的调试主要围绕V4L2和media controller展开。典型的链路是传感器通过I2C配置,图像数据走CSI-2进入主控的ISP或者直接DMA到内存,用户态通过/dev/video节点取流。中间涉及设备树、驱动、拓扑三个层面的配置。
设备树里最关键的是端点的lane配置和link-frequencies。下面是一个通用示例,具体属性名要以所用平台的绑定文档为准。
&i2c3 { status = "okay"; camera@36 { compatible = "vendor,camera-sensor"; reg = <0x36>; clocks = <&clk_cam>; clock-names = "xvclk"; reset-gpios = <&gpio1 12 GPIO_ACTIVE_LOW>; powerdown-gpios = <&gpio1 13 GPIO_ACTIVE_LOW>; port { sensor_out: endpoint { remote-endpoint = <&csi_in>; >media-ctl -d /dev/media0 -p输出里要能看到传感器实体、CSI接收实体、ISP实体之间的链接,pad的格式和实际配置一致。如果链接断了或者格式不对,取流会失败。
取流用v4l2-ctl,先列格式,再设格式,最后抓帧。
v4l2-ctl -d /dev/video0 --list-formats-ext v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=RG10 v4l2-ctl -d /dev/video0 --stream-mmap=4 --stream-count=10 --stream-to=frame.raw抓下来的raw文件可以用脚本按RAW10规则解析成图片,这一步能直接验证数据是否正确。如果raw文件大小和预期不符,说明格式设置或者打包规则有问题;如果大小对但图像花,说明数据内容有问题,回到物理层查。
4.4 带宽与时序的计算过程
带宽计算是设计阶段必须做的功课,算错了要么跑不满帧率,要么选型过剩。下面用一个具体例子走一遍。
假设传感器输出1920乘1080,行总周期2200,场总周期1125,帧率30fps,输出RAW10,使用4条数据lane。
先算像素速率:2200乘1125乘30,等于74250000像素每秒,也就是74.25兆像素每秒。再算总数据率:74.25兆乘10bit,等于742.5Mbps。分摊到4条lane,每条lane是185.625Mbps。时钟lane的频率是它的一半,约92.8MHz。一个UI的时间是1除以185.625兆,约5.39ns。
这个结果要和主控的CSI接收能力对比,确认在支持范围内。同时要考虑协议开销,每行有包头包尾,实际有效带宽要打折扣,通常建议留20%到30%的余量。如果算下来贴着上限,实际跑起来很容易因为温度或者电压波动丢帧。
反过来,如果已知主控每lane最高支持1.5Gbps,想跑4 lane,那总带宽上限是6Gbps。按上面的传感器配置,742.5Mbps只用了很小一部分,可以把帧率提到120fps还有富余。这种反推在设计多摄方案时很有用,能快速判断哪一路需要独立lane,哪一路可以共享。
提示:算带宽的时候别只看有效像素,行场消隐的时间也要算进去,也就是用行总周期和场总周期,不是用1920和1080。这个差别在高帧率场景下会被放大,我见过按有效像素算完觉得够用、实测跑不满的案例。
5. 常见问题与排查实录
5.1 故障速查表
调得多了会发现,MIPI的问题现象和根因之间有比较强的对应关系。下面这张表是我这些年攒下来的,按现象查原因,能覆盖大部分场景。
| 现象 | 优先怀疑 | 排查动作 |
|---|---|---|
| 完全无HS波形 | lane配置错误、复位未释放、时钟未起振 | 查设备树、量复位和时钟 |
| 有HS但无数据包 | 进入序列时序不足、lane极性反 | 量T_LPX和进入序列 |
| 图像全黑但无报错 | 曝光或增益寄存器未配置、数据未使能 | 读传感器寄存器 |
| 图像有规律条纹 | RAW打包解析错误、位宽不匹配 | 检查解析代码 |
| 图像错位或倾斜 | lane顺序错、P/N接反 | 核对硬件与软件lane映射 |
| 花屏且CRC错误增长 | 信号质量差、走线阻抗不连续 | 抓眼图、查走线 |
| 只出几帧就停 | 带宽不足、DMA缓冲溢出 | 降帧率或降分辨率验证 |
| 间歇性丢帧 | 时序裕量不足、电源噪声 | 量关键时序、查电源纹波 |
| 颜色异常 | 数据类型配错、Bayer顺序错 | 核对DT和pixelformat |
这张表的使用方法是先定位现象,再按优先怀疑列排查,不要跳步。很多问题看起来像软件问题,实际是硬件问题,反过来也一样。我一般的习惯是先确认物理层有波形,再确认协议层有包,最后才看数据内容,这个顺序能把排查范围快速缩小。
5.2 几个典型的踩坑现场
第一个坑是lane顺序。前面提过,设备树里写的是data-lanes等于1 2 3 4,硬件上物理lane 0接的是主控的lane 1,结果图像出来是错位的。这类问题的麻烦在于有时候能出图,只是位置不对,很容易被误判为ISP配置问题。判断方法是看错位是否有固定规律,如果是整行或者整块的偏移,基本就是lane映射错了。
第二个坑是link-frequencies填错。有一次移植驱动,按数据率填了742500000,结果探测一直失败,内核日志里只打印了一句频率不匹配,没说要什么值。后来翻驱动源码才发现它期望的是时钟频率,改成371250000之后立刻正常。这件事之后我养成了习惯,移植任何传感器驱动前先看它怎么解析这个属性。
第三个坑是电源噪声。图像上有淡淡的横纹,一开始怀疑是时序,量了半天都在范围内。后来把示波器探头打到模拟电源上,发现纹波明显偏大,换了一版滤波电容之后横纹消失。这类问题的特点是和图像内容相关,画面越亮纹波影响越明显,可以作为判断线索。
第四个坑是DSI的非连续时钟模式。屏幕偶尔白屏,概率大概几十次上一次,日志里没有任何错误。查了很久才定位到是时钟lane在两次传输之间回到LP再进入HS的过程中,某个时序参数裕量不够。改成连续时钟模式之后彻底稳定,代价是待机功耗增加了一点。这个取舍要看产品定位,对功耗敏感的场景还是要把非连续模式的时序调好。
5.3 参数调优的实操心得
调MIPI参数有一个基本原则:先保证能通,再追求裕量。刚接手一个模组的时候,不要一上来就按最高速率跑,先把速率降下来,确认链路能通、图像正确,然后逐步提速,每次提速都观察错误计数。这样一旦出问题,能立刻知道是哪个速率档位开始不稳,排查范围小很多。
具体到参数,我的习惯是先把T_LPX和T_HS-PREPARE这两个调保守一点,它们直接影响能不能进入HS。等链路稳定之后再逐步收紧,看还能不能保持稳定,找到实际的裕量边界。这个过程有点像调PID,先给一个大范围,再慢慢收。
还有一个实用的技巧是善用错误计数器。大部分CSI接收控制器都有ECC和CRC的错误计数寄存器,取流的时候周期性读一下,比看图像更早发现问题。CRC错误从0缓慢增长到几十,可能图像上看不出来,但说明裕量已经在缩小,温度一变化就可能恶化。我一般在调试阶段会连续跑半小时,盯着错误计数看趋势,这比抓一帧两帧有效得多。
注意:不同平台的错误计数器位置和清零方式不一样,有的读一次自动清零,有的需要写寄存器。用之前先确认清楚,否则会看到“错误数一直是0”的假象。我就吃过这个亏,以为是链路完美,实际上是读法不对。
最后说一个心态上的体会。MIPI调试很多时候是在跟“看不见的东西”打交道,信号在线上跑,软件里只有一个结果。所以一定要养成用波形和日志互相印证的习惯,软件说通了,波形上要能看到对应的东西;波形正常,软件里要能读到对应的包。两边对不上,就说明中间还有没搞清楚的地方,别急着往下走。