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与写入时序,确保同步。‌‌


相关推荐
遇见火星9 小时前
Linux 运维:删除大日志文件时避免磁盘 IO 飙升,echo 空文件 vs truncate 命令对比实操
linux·运维·服务器
A-花开堪折9 小时前
Qemu-NUC980(十一):SPI Controller
linux·arm开发·驱动开发·嵌入式硬件
RisunJan9 小时前
Linux命令-ipcrm命令(删除Linux系统中的进程间通信(IPC)资源)
linux·运维·服务器
Joren的学习记录9 小时前
【Linux运维大神系列】Kubernetes详解2(kubeadm部署k8s1.27单节点集群)
linux·运维·kubernetes
lbb 小魔仙9 小时前
【Linux】K8s 集群搭建避坑指南:基于 Linux 内核参数调优的生产级部署方案
linux·运维·kubernetes
老兵发新帖9 小时前
ubuntu服务器配置私钥登录
linux·服务器·ubuntu
vortex59 小时前
Linux 用户组查询命令详解
linux·运维·服务器
小杜今天学AI了吗9 小时前
如何配置 linux 系统的conda 环境
linux·运维·conda
oMcLin9 小时前
如何在Ubuntu 22.04 LTS上通过配置ZFS存储池,提升高吞吐量数据库的读写性能与可靠性?
linux·数据库·ubuntu