2. MIPI DSI协议详解:命令模式与视频模式、数据包格式、虚拟通道与模式切换

好,咱们今天来啃一块硬骨头——MIPI DSI协议的核心细节。说实话,这玩意儿刚接触的时候确实有点绕,但搞懂了之后你会发现,它其实就那么几件事。我当年第一次调DSI接口时,对着示波器看了三天波形,才把那些模式切换的时序给捋顺了。今天我把这些经验掰开了讲给你听。

2.1 命令模式 vs 视频模式:两种完全不同的玩法

DSI协议定义了两种工作模式,说白了就是:你要不要自己管刷新?

命令模式(Command Mode)

这种模式下,主控(AP)把显示数据写到显示模组的GRAM里,模组自己负责刷新屏幕。主控只需要在画面变化时更新数据就行。

  • 优点:省电。静态画面时主控可以睡觉,模组自己刷。
  • 缺点:需要GRAM,成本高,而且主控得发命令去读写GRAM。
  • 典型应用:智能手表、小尺寸OLED屏。
我的经验:做智能手表项目时,我习惯用命令模式。因为手表大部分时间显示静态表盘,主控可以进入低功耗模式,续航能提升30%以上。但要注意,命令模式下读写GRAM的时序必须严格对齐,否则会出现撕裂。

视频模式(Video Mode)

主控实时地把每一帧数据流式地推给显示模组。模组没有GRAM,收到什么就显示什么。

  • 优点:不需要GRAM,成本低,适合大尺寸屏幕。
  • 缺点:主控必须持续发送数据,功耗高。
  • 典型应用:手机主屏、平板、车载显示屏。
注意:视频模式下,如果主控送数据的速度跟不上刷新率,屏幕就会闪。我曾经遇到过因为DDR带宽不足导致视频模式丢帧的问题,最后不得不降低分辨率才搞定。

2.2 数据包格式:长包与短包

DSI通信的基本单位是数据包。不管你是发命令还是传图像,都得打包。包分两种:短包长包

短包(Short Packet)

固定4字节。用于发送命令、读取寄存器、同步信号等轻量级操作。

字节内容说明
0DI(Data Identifier)虚拟通道号 + 数据类型
1Data 0数据低字节
2Data 1数据高字节
3ECC纠错码

举个例子,发一个「进入睡眠模式」的命令,就是发一个短包,DI里写上命令类型,Data字段填0就行。

长包(Long Packet)

用于传输大量数据,比如一帧图像。结构如下:

| 包起始 | 数据标识符 | 字计数 | ECC | 数据负载 | 校验和 | 包结束 |
|   SOT  |     DI     |  WC   | ECC |  Payload  |  CRC   |   EOT  |
  • 数据标识符(DI):和短包一样,标识虚拟通道和数据类型。
  • 字计数(WC):2字节,表示数据负载的字节数。
  • ECC:1字节,保护DI和WC。
  • 数据负载:你要传的实际数据,比如RGB像素。
  • 校验和(CRC):2字节,校验数据负载的完整性。
避坑指南:我曾经在调试时发现图像偶尔出现花屏,查了三天发现是长包的CRC计算错了。DSI的CRC算法是标准的CRC-16-CCITT,千万别自己瞎写,直接用硬件CRC模块或者查表法。

2.3 虚拟通道:一条总线,多个设备

DSI物理上只有一组差分对(Data Lane + Clock Lane),但逻辑上可以支持最多4个虚拟通道(Virtual Channel,VC)。

每个数据包的DI字段里,高2位就是VC号。显示控制器根据VC号把数据分发给不同的显示模组。

  • VC0:通常用于主屏。
  • VC1:副屏或摄像头预览。
  • VC2/VC3:预留,比如双屏异显。

你想想看,如果手机有两个屏幕,一个主屏一个副屏,只需要一组DSI总线,通过VC区分就行。省引脚,省布线。

我的习惯:做双屏项目时,我建议把VC0分配给主屏,VC1给副屏。这样调试时抓包一看VC号就知道数据是给谁的,省心。

2.4 LP与HS模式切换:速度与功耗的平衡

DSI的物理层有两种信号模式:LP(Low Power,低功耗)HS(High Speed,高速)

LP模式

电压摆幅大(约1.2V),速率低(最大10Mbps)。用于传输控制命令、初始化序列、以及总线空闲时的低功耗状态。

  • 差分信号变成单端信号(Dp和Dn独立驱动)。
  • 功耗极低,但速度慢。

HS模式

电压摆幅小(约200mV),速率高(每lane可达1Gbps以上)。用于传输图像数据。

  • 差分信号,抗干扰能力强。
  • 功耗高,但速度快。

模式切换流程

从LP切换到HS,或者从HS切回LP,都有严格的时序要求。我画个简化的流程:

LP->HS切换:
1. 总线处于LP-11状态(Dp高,Dn高)
2. 发送LP-00(Dp低,Dn低)持续T_LPX时间
3. 发送LP-01(Dp低,Dn高)作为准备信号
4. 进入HS模式,开始发送HS数据

HS->LP切换:
1. HS数据传输结束
2. 发送T_HS_TRAIL时间的高电平
3. 进入LP-11状态
我曾经踩过的坑:有一次屏幕初始化后一直不亮,示波器抓波形发现LP->HS切换时T_LPX时间不够。DSI规范要求T_LPX至少是50ns,但我的MCU配置错了,只给了30ns。模组直接不认,因为时序不满足。后来把时钟配置改了一下,问题解决。所以,模式切换的时序参数一定要对照模组的数据手册来配,不能想当然。

2.5 总结一下

DSI协议的核心就这四块:

  1. 命令模式 vs 视频模式:看你的屏有没有GRAM,有就用命令模式省电,没有就用视频模式。
  2. 长包 vs 短包:短包发命令,长包传数据。CRC别算错。
  3. 虚拟通道:一条总线带多个屏,靠VC号区分。
  4. LP/HS切换:低速省电,高速传图,切换时序必须精准。

嗯,这些搞明白了,DSI驱动你就入门了。下一节咱们聊聊实际调试时怎么用示波器抓这些包,怎么分析波形。到时候我会拿一个真实的案例来讲,保证你听完就能上手。