1. 项目概述:DSI-TX控制器时序配置的核心挑战
在嵌入式显示系统开发中,从并行像素数据流到高速串行数据流的转换,是决定显示稳定性和图像质量的关键环节。DSI-TX控制器正是这个转换过程的核心引擎。我遇到过不少工程师,在调试AM62L这类处理器的显示输出时,明明硬件连接正确,驱动也加载了,但屏幕上要么是花屏、撕裂,要么干脆没信号。追根溯源,十有八九问题出在DSI-TX控制器的时序配置上,尤其是像素时钟(pixel_clk)与发送字节时钟(tx_byte_clk)的匹配,以及DPI FIFO的管理策略。
简单来说,你可以把DSI-TX控制器想象成一个精密的“数据转运中心”。它的上游是DPI接口,源源不断地以像素时钟的节拍送来并行的像素数据(比如RGB888格式,每个像素24位)。它的下游是MIPI D-PHY物理层,需要以字节时钟的节拍,将数据打包成符合DSI协议的长短数据包,通过1到4对差分数据线串行发送出去。这个“转运”过程必须严丝合缝:上游来的数据不能堆积(FIFO上溢),下游要发送时也不能没数据(FIFO下溢)。而这两个时钟域往往是异步的,它们的速率关系、以及由此衍生出的时序参数配置,就成了确保数据流连贯、无撕裂显示的生命线。
本次要深入探讨的,就是如何基于TI AM62L处理器的DSI-TX控制器,完成这套精细的时序配置。这不仅仅是照着手册填几个寄存器那么简单,你需要理解每个参数背后的物理意义、时钟域转换的数学关系,以及如何利用FIFO和时序余量来吸收时钟抖动与偏差。下面,我将结合手册中的理论、实际配置案例以及我踩过的坑,为你拆解从原理到实践的全过程。
2. 核心原理:像素时钟与字节时钟的匹配逻辑
2.1 时钟比率的理想关系
一切配置的起点,是理解pixel_clk和tx_byte_clk之间理想的数量关系。这不是一个任意的比值,而是由数据宽度和通道数决定的。
DPI接口每个像素时钟周期输入bpp(bits per pixel) 位的数据。例如,RGB565格式是16bpp,RGB888是24bpp。而DSI链路在物理层以字节(8位)为单位,通过Lanes条数据通道传输。因此,在理想情况下,两个时钟的频率应满足以下关系,以确保单位时间内输入和输出的数据量平衡:
pixel_clk * bpp = tx_byte_clk * 8 * Lanes
换算一下,得到理想的时钟频率比:
tx_byte_clk / pixel_clk = bpp / (8 * Lanes)
让我们代入几个常见场景来直观感受一下:
- 场景一:RGB888 (24bpp), 4条数据通道 (Lanes=4)理想比率 = 24 / (8 * 4) = 24 / 32 = 0.75 这意味着,如果像素时钟是100MHz,那么理想的字节时钟应该是75MHz。这样,每秒输入
100M * 24 bit = 2.4 Gbps的像素数据,恰好等于输出75M * 8 * 4 = 2.4 Gbps的串行数据。 - 场景二:RGB565 (16bpp), 2条数据通道 (Lanes=2)理想比率 = 16 / (8 * 2) = 16 / 16 = 1.0 此时,像素时钟和字节时钟应该同频,均为100MHz。
注意:这个“理想”比率是理论计算的起点。在实际系统中,由于时钟源(如PLL)的分频限制,我们可能无法得到精确的比值,总会存在微小的偏差。后续的FIFO管理和时序调整,主要就是为了应对这种非理想情况。
2.2 DPI FIFO:吸收时钟偏差的缓冲池
既然时钟很难完美匹配,DSI-TX控制器内部集成了一个DPI FIFO(先入先出缓冲区)来充当“蓄水池”或“缓冲带”的角色。它的核心作用是解耦两个时钟域,平滑因时钟频率微小差异或短期抖动导致的数据生产(DPI侧)和消费(DSI发送侧)速率不一致。
你可以这样理解它的工作过程:在每一行(Line)视频数据的传输周期内,FIFO的状态是动态变化的。
- 水平同步期(HSA)和水平后沿(HBP):此时DSI-TX控制器正在生成和发送同步包、消隐包,尚未开始从FIFO中读取有效的像素数据。因此,DPI接口持续写入的像素数据会在FIFO中堆积,FIFO填充水平(Fill Level)不断上升。
- 有效数据期(HACT):控制器开始从FIFO中读取数据并打包成RGB数据包发送。理想情况下,如果时钟匹配完美,读取速度等于写入速度,FIFO的填充水平会保持在一个稳定的值。
- 水平前沿(HFP):一行有效数据发送完毕,控制器再次发送消隐包或进入低功耗状态,停止从FIFO读取。但DPI接口可能还在写入本行最后的一点数据,因此FIFO填充水平会逐渐下降直至清零,为下一行数据做好准备。
AM62L的DSI-TX控制器提供了DPI_CFG寄存器来实时监控这个FIFO的填充水平。这是调试时序匹配是否良好的“仪表盘”。如果配置正确,FIFO水平会在每行内呈现规律的“上升-平稳-下降”波形。如果发现FIFO水平持续增长(最终上溢)或持续下降(最终下溢),就说明时钟偏差过大,或时序参数(HSA/HBP/HFP)设置不合理,没有给FIFO提供足够的“喘息”空间来吸收这种偏差。
2.3 利用HFP进行数据包对齐与时钟补偿
当时钟存在微小偏差时,一个非常巧妙且关键的调整手段是修改水平前沿(HFP)数据包的长度。手册中提到的“增加HFP的字节值”是一个重要的实操技巧。
其原理在于DSI的传输机制:在高速(HS)传输模式下,控制器会将一行内所有的数据包(HSS、HSA、HBP、RGB、HFP等)首尾相连,形成一个连续的数据流。这个数据流在多个数据通道(Lanes)上是按字节交错(Interleave)分布的。
假设tx_byte_clk比理想速率略快,这意味着DSI发送端“消耗”数据的速度略快于DPI“生产”数据的速度。长此以往,FIFO会趋向于下溢。为了解决这个问题,我们可以人为地增加HFP消隐包的字节数。
增加HFP包长,相当于在每一行数据的末尾,人为插入了一段“填充数据”。这段额外的数据使得当前行的总传输时间变长。由于数据是按通道对齐的,这额外的字节可能会导致下一行数据的起始位置在时间上稍微延迟(例如,延迟(tx_byte_clk周期) * (额外字节数) / (通道数)),从而让发送端的节奏“等一等”生产端,让FIFO有更多时间被填充,抵消了tx_byte_clk过快的影响。
这个过程就像调节一个精密齿轮的啮合:通过微调HFP这个“垫片”的厚度,让两个不同速的齿轮(时钟域)在一个行周期内实现整体上的同步,避免累积误差。DPI_CFG寄存器可以帮助我们观察调整效果——当时钟对齐后,FIFO的填充水平会在固定的几行(例如手册提到的四行)内完成一个完整的周期性变化,而不是单向地增长或减少。
3. 时序参数计算与配置实战
理解了原理,我们进入最核心的实操部分:如何根据DPI端的视频时序,计算出DSI-TX控制器需要配置的寄存器值。这里以最常用的非突发模式(Non-Burst Mode)为例,它又分为同步脉冲(Sync Pulse)和同步事件(Sync Event)两种子模式。
3.1 基础概念与公式
首先,明确几个关键缩写和它们的关系:
- H-Total: 一行总的像素时钟数 = HSA + HBP + HACT + HFP
- bpp: 每像素位数,如16(RGB565),24(RGB888)。
- Lanes: DSI数据通道数,1, 2, 3, 或 4。
核心转换公式:字节数 = 像素数 × (bpp / 8)。所有来自DPI的以像素时钟为单位的参数(HSA, HBP, HACT, HFP),在配置给DSI控制器前,都需要先转换成字节数���
此外,DSI协议在传输时,会在数据包前后添加包头(Header)、错误校验(ECC/CRC)等开销字节。因此,在计算DSI端的HSA_DSI、HBP_DSI、HFP_DSI时,需要在DPI转换值的基础上减去这些开销。
3.2 同步脉冲模式(Sync Pulse Mode)配置详解
同步脉冲模式旨在精确重建DPI端的原始同步脉冲宽度,时序控制最精细。其数据包结构复杂,开销需要仔细扣除。
3.2.1 寄存器计算步骤
假设我们有一个DPI时序配置如下,用于计算示例:
DPI_HSA= 12 像素,DPI_HBP= 12 像素,DPI_HACT= 1920 像素,DPI_HFP= 24 像素bpp= 16 (RGB565),Lanes= 4- 一行总像素
H_Total= 12+12+1920+24 = 1968
第一步:计算DSI端各区间字节数(扣除协议开销)根据手册,开销如下:
HSA_DSI开销:14字节 (HSS短包4B + HSA长包头尾6B + HSE短包4B)HBP_DSI开销:12字节 (HBP长包头尾6B + RGB长包头尾6B)HFP_DSI开销:6字节 (HFP长包头尾6B)
计算公式:
HSA_DSI = (DPI_HSA * bpp/8) - 14 = (12 * 2) - 14 = 10 字节HBP_DSI = (DPI_HBP * bpp/8) - 12 = (12 * 2) - 12 = 12 字节HACT_DSI = (DPI_HACT * bpp/8) = (1920 * 2) = 3840 字节(有效数据无额外开销)HFP_DSI = (DPI_HFP * bpp/8) - 6 = (24 * 2) - 6 = 42 字节
第二步:计算一行总字节数与所需tx_byte_clk周期数
- 一行总字节数
Total_Bytes = (H_Total * bpp/8) = 1968 * 2 = 3936 字节 - 在4通道下,发送这些字节需要的
tx_byte_clk周期数Total_Cycles = ceil(Total_Bytes / Lanes) = ceil(3936 / 4) = 984 个周期。ceil是向上取整,因为周期必须是整数。
第三步:配置消隐行(无有效数据的行)的填充对于垂直消隐区(VSA, VBP, VFP)的行,没有RGB有效数据。控制器有两种方式处理:
- 使用
BLKLINE_PULSE_PCK(字节数模式):直接指定一个长消隐包的长度(字节数)。BLKLINE_PULSE_PCK = Total_Bytes - 20 - HSA_DSI = 3936 - 20 - 10 = 3906 字节这里的20字节是固定开销(HSS 4B + HSA长包 4B+10B+2B + HSE 4B?需复核)。实际上,从手册验证公式看,它等于Total_Bytes - 20 - HSA_DSI。 - 使用
REG_LINE_DURATION(时钟周期模式):指定消隐行占用的tx_byte_clk周期数。REG_LINE_DURATION = Total_Cycles - ceil( (DPI_HSA * bpp/8) - 14, Lanes) = 984 - ceil( (12*2) - 14, 4) = 984 - ceil(10, 4) = 984 - 3 = 981?等等,这里需要仔细核对。手册示例中计算为984 - ceil(12*2, 4) = 984 - 6 = 978。这里ceil((HSA * bpp/8) - 14, Lanes)似乎直接用了HSA_DSI字节数向上取整到通道数。ceil(10, 4) = 3个周期(因为10字节在4通道上需要3个周期传完)。但手册示例用了ceil(12*2, 4)=ceil(24,4)=6。我怀疑手册公式描述有歧义,实际计算可能用的是ceil( (DPI_HSA * bpp/8), Lanes )。这是一个关键注意点!在实际配置时,必须结合控制器行为理解:REG_LINE_DURATION表示的是分配给“纯消隐”部分(即除了HSA相关包之外的部分)的周期数。因此,它等于总周期数减去发送HSA相关包(HSS, HSA packet, HSE)所需的周期数。而HSA相关包的字节数就是(DPI_HSA * bpp/8),不一定需要减14?这里需要根据具体IP版本确认。安全做法是参考手册提供的完整验证算式进行反推。
手册的验证计算给出了明确答案。对于VFP行(非最后一行):VFP = HSSPkt + HSAPkt + HSEPkt + BLK_LINE_PULSE_PCKPkt = 4 + (4 +10 + 2) + 4 + (4 + 3906 + 2) = 3936字节。 这验证了我们的BLKLINE_PULSE_PCK计算正确(3906)。
对于使用REG_LINE_DURATION的模式 (BLKLINE_MODE[1]=1):VFP = HSSPkt + HSAPkt + HSEPkt + REG_LINE_DURATION = div_round_up( (4 + (4+10+2) + 4), 4) + 978 = (20/4=5) + 978 = 983?不对,手册结果是984。这里div_round_up(20,4)=5,那么REG_LINE_DURATION应该是984 - 5 = 979?但手册写的是978。这个细微差别可能源于取整方式或对包头字节处理的差异。这再次强调,对于关键参数,必须使用手册提供的完整示例和公式进行校准,而不是孤立地理解某一个公式。
3.2.2 配置清单与注意事项
- 模式寄存器:设置
burst_mode = 0,sync_pulse_active = 1,sync_pulse_horizontal = 1。 - 水平参数寄存器:将计算出的
HSA_DSI,HBP_DSI,HACT_DSI,HFP_DSI写入对应寄存器。 - 消隐行模式:根据选择,配置
BLKLINE_MODE,并写入BLKLINE_PULSE_PCK或REG_LINE_DURATION。 - 垂直参数:垂直时序(VSA, VBP, VACT, VFP)的“行数”与DPI端一致,但DSI的
VFP应略小于DPI的VFP(通常至少小1),以便控制器在VFP结束前进入LP状态,等待下一个VSYNC。 - 关键检查:
(DPI_HACT * bpp) / 32必须为整数。这是因为在4通道模式下,每个tx_byte_clk周期输出4字节(32位)。如果HACT的字节数不是32位的整数倍,会导致最后一个周期数据未填满,引发对齐问题。对于RGB565(16bpp),HACT像素数必须是偶数;对于RGB888(24bpp),HACT像素数必须是4的倍数?这里(1920*24)/32=1440,是整数。实际上条件是(HACT * bpp) % (8 * Lanes) == 0,确保有效数据区能正好被通道数整除。
3.3 同步事件模式(Sync Event Mode)配置解析
同步事件模式简化了同步信号的重建,它不关心精确的HSA和HSE脉冲宽度,而是用一个统一的同步事件(HSS)来标记行的开始。这使得包结构更简单,开销计算也不同。
3.3.1 寄存器计算差异沿用上面的DPI时序示例:
HSA_DSI = 0(因为不单独发送HSA/HSE包)HBP_DSI = ( (DPI_HSA + DPI_HBP) * bpp/8 ) - 12 = ( (12+12)*2 ) - 12 = 48 - 12 = 36 字节(这里的12字节开销,对应HBP长包头尾6B + RGB长包头2B?手册指出是匹配DPI_HSA + DPI_HBP减去同步短包)HACT_DSI = 3840 字节(不变)HFP_DSI = 42 字节(不变,仍需减6字节开销)BLKLINE_EVENT_PCK = Total_Bytes - 10 = 3936 - 10 = 3926 字节(10字节开销:HSS短包4B + 消隐包头尾6B)
3.3.2 模式选择考量
- 同步脉冲模式:优点是可以更精确地模拟原始时序,可能对某些挑剔的显示屏兼容性更好。缺点是协议开销稍大,计算复杂。
- 同步事件模式:优点是配置简单,协议开销相对小一点(尤其对于消隐行)。缺点是丢失了精确的同步脉冲宽度信息。对于绝大多数现代显示屏,同步事件模式完全足够,也是更常用的选择。
实操心得:在项目初期,建议先用同步事件模式进行配置和调试,因为它更简单,更容易让系统先跑起来。等到图像稳定显示后,如果遇到特定屏幕的兼容性问题,再尝试切换到同步脉冲模式进行微调。同时,务必使用
DPI_CFG寄存器监控FIFO水平,这是判断时序配置是否健康的“金标准”。
4. 低功耗(LP)操作与突发(Burst)模式配置
4.1 低功耗操作时序考量
DSI协议支持在行消隐期(H-Blanking)和帧消隐期(V-Blanking)从高速(HS)模式切换到低功耗(LP)模式,以节省功耗。AM62L的DSI-TX控制器支持此功能。
配置LP操作的关键在于精确计算REG_LINE_DURATION寄存器。这个寄存器定义了在消隐行期间,控制器在进入LP状态��,需要等待的tx_byte_clk周期数。它的值必须确保:从一行开始到进入LP状态的总时间,恰好等于DPI端该行所对应的像素时钟周期数转换过来的时间。
计算公式通常为:REG_LINE_DURATION = Max_line_length_in_tx_byte_clk - EOT_cycles - [其他固定开销周期]
其中Max_line_length_in_tx_byte_clk就是前面计算的Total_Cycles。EOT_cycles是如果使能EoT(End of Transmission)包需要减去的周期。手册还提到,如果时钟通道(Clock Lane)是非连续的,还需要再减去10个周期。
配置要点:
- 使能LP:在控制寄存器中使能LP模式切换。
- 设置唤醒时间:配置
REG_WAKEUP_TIME,为从LP状态唤醒到HS状态预留足够的稳定时间(对应DPHY协议中的LP→HS时序要求,如THS-PREPARE,THS-ZERO等)。 - 精确计算时长:利用
REG_LINE_DURATION或VERT_BLANKING_DURATION确保消隐期时长精确匹配,避免因时序错位导致FIFO上/下溢或同步丢失。 - 验证:通过测量CLK Lane和Data Lane上的信号,确认HS和LP状态切换发生在预期的消隐期内,且不会侵入有效视频区域。
4.2 突发模式(Burst Mode)的配置与权衡
突发模式是一种更激进的省电策略。它不是在消隐期才切换到LP,而是将一行的有效像素数据压缩在更短的时间内以更高的速率突发发送出去,从而延长行周期内LP状态的时间。
4.2.1 工作原理与前提在突发模式下,tx_byte_clk的频率会显著提高(例如是常规模式的两倍)。这样,发送同样一行数据所需的活跃时间(HS时间)就缩短了,剩下的时间都可以用于LP状态。但是,这带来了两个严苛的要求:
- 大容量FIFO:DPI FIFO必须足够大,能够缓存至少一整行的像素数据。因为发送端会在短时间内以极高速度“抽空”FIFO,而DPI接口是以原像素时钟速率匀速写入的。FIFO需要充当“水库”,在突发发送前积累足够的水量。
- 时序重构:需要重新调整DPI端的水平时序。通常需要将
HSA和HFP设置为0(或很小),并增大HBP。这样做的目的是让有效像素数据(RGB)尽早开始,从而在行开始后尽快完成发送,为LP状态留出更长的窗口。手册中的示例将HSA从200像素改为20像素,HBP从336像素改为30像素,而将HFP大幅增加到622像素,就是为了创造更长的LP时间。
4.2.2 配置公式差异突发模式(Burst Event Mode)下,计算逻辑有所不同,因为时钟频率变了,且目标是为LP留出空间。
burst_mode = 1HSA_DSI = 0HBP_DSI = (2 * (DPI_HSA + DPI_HBP) * bpp/8) - 12 + DPI_FIFO_Prefill这里乘以2是因为tx_byte_clk翻倍了,单位时间内可发送更多字节,所以用同样的像素时间换算出的字节数翻倍。DPI_FIFO_Prefill是一个关键值,它决定了在开始突发传输前,FIFO中需要预先积累多少数据,以防止下溢。HACT_DSI计算不变(但注意(DPI_HACT * bpp/32)必须为整数的约束依然存在)。HFP_DSI = 0(推荐设置为0,以最大化LP时间,用BLLP区域填充)。
4.2.3 功耗与性能的权衡选择是否使用突发模式,是一个典型的功耗与性能/复杂度的权衡:
- 优点:可以显著降低系统在显示静态或低刷新率内容时的平均功耗,因为链路处于LP状态的时间比例大大增加。
- 缺点:
- 需要更高的
tx_byte_clk,可能增加系统时钟设计的复杂性和功耗(虽然HS时间短,但峰值功耗高)。 - 需要更大的片上FIFO资源。
- 配置更为复杂,需要精心调整时序。
- 可能对DPHY的驱动能力有更高要求。
- 需要更高的
我的建议是:对于电池供电的便携设备,且屏幕分辨率不高、FIFO资源充足时,可以积极考虑使用突发模式来优化功耗。对于高性能或高分辨率显示,优先保证稳定性和带宽,使用非突发模式可能更简单可靠。
5. 常见问题排查与调试技巧实录
即便按照手册公式计算,在实际调试中依然会遇到各种问题。下面是我总结的一些典型故障现象、排查思路和解决方法。
5.1 无显示或显示完全混乱
现象:屏幕无任何显示,或显示为杂乱无章的彩色条纹/方块。排查步骤:
- 检查基础时钟和电源:确认
pixel_clk和tx_byte_clk已按预期产生,且频率正确。测量DPHY的供电是否稳定。 - 确认LP模式:如果使能了LP模式,检查
REG_WAKEUP_TIME是否设置过小,导致从LP唤醒到HS的时序不满足DPHY规范,链路无法正常进入高速传输状态。可以尝试暂时禁用LP模式,看是否恢复。 - 验证核心时序参数:
- 重点检查
HACT_DSI:确认(HACT * bpp) % (8 * Lanes) == 0条件是否满足。这是最常见的数据对齐错误来源。不满足会导致数据包边界错乱。 - 复查计算过程:逐行核对
HSA_DSI,HBP_DSI,HFP_DSI的计算,特别是减去的协议开销字节数是否正确。同步脉冲模式和同步事件模式的开销不同,极易混淆。 - 检查
Total_Bytes:确保一行总字节数(H_Total * bpp/8)与通过各分段(HSA_DSI+HBP_DSI+HACT_DSI+HFP_DSI)累加的和一致。同时检查对应的tx_byte_clk周期数计算是否正确。
- 重点检查
- 检查物理连接与配置:确认MIPI DSI线缆连接可靠,屏幕初始化命令(通过DCS/Gen Command)已正确发送。屏幕的时序模式(如DE模式、Sync模式)是否与DSI-TX输出匹配。
5.2 图像撕裂、闪烁或局部错位
现象:图像大体正常,但存在水平方向的撕裂、周期性闪烁,或图像边缘有错位。排查步骤:
- 监控
DPI_CFGFIFO填充水平:这是最重要的调试手段。编写一个循环,在每行的中间阶段(例如在HACT期内)读取DPI_CFG寄存器值。- 理想状态:该值在一帧内呈现稳定的、周期性的波形。例如,从行开始逐渐上升,在HACT期保持稳定,在行末下降归零。
- FIFO上溢:如果读取值随时间持续增长,最终达到最大值后复位(或引发错误),说明
tx_byte_clk过慢,或DPI端数据产生太快。需要检查时钟比率,或尝试减小HFP值(减少消隐时间,让发送端更早开始下一行)。 - FIFO下溢:如果读取值持续下降,甚至归零后HS传输还在继续,说明
tx_byte_clk过快,或DPI端数据产生太慢。需要检查时钟比率,或尝试增大HFP值(增加消隐时间,让发送端“等待”生产端)。
- 调整HFP进行微调:正如原理部分所述,微调
HFP_DSI的字节数是补偿时钟微小偏差的最有效方法。每次调整几个字节,观察DPI_CFG值的变化趋势,直到其稳定在一个周期性模式。手册提到,当时钟对齐后,FIFO水平每四行会重复一次相同的模式,这是一个很好的对齐判据。 - 检查垂直时序:确认DSI的
VFP设置是否小于DPI的VFP。如果DSI的VFP过大,控制器可能在本该进入LP等待下一帧VSYNC的时候,还在尝试发送数据,导致帧开头错乱。确保VFP_DSI < VFP_DPI(通常至少小1)。
5.3 低功耗模式下发异常
现象:使能LP模式后,显示出现间歇性黑屏、闪屏,或从睡眠唤醒后显示异常。排查步骤:
- 测量LP-HS切换时序:使用示波器测量CLK Lane和一条Data Lane,重点关注从LP到HS的切换点。确保
REG_WAKEUP_TIME的设置满足DPHY规范要求的最小LP→HS准备时间。 - 核对
REG_LINE_DURATION:确认消隐行的REG_LINE_DURATION计算准确。一个常见的错误是忘记减去EOT包或时钟非连续带来的额外周期,导致消隐期实际长度短于预期,LP状态提前结束,破坏了时序。 - 突发模式特有问题:如果在突发模式下使能LP,确保
HFP_DSI已设置为0,并且BLKEOL_DURATION或BLKEOL_PCK计算正确,为LP状态留出了足够空间。同时,检查DPI FIFO深度是否真的足以缓存一整行数据。
5.4 配置检查清单
为了避免低级错误,在最终烧录固件前,建议按照以下清单进行复核:
| 检查项 | 同步脉冲模式 | 同步事件模式 | 突发模式 | 说明与检查方法 |
|---|---|---|---|---|
| 时钟比率 | 必查 | 必查 | 必查 | 计算(pixel_clk * bpp)与(tx_byte_clk * 8 * Lanes)是否近似相等。 |
| HACT对齐 | 必查 | 必查 | 必查 | (DPI_HACT * bpp) % (8 * Lanes) == 0 |
| HSA_DSI | (HSA*bpp/8)-14> 0 | 设为0 | 设为0 | 值不能为负,RGB888时手册要求最小5字节。 |
| HBP_DSI | (HBP*bpp/8)-12> 0 | ((HSA+HBP)*bpp/8)-12> 0 | 2*(HSA+HBP)*bpp/8 -12 + Prefill | 检查最小值。 |
| HFP_DSI | (HFP*bpp/8)-6> 0 | (HFP*bpp/8)-6> 0 | 通常设为0 | 检查最小值。这是主要的时钟微调参数。 |
| VFP_DSI | < DPI_VFP | < DPI_VFP | < DPI_VFP | 确保DSI的VFP行数小于DPI的,以便提前进入LP等待VSYNC。 |
| 消隐行设置 | 正确设置BLKLINE_PULSE_PCK或REG_LINE_DURATION | 正确设置BLKLINE_EVENT_PCK或REG_LINE_DURATION | 正确设置BLKLINE_EVENT_PCK或REG_LINE_DURATION | 根据BLKLINE_MODE选择,并验证总字节/周期数正确。 |
| LP相关 | 如需,配置REG_WAKEUP_TIME和REG_LINE_DURATION | 同左 | 同左,且注意HFP=0 | 确认唤醒时间满足DPHY规格。 |
| FIFO深度 | 评估是否足够 | 评估是否足够 | 必须评估 | 突发模式要求FIFO能存下一整行数据。检查芯片手册中DPI FIFO的具体大小。 |
调试是一个迭代的过程。最有效的流程是:基于计算值进行初始配置 -> 上电观察基本显示 -> 启用DPI_CFG监控 -> 微调HFP直至FIFO水平稳定 -> 如需,再使能和调试LP模式。记住,数据手册是你的第一参考资料,但实际系统的时钟偏差和屏幕特性可能需要你在这个理论基础上进行微调。