2. 长包与短包概念

在 MIPI DSI 协议中,数据包是主机(Host)与外设(Peripheral)之间信息交换的基本单元。根据包的长度和格式,DSI 协议将数据包分为长包(Long Packet)和短包(Short Packet)两种类型。理解这两种包的格式定义、区分方法及用途,是掌握 DSI 驱动开发的基础。

2.1 短包格式定义

短包是 DSI 协议中最简洁的数据包格式,固定为 4 字节长度。它主要用于传输命令、控制信息和同步信号,不携带大量像素数据。

短包结构(4 字节):
字节 0: 数据标识符 (DI) —— 包含虚拟通道 ID (VC) 和数据类型 (DT)
字节 1: 数据低字节 (Data Low Byte)
字节 2: 数据高字节 (Data High Byte)
字节 3: 错误校验码 (ECC) —— 对前 3 个字节进行校验

短包各字段说明:

字段 位宽 描述
VC (Virtual Channel) 2 bits 虚拟通道标识,支持 4 个独立通道(0~3)
DT (Data Type) 6 bits 数据类型,决定包的具体用途(如命令、同步、应答)
Data Low/High 16 bits 2 字节数据负载,用于传递命令参数或状态信息
ECC 8 bits 单比特纠错、双比特检错码,保护 DI 和 2 字节数据
驱动开发提示:短包的 ECC 校验由硬件自动生成和检查,驱动开发者通常只需关注 DI 字段中的 VC 和 DT 配置。ECC 错误会导致包被丢弃,驱动应通过中断状态寄存器监控 ECC 错误计数。
短包(Short Packet)4 字节格式 字节 0: DI VC[1:0] + DT[5:0] 字节 1: Data Low 数据低字节 字节 2: Data High 数据高字节 字节 3: ECC 错误校验码 短包总长固定 4 字节,无数据长度字段,无校验和(Checksum) ECC 覆盖前 3 字节,支持单比特纠错和双比特检错

2.2 长包格式定义

长包是 DSI 协议中用于传输大量数据的包格式,长度可变。它由 4 字节包头、可变长度数据负载和 2 字节包尾组成。长包主要用于传输显示像素数据、大块命令参数或固件更新数据。

长包结构:
包头 (4 字节):
  - 字节 0: 数据标识符 (DI) —— VC + DT
  - 字节 1: 数据长度低字节 (WC_L)
  - 字节 2: 数据长度高字节 (WC_H)
  - 字节 3: 错误校验码 (ECC)

数据负载 (0~65535 字节):
  - 实际传输的数据内容

包尾 (2 字节):
  - 字节 0: 校验和低字节 (CS_L)
  - 字节 1: 校验和高字节 (CS_H)

长包各字段说明:

字段 位宽 描述
DI (Data Identifier) 8 bits 包含 VC (2 bits) 和 DT (6 bits),与短包定义相同
WC (Word Count) 16 bits 数据负载的字节数,范围 0~65535
ECC 8 bits 保护 DI 和 WC 字段,单比特纠错/双比特检错
Data Payload 可变 实际传输的数据,长度由 WC 指定
CS (Checksum) 16 bits 对数据负载的 16 位 CRC 校验和,检测传输错误
常见驱动错误:长包的 WC 字段表示数据负载的字节数,而非字(Word)数。在配置 DMA 传输时,务必根据 WC 值设置正确的传输长度,否则会导致数据错位或 CRC 校验失败。
长包(Long Packet)可变长度格式 包头 (4 字节) DI + WC + ECC 数据负载 (可变长度) 0 ~ 65535 字节 由 WC 字段指定长度 包尾 (2 字节) 校验和 CS DI WC_L WC_H ECC 长包校验机制:ECC 保护包头(DI + WC),CRC-16 保护数据负载 接收端先校验 ECC,再校验 CRC;任一校验失败则丢弃整个包

2.3 包类型区分与用途

DSI 协议通过 数据类型(DT, Data Type)字段来区分短包和长包。DT 字段的高位(bit 5)决定了包的类型:

  • DT[5] = 0:短包(Short Packet),固定 4 字节。
  • DT[5] = 1:长包(Long Packet),可变长度。

常见数据类型及用途:

DT 值 包类型 名称 典型用途
0x01 短包 V-Sync Start 垂直同步开始信号,帧同步
0x05 短包 H-Sync Start 水平同步开始信号,行同步
0x09 短包 End of Transmission (EoT) 传输结束包,关闭 LP 模式
0x15 短包 Generic Short Write 通用短写命令,带 2 字节参数
0x29 长包 Generic Long Write 通用长写命令,传输大块数据
0x2E 长包 Pixel Data (RGB888) 24 位 RGB 像素数据流
0x3E 长包 Pixel Data (RGB666) 18 位 RGB 像素数据流
驱动开发要点:在初始化显示控制器时,需要根据显示面板的规格配置正确的像素格式 DT。例如,RGB888 面板使用 DT=0x2E,RGB666 面板使用 DT=0x3E。错误的 DT 配置会导致显示颜色异常或黑屏。
包类型区分流程 接收数据包 DT[5]? 0 或 1 短包 (DT[5]=0) 固定 4 字节,无数据负载 长包 (DT[5]=1) 可变长度,含数据负载 DT[5] 决定包类型

2.4 长包与短包对比总结

对比项 短包 长包
总长度 固定 4 字节 可变(6 ~ 65541 字节)
数据负载 2 字节(Data Low/High) 0 ~ 65535 字节
校验机制 ECC(覆盖包头+数据) ECC(包头)+ CRC-16(数据负载)
主要用途 同步信号、命令、应答 像素数据、大块命令、固件
传输效率 低(校验开销占比高) 高(数据占比大)
驱动配置关注点 VC、DT、ECC 中断 WC、DMA 传输长度、CRC 校验
核心记忆点:
  • 短包 = 4 字节,DT[5]=0,用于控制/同步。
  • 长包 = 包头(4) + 数据(可变) + 包尾(2),DT[5]=1,用于数据/像素。
  • ECC 保护包头,CRC-16 保护长包数据负载。
  • 驱动开发中,短包通常由硬件自动发送(如同步信号),长包需要驱动配置 DMA 和 WC。