4. DSI长包与短包:区别与使用场景

DSI 协议里,包分两种:长包和短包。这俩兄弟长得像,但本质上完全不一样。我刚开始学的时候也总搞混,觉得不都是一串数据嘛?

后来做项目调时序,踩了坑才明白。长包和短包,说白了,一个负责“搬砖”,一个负责“发号施令”。

咱们先看张图,从根上拆一下它们的结构。

DSI 长包与短包结构对比 DSI 包结构:长包 vs 短包 长包结构 数据ID 字节数 数据载荷 (最大65531字节) ECC 校验和 最长包 短包结构 数据ID 数据字节 (0-2字节) ECC 固定4字节 核心差异总结 1. 长包:有数据长度字段 + 可变长载荷 + 16位校验和 2. 短包:无长度字段 + 固定最多2字节数据 + 无校验和 3. 长包用于批量数据传输(图像像素),短包用于控制命令和状态查询 4. 两者都依靠 ECC 做单比特纠错,但只有长包依赖校验和保证数据完整性

4.1 短包:命令和数据控制的核心

短包,结构非常紧凑。不管是什么命令,它就 4 个字节。你也看到了,包含:数据ID、数据字节(最多2个)、ECC 校验。

没有长度字段,没有校验和。为什么?

因为短包就是用来干“轻量级”活儿的。你想想看,在显示链路上,我们需要不停地发送同步信号(比如 VSYNC、HSYNC)、初始化命令、读取寄存器值。这些事,数据量小,但频率高。如果用长包来发,光头部开销就不划算。

我个人的习惯是,所有 DSI 主机的初始化序列,都优先用短包来实现。比如配置显示控制器的某几个寄存器,用短包发送 DCS 写命令,干净利落。

Tip: 短包虽然短,但 ECC 机制不可忽略。我见过一个案例,EMI 干扰导致发送的短包数据ID被篡改,主机收到了错误的命令。幸好 ECC 捕获了错误,没有造成显示花屏。短包虽简,保护不简。

4.2 长包:图像数据的搬运工

长包就不一样了。它的载荷长度最大可以到 65531 字节,加上头部的 4 字节和尾部的 2 字节校验和。

长包的核心价值在于:批量数据传输 + 数据完整性校验。

你设想一下,一条 1080p 的图像扫描线,可能有 1920 个像素,每个像素 24 位 RGB,那就是 5760 字节。如果用短包一个个发,协议开销会翻天。长包一包就能塞下整整一条或半条扫描线数据。再加上 16 位校验和,链路误码基本上跑不掉。

我在做一款车载摄像头项目时,分辨率为 1920x1080,刷新率 60fps,DSI 时钟跑到了 800Mbps。长包的传输时序决定了整个系统的带宽利用率。我们花了一周时间调优长包的打包策略,才把总线的利用率从 60% 提升到了 85%。

注意: 长包的校验和(Checksum)是可选的吗?不是!标准里明确说了,长包必须包含有效的16位校验和。我曾经见过供应商的IP核配置错了,没开校验和功能,导致链路偶尔出现花屏却查不到原因。连续测了两个通宵,最后定位到是校验和缺失。从那以后,我每调一个平台,都会去示波器上抓长包的包尾,确认那两个字节是真实有效的。

4.3 长包 vs 短包:全维度对比

对比维度 短包(Short Packet) 长包(Long Packet)
总长度 固定 4 字节 4 + 数据长度 + 2 字节校验和
数据载荷 0~2 字节 0~65531 字节
错误检测 仅 ECC(单比特纠错) ECC + 16位校验和
典型用途 命令、同步、状态读取 图像像素、大量配置数据
时序影响 低(传输时间固定) 高(传输时间随载荷变化)
应用场景举例 VSYNC、HSYNC、Sleep In/Out Pixel Stream、Write Memory

这个表你最好记住了,不管是写驱动还是调试时序,都会反复用到。短包追求的是快速和低开销,长包追求的是吞吐和可靠。

4.4 选型原则:什么场景用哪种包?

  1. 命令和同步信号:无脑选短包

    比如你要告诉显示控制器进入休眠模式(Sleep In),发一个 DCS 短包命令就行。这个命令只需要一个字节的数据去指示,用长包反而增加了总线占用时间和校验开销。

  2. 大量数据(>2字节):强制选长包

    短包能承载的数据最多就 2 个字节。你没法用它传输一整帧图像。哪怕你要写一段几十字节的 Gamma 校正表,也建议用长包,免得被协议层分割得七零八落。

  3. 速度优先的场景:短包有优势

    有些时序关键路径,比如在 VSYNC 消隐区内发送配置命令,时间窗口非常窄。此时短包的快速交付特性就体现出来了。我记得之前做模拟面板时,垂直消隐区只有几百微秒,用短包发完所有配置刚刚好。

  4. 可靠性优先的场景:长包有强校验

    如果链路噪声较大,或者你产品有车规要求,长包的 16 位校验和能帮你多一道护身符。我一般会开启主机端的校验和检查,当发现校验和错误时,立即重发该长包,确保画面不出现残影。

一句话记牢: 短包是命令和控制的手电筒,长包是图像数据的卡车。在写代码调时序之前,先想清楚你这会儿需要的是手电筒还是卡车,选错了通道,后患无穷。

4.5 避坑指南:我遇到过的长包与短包问题

  • 长包的“虚假长度”:我曾经调试过一个 DSI 转 LVDS 的桥片,发现图像上半部分正常,下半部分花掉。抓包一看,长包的长度字段比实际数据多了 2 个字节,导致后面数据错位。检查代码才发现是上层软件把计数器写错了。遇到类似问题,先拿示波器抓长包头部,核对字节数。
  • 短包被忽略的 ECC:早期的一个项目,我们觉得短包数据少,ECC 关掉也没事。结果在强电磁环境下,主机发出来的短包命令被终端误解释。从那以后,我再也不敢关闭 ECC 了。你想想看,一个错误的 Sleep Out 命令可能导致屏幕乱闪,这种问题定位起来可麻烦了。
  • 混合使用时的总线规划:长包和短包在链路上是交替传输的。有的同学写驱动时,长包和短包轮换没有考虑消隐区长度,导致 VSYNC 短包被长包阻塞,造成画面撕裂。我建议在设计阶段,就把各阶段的总线占用率计算清楚,特别是消隐区内的短包窗口要预留够。

嗯,长包和短包,本质上是对不同场景的差异化设计。理解了它们的区别,后面讲时序和消隐区配置时,你就能清楚哪些阶段该用短包抢时间,哪些阶段该用长包保吞吐了。