4. DSI长包与短包:区别与使用场景
DSI 协议里,包分两种:长包和短包。这俩兄弟长得像,但本质上完全不一样。我刚开始学的时候也总搞混,觉得不都是一串数据嘛?
后来做项目调时序,踩了坑才明白。长包和短包,说白了,一个负责“搬砖”,一个负责“发号施令”。
咱们先看张图,从根上拆一下它们的结构。
4.1 短包:命令和数据控制的核心
短包,结构非常紧凑。不管是什么命令,它就 4 个字节。你也看到了,包含:数据ID、数据字节(最多2个)、ECC 校验。
没有长度字段,没有校验和。为什么?
因为短包就是用来干“轻量级”活儿的。你想想看,在显示链路上,我们需要不停地发送同步信号(比如 VSYNC、HSYNC)、初始化命令、读取寄存器值。这些事,数据量小,但频率高。如果用长包来发,光头部开销就不划算。
我个人的习惯是,所有 DSI 主机的初始化序列,都优先用短包来实现。比如配置显示控制器的某几个寄存器,用短包发送 DCS 写命令,干净利落。
4.2 长包:图像数据的搬运工
长包就不一样了。它的载荷长度最大可以到 65531 字节,加上头部的 4 字节和尾部的 2 字节校验和。
长包的核心价值在于:批量数据传输 + 数据完整性校验。
你设想一下,一条 1080p 的图像扫描线,可能有 1920 个像素,每个像素 24 位 RGB,那就是 5760 字节。如果用短包一个个发,协议开销会翻天。长包一包就能塞下整整一条或半条扫描线数据。再加上 16 位校验和,链路误码基本上跑不掉。
我在做一款车载摄像头项目时,分辨率为 1920x1080,刷新率 60fps,DSI 时钟跑到了 800Mbps。长包的传输时序决定了整个系统的带宽利用率。我们花了一周时间调优长包的打包策略,才把总线的利用率从 60% 提升到了 85%。
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 选型原则:什么场景用哪种包?
- 命令和同步信号:无脑选短包
比如你要告诉显示控制器进入休眠模式(Sleep In),发一个 DCS 短包命令就行。这个命令只需要一个字节的数据去指示,用长包反而增加了总线占用时间和校验开销。
- 大量数据(>2字节):强制选长包
短包能承载的数据最多就 2 个字节。你没法用它传输一整帧图像。哪怕你要写一段几十字节的 Gamma 校正表,也建议用长包,免得被协议层分割得七零八落。
- 速度优先的场景:短包有优势
有些时序关键路径,比如在 VSYNC 消隐区内发送配置命令,时间窗口非常窄。此时短包的快速交付特性就体现出来了。我记得之前做模拟面板时,垂直消隐区只有几百微秒,用短包发完所有配置刚刚好。
- 可靠性优先的场景:长包有强校验
如果链路噪声较大,或者你产品有车规要求,长包的 16 位校验和能帮你多一道护身符。我一般会开启主机端的校验和检查,当发现校验和错误时,立即重发该长包,确保画面不出现残影。
4.5 避坑指南:我遇到过的长包与短包问题
- 长包的“虚假长度”:我曾经调试过一个 DSI 转 LVDS 的桥片,发现图像上半部分正常,下半部分花掉。抓包一看,长包的长度字段比实际数据多了 2 个字节,导致后面数据错位。检查代码才发现是上层软件把计数器写错了。遇到类似问题,先拿示波器抓长包头部,核对字节数。
- 短包被忽略的 ECC:早期的一个项目,我们觉得短包数据少,ECC 关掉也没事。结果在强电磁环境下,主机发出来的短包命令被终端误解释。从那以后,我再也不敢关闭 ECC 了。你想想看,一个错误的 Sleep Out 命令可能导致屏幕乱闪,这种问题定位起来可麻烦了。
- 混合使用时的总线规划:长包和短包在链路上是交替传输的。有的同学写驱动时,长包和短包轮换没有考虑消隐区长度,导致 VSYNC 短包被长包阻塞,造成画面撕裂。我建议在设计阶段,就把各阶段的总线占用率计算清楚,特别是消隐区内的短包窗口要预留够。
嗯,长包和短包,本质上是对不同场景的差异化设计。理解了它们的区别,后面讲时序和消隐区配置时,你就能清楚哪些阶段该用短包抢时间,哪些阶段该用长包保吞吐了。