Linux SPI接口显示屏调试过程记录

目录

目录

前言

DTS配置参考

[spi-max-frequency设为20MHz且Frame Rate为119Hz](#spi-max-frequency设为20MHz且Frame Rate为119Hz)

[spi-max-frequency设为20MHz且Frame Rate为60Hz](#spi-max-frequency设为20MHz且Frame Rate为60Hz)

[spi-max-frequency设为20MHz且Frame Rate为50Hz](#spi-max-frequency设为20MHz且Frame Rate为50Hz)

[spi-max-frequency设为20MHz且Frame Rate为40Hz](#spi-max-frequency设为20MHz且Frame Rate为40Hz)

[spi-max-frequency设为50MHz且Frame Rate为119Hz](#spi-max-frequency设为50MHz且Frame Rate为119Hz)

[spi-max-frequency设为50MHz-且Frame Rate为60Hz](#spi-max-frequency设为50MHz-且Frame Rate为60Hz)

[spi-max-frequency设为50MHz-且Frame Rate为50Hz](#spi-max-frequency设为50MHz-且Frame Rate为50Hz)

[spi-max-frequency设为50MHz-且Frame Rate为40Hz](#spi-max-frequency设为50MHz-且Frame Rate为40Hz)

总结


前言

ST7789系列等驱动IC的显示屏在SPI模式下出现动态画面撕裂通常是由于在屏幕刷新过程中更新了显存(GRAM)导致屏幕上半部分和下半部分显示不同帧的数据。解决这个问题的常见方法是采用双缓冲机制或同步更新机制。

在SPI模式下,由于通信速率相对较慢,画面撕裂可能更明显。以下是常见的两种解决方案:

  • 双缓冲(Double Buffering)机制:使用两个缓冲区,一个用于显示(当前帧),另一个用于绘制(下一帧)。当绘制完成后,交换缓冲区。这样确保屏幕总是显示完整的帧。但需要注意,交换缓冲区时最好在屏幕刷新间隔(VBLANK)期间进行,以避免撕裂。
  • 同步更新(Synchronized Update)机制:在屏幕的垂直回扫期间(VBLANK)更新显存。ST7789系列等驱动IC提供了TE(Tearing Effect)输出信号,该信号在VBLANK期间变为有效。我们可以利用TE信号来同步更新。

由于ST7789系列等驱动IC的GRAM更新需要一定时间,需要确保在TE信号有效期间完成整个画面数据帧的传输。如果一帧数据太大的话,传输时间可能会超过VBLANK时间,则可能仍然会出现撕裂。此时,可以考虑使用双缓冲机制,并确保在下一个VBLANK之前完成数据传输。

在已经使用双缓冲机制的前提下,我们可能会在调试SPI接口的显示屏过程中,还是会发现动态画面出现画面撕裂的情况,这个时候我们可以通过结合显示驱动IC数据手册、显示屏接口的逻辑分析仪抓取的数据、调整SPI最大通信速率、调整Set Tear Scanline寄存器值和调整Frame Rate Control寄存器值等进行尝试减缓或解决动态画面撕裂的问题。


DTS配置参考

bash 复制代码
		panel_st7789_spi: panel_st7789_spi@0 {
			compatible = "xxx,panel_simple_spi";
			status = "okay";
			reg = <0x0>;
			spi-max-frequency = <50000000>; /* 50MHz */
			spi-bus-width = <1>;
			index = <0>;
			te_gpio = <&gpc 13 0>;
			interrupt-parent = <&gpc>;
			interrupts = <13 IRQ_TYPE_EDGE_FALLING>;
			skip_init = <0>;

			/* <w,h,w_mm,h_mm> */
			disp_mode = <240 320 31 41>;

			/* 240 * 320 init code */
			init_code = /bits/8 <
				1 0x11
				0 120
				2 0x36 0x00
				2 0x35 0x00
				2 0x3A 0x05 /* 16-bit/pixel (RGB 5-6-5-bit) */
				3 0x44 0x00 0x0a /* Set Tear Scanline */
				6 0xB2 0x0C 0x0C 0x00 0x33 0x33
				2 0xB7 0x77
				2 0xBB 0x14
				2 0xC0 0x2C
				2 0xC2 0x01
				2 0xC3 0x0F
				2 0xC6 0x00 /* Frame Rate Control in Normal Mode 0x0F->60Hz 0x15->50Hz 0x1E->40Hz 0x00->119Hz*/
				2 0xD0 0xA7
				3 0xD0 0xA4 0xA1
				2 0xD6 0xA1
				15 0xE0 0xF0 0x00 0x05 0x03 0x05 0x03 0x2F 0x54 0x46 0x37 0x12 0x13 0x2B 0x35
				15 0xE1 0xF0 0x09 0x0D 0x0D 0x0B 0x35 0x2E 0x43 0x45 0x38 0x14 0x14 0x2C 0x33
				5 0x2a 0x00 0x00 0x00 0xEF
				5 0x2b 0x00 0x00 0x01 0x3F
				1 0x21
				1 0x29
				1 0x2C
			>;

			backlight = <&pwm3_bl>;
			//power-gpio=<&gpc 4 0>;
			reset-gpios = <&gpc 5 0>;
			dc-gpios = <&gpc 27 0>;
			ub_spi_id = <2 50000000>; /* <spi_idx:SPI2 spi_baud_rate:50MHz> */

			controller-data {
				endian_mode = <0>;
			};
		};
				

spi-max-frequency设为20MHz且Frame Rate为119Hz

展示逻辑分析仪抓取的波形,如下图:

展示实物显示效果,如下:

SPI接口_最大通信速率设20MHz_屏驱帧率设为119Hz

spi-max-frequency设为20MHz且Frame Rate为60Hz

展示逻辑分析仪抓取的波形,如下图:

展示实物显示效果,如下:

SPI接口_最大通信速率设为20MHz_屏驱帧率设为60Hz

spi-max-frequency设为20MHz且Frame Rate为50Hz

展示逻辑分析仪抓取的波形,如下图:

展示实物显示效果,如下:

SPI接口_最大通信速率设20MHz_屏驱帧率设为50Hz

spi-max-frequency设为20MHz且Frame Rate为40Hz

展示逻辑分析仪抓取的波形,如下图:

展示实物显示效果,如下:

SPI接口_最大通信速率设20MHz_屏驱帧率设为40Hz

spi-max-frequency设为50MHz且Frame Rate为119Hz

展示逻辑分析仪抓取的波形,如下图:

展示实物显示效果,如下:

SPI接口_最大通信速率设50MHz_屏驱帧率设为119Hz

spi-max-frequency设为50MHz-且Frame Rate为60Hz

展示逻辑分析仪抓取的波形,如下图:

展示实物显示效果,如下:

SPI接口_最大通信速率设50MHz_屏驱帧率设为60Hz

spi-max-frequency设为50MHz-且Frame Rate为50Hz

展示逻辑分析仪抓取的波形,如下图:

展示实物显示效果,如下:

SPI接口_最大通信速率设50MHz_屏驱帧率设为50Hz

spi-max-frequency设为50MHz-且Frame Rate为40Hz

展示逻辑分析仪抓取的波形,如下图:

展示实物显示效果,如下:

SPI接口_最大通信速率设50MHz_屏驱帧率设为40Hz


总结

SPI屏幕撕裂是由于MCU或SoC写入帧存(GRAM)与显示屏驱动IC读取显示时序冲突导致的视觉异常,尤其在SPI接口带帧存的TFT显示屏上更为常见。‌‌

撕裂的根本原因在于写入与读取速度不匹配:‌ 当MCU或SoC通过SPI写帧存的速度与驱动IC读帧存的速度(由垂直同步信号TE控制)不同步时,若写入速度超过读取速度,新旧帧数据重叠;若写入速度低于读取速度,显示内容可能停留在上一帧,直到下一帧同步信号到来,造成撕裂或卡顿。‌‌

优化SPI接口显示屏动态画面撕裂的核心是实现帧同步,‌ 主要方法包括:

  • 使用TE(帧同步信号)同步‌:通过检测屏幕TE信号,在TE开始时触发MCU写入帧存,确保写入与读取时序对齐,避免冲突。‌‌
  • 合理配置刷新率与SPI时钟‌:根据屏幕分辨率、刷新率和SPI速率来计算SCLK频率,确保写入速度与读取速度比在1:2以内,例如240x320分辨率、60Hz刷新率下,SPI时钟需接近76MHz(实际需留余量)。‌‌
  • 优化LVGL等UI引擎渲染策略‌:在LVGL等中,将刷新定时器交由TE中断处理,并在flush回调中等待TE信号后再写入数据,可消除冲突,但可能牺牲一帧刷新取画面率以换稳定。‌‌

实际应用中需综合考虑硬件与软件协同:‌ 例如使用DMA传输数据减少CPU负载,并通过逻辑分析仪验证TE与写入时序,确保同步。‌‌


相关推荐
羔羊++34 分钟前
18_实验十七_其他命令与自定义启动变量
linux
DYWorker0013 小时前
Linux驱动:RK3568 GMAC + YT8531C 千兆以太网全流程解剖
linux
lisanmengmeng4 小时前
NRPE 添加命令(一)
linux·运维·服务器
树下水月5 小时前
Typora破解
linux·服务器·前端
沫璃染墨5 小时前
《从零入门Linux系统篇(五十七):线程篇·十——生产者消费者模型进阶:从环形缓冲区到POSIX信号量》
linux·运维·服务器·开发语言·c++·系统架构·信号处理
wuminyu6 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
深念Y6 小时前
rime-雾凇拼音-配置记录
linux·junit·软件·拼音·kde
殷色玫瑰7 小时前
C++ string类详解:常用接口、字符串操作与模拟实现
java·linux·c语言·开发语言·数据结构·c++
忆挽篱笙歌7 小时前
gcc,g++
linux
l1t8 小时前
修复WSL CreateInstance/E_UNEXPECTED和 mounted read-only 错误
linux·windows·wsl