嵌入式LCD软件驱动流程与调试

news2024/11/27 0:30:11

前言

        LCD屏在嵌入式中是应用比较广泛的,很多电子产品都是需要用到它来进行人机交互,那么工作中我们就少不了要对lcd进行软件驱动和调试。调试LCD需要掌握的学问有很多,没有一定的调试经验就很难对问题进行分析并解决。

博文推荐

LCD屏接口与模式详解:干货超多

1.查阅屏驱数据手册

下面均以st7789的屏驱为例来作说明

1.1 获取屏基本信息

首先,拿到一块需要调试的屏,我们需要先查阅它的datasheet,获取屏的基本信息

如下图所示,我们可以直接获取到

显示分辨率为240*RGB(H)*320(V),是个竖屏;

帧内存大小为240 x 320 x 18-bit=1,382,400 bits;

像素数据的数据格式可以是RGB444、RGB565 和 RGB666;

屏接口模式有MCU、RGB、SPI接口等;

屏VGH、VGL等的电压范围(初始化需配置)。

这些都是我们需要知道的,确定LCD显示器的型号和参数,还有其他一些特性可以简单过一遍。

1.2 查阅初始化命令及数据参数

在datasheet中可以查看到初始化中配置屏驱相应寄存器的命令和数据参数,调试过程中改的最多的就是这些,需要去熟悉,通常这部分有不懂的地方可以找屏厂fae支持。

1.3 配置屏寄存器

如下图所示,

RST为屏的复位信号接口;

CS为片选信号;

SCL、SDA分别为时钟线和数据线。

通常对屏寄存器的配置接口为SPI或者I2C接口协议,这里以SPI接口为例,如果主控没有spi功能的pin引脚,可以任意引出3个gpio口,将其模拟SPI协议输出,分别模拟cs、scl和sda。

SPI接口时序图

驱动部分软件驱动代码如下,这里使用的是gpio模拟spi协议。

static void lcd_gpio_spi_config_write(unsigned char bit_9,unsigned char cmd)
{
	int i=0;
	unsigned char cmd_val = 0;
	gpio_spi_disable_cs();//cs
	usleep(10);
	gpio_spi_init_clk();//sck
	gpio_spi_enable_cs();
	usleep(2);
	if(st7789v2dev.spi_is_9bit == 1)
	{
		gpio_spi_set_mosi(bit_9);//sda dat=0
		usleep(3);
		gpio_spi_generate_clk();
	}
	for(i=8;i>0;i--){
		cmd_val = (cmd>>(i-1))&0x1;
		gpio_spi_set_mosi(cmd_val);
		usleep(2);
		gpio_spi_generate_clk();
	}
	usleep(2);
	gpio_spi_disable_cs();
	gpio_spi_set_mosi(0);
	usleep(10);
}

void st7789_init()
{
    ......
    ......

    st7789v2_write_command(0x2B);// 分辨率设置
	st7789v2_write_data(0x00);
	st7789v2_write_data(0x00);
	st7789v2_write_data(0x01);
	st7789v2_write_data(0x3F);

	st7789v2_write_command(0x2A);//分辨率设置
	st7789v2_write_data(0x00);
	st7789v2_write_data(0x00);
	st7789v2_write_data(0x00);
	st7789v2_write_data(0xEF);


	st7789v2_write_command(0x21); //反色

	st7789v2_write_command(0x29); //开显示
}

1.4 模式Timing参数设置

在HV模式中,通常我们还需要去设置它的行、场信号的前后延、像素时钟等参数

如下图所示,Data bus中有部分数据是Invaild无效的数据,所以配置Timing前后沿的作用就是避开这些无效数据,配置参数值可以参考datasheet中给的参考值设定

每个平台的配置方法都有些差异,示例参考代码:

output-clock = <9>;

h-total-len = <314>;
v-total-len = <348>;

h-active-len = <240>;
v-active-len = <320>;

h-front-len = <18>;
h-sync-len = <46>;
h-back-len = <10>;

v-front-len = <8>;
v-sync-len = <10>;
v-back-len = <10>;
/* bool type, 0 or 1*/
h-sync-level = <0>;
/* bool type, 0 or 1*/
v-sync-level = <0>;
active-polarity = <1>;

1.5 配置GPIO

最后我们需要将使用到的gpio口配置成相对应的功能,如rgb数据口,根据查看主控端数据手册,将相应gpio配置为rgb功能口。

如果使用的是linux框架,可以在dts上进行配置,如:

rgb {
		pinmux-active = <
			PINPAD_T01 PINMUX_T01_PRGB_R2
			PINPAD_T02 PINMUX_T02_PRGB_R3
			PINPAD_T03 PINMUX_T03_PRGB_R4
			PINPAD_T04 PINMUX_T04_PRGB_R5
			PINPAD_T05 PINMUX_T05_PRGB_R6
			PINPAD_T06 PINMUX_T06_PRGB_R7
			PINPAD_T09 PINMUX_T09_PRGB_G2
			PINPAD_T00 PINMUX_T00_PRGB_G3
			PINPAD_T11 PINMUX_T11_PRGB_G4
			PINPAD_T12 PINMUX_T12_PRGB_G5
			PINPAD_T13 PINMUX_T13_PRGB_G6
			PINPAD_T14 PINMUX_T14_PRGB_G7
			PINPAD_L01 PINMUX_L01_PRGB_B2
			PINPAD_L02 PINMUX_L02_PRGB_B3
			PINPAD_L03 PINMUX_L03_PRGB_B4
			PINPAD_L04 PINMUX_L04_PRGB_B5
			PINPAD_L05 PINMUX_L05_PRGB_B6
			PINPAD_L06 PINMUX_L06_PRGB_B7
			PINPAD_L07 PINMUX_L07_PRGB_CLK
			PINPAD_L08 PINMUX_L08_PRGB_HSYN
			PINPAD_L09 PINMUX_L09_PRGB_VSYNC
			PINPAD_L10 PINMUX_L10_PRGB_DE>;

		status = "okay";
	};

2. LCD屏调试

2.1 屏不显示

1.首先确定硬件连线是否有问题,屏本身是否排线问题是坏的,把硬件问题排除完后,那剩下的只能是软件驱动的问题了;

2.用万用表测量屏电压、VGH、VGL等电压范围是否正常,不正常的话在初始化中根据相应的命令去配置电压值;

3.初始化配置寄存器是否有配置进去,这个可以使用逻辑分析仪看CS、CLK、SDA的数据是否正常;

4.如果是HV模式,行、场信号的极性配置不对也可以造成不显示,或异常。

2.2 屏显示异常

2.2.1 闪屏

可能的原因有LCD刷新频率过低、LCD刷新时序不稳定、LCD刷新数据不同步等。

可以有提高刷新频率(加大像素时钟输出)或降低分辨率、优化刷新时序或使用同步信号、使用双缓冲或DMA传输等。

2.2.2 花屏

可能的原因有LCD数据线干扰、LCD数据信号错误、LCD数据缓冲区溢出等。

可以使用屏蔽线或抗干扰措施、校验数据信号或纠正错误、增加数据缓冲区或清空缓冲区;

有时候颜色显示不正常,也可能是屏驱给反色了,可以去配置寄存器。

总结

总之,调屏我们需要掌握基本的驱动流程,如果遇到问题就一步步排除可能的原因,其它有很多细节点,是需要去积累经验的,调试多了自然就懂了。

如果本文理解上有不对的地方,欢迎指出,共同进步!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1267228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络协议系列:TCP三次握手,四次挥手的全过程,为什么需要三次握手,四次挥手

TCP三次握手&#xff0c;四次挥手的全过程&#xff0c;为什么需要三次握手&#xff0c;四次挥手 一. TCP三次握手&#xff0c;四次挥手的全过程&#xff0c;为什么需要三次握手&#xff0c;四次挥手前言TCP协议的介绍三次握手三次握手流程&#xff1a;1. A 的 TCP 向 B 发送 连…

LVS-NAT实验

实验前准备&#xff1a; LVS负载调度器&#xff1a;ens33&#xff1a;192.168.20.11 ens34&#xff1a;192.168.188.3 Web1节点服务器1&#xff1a;192.168.20.12 Web2节点服务器2&#xff1a;192.168.20.13 NFS服务器&#xff1a;192.168.20.14 客户端&#xff08;win11…

速速报名!请查收 2023 龙蜥操作系统大会超全指南

亲爱的小伙伴们&#xff0c;大家好&#xff01;我是大家的老朋友小龙&#xff01;自 2023 龙蜥操作系统大会宣布启动以来&#xff0c;小龙收到了来自四面八方的诸多期待和小心心。首届龙蜥大会正如火如荼地进行中&#xff0c;为表示对关注社区的每一位小伙伴由衷的感谢&#xf…

排序算法基本原理及实现1

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 &#x1f4d1;插入排序 &#x1f4…

人工智能即将彻底改变你使用计算机的方式

文章目录 每个人的私人助理“Clippy 是一个机器人&#xff0c;而不是特工。”卫生保健“一半需要心理健康护理的美国退伍军人没有得到治疗。”教育生产率娱乐和购物科技行业的冲击波技术挑战隐私和其他重大问题 今天我仍然像保罗艾伦和我创办微软时一样热爱软件。但是&#xff…

Linux系统之一次性计划任务at命令的基本使用

Linux系统之一次性计划任务at命令的基本使用 一、at命令介绍二、at命令的使用帮助2.1 at命令的help帮助信息2.2 at命令的语法解释 三、at命令的日常使用3.1 立即执行一次性任务3.2 指定时间执行一次性任务3.3 查询计划任务3.4 其他指定时间用法3.5 删除已经设置的计划任务3.6 显…

C语言——计算Fibonacci数列

方式一 for循环 (20位) #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int n;int a[20]{1,1};for ( n 1; n <20; n){a[n]a[n-2]a[n-1];}for ( n 0; n < 20; n){if(n%50)printf("\n");printf("%12d ",a[n]);}return 0; …

【每日一题】无限集中的最小数字

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;有限集合方法二&#xff1a;有序集合 写在最后 Tag 【有序集合】【2023-11-29】 题目来源 2336. 无限集中的最小数字 题目解读 设计一个类实现移除无限集中的最小整数以及向该无限集中增加一个原集合中不存在的整数。…

【JavaEE初阶】 HTTP响应报文

文章目录 &#x1f332;序言&#x1f38d;200 OK&#x1f340;404 Not Found&#x1f384;403 Forbidden&#x1f334;405 Method Not Allowed&#x1f38b;500 Internal Server Error&#x1f333;504 Gateway Timeout&#x1f332;302 Move temporarily&#x1f38d;301 Move…

vs2012切换版本后WebUI项目加载失败,右键重新加载提示已经在解决方案中打开了具有该名称的项目

问题描述 vs2012切换版本后&#xff0c;回到主版本web项目加载失败&#xff0c;右键重新加载提示已经在解决方案中打开了具有该名称的项目 解决办法 打开根目录.csproj文件&#xff0c;找到第一个ProectTypeGuides节点&#xff0c;删除掉。然后关闭vs,重新打开此项目即可。这…

rust-flexi_logger

flexi_logger 是字节开源的rust日志库。目前有log4rs、env_log 等库&#xff0c;综合比较下来&#xff0c;还是flexi_logger简单容易上手&#xff0c;而且自定义很方便&#xff0c;以及在效率方面感觉也会高&#xff0c;下篇文章我们来测试下。 下面来看下怎么使用 关注 vx gol…

bugku题解记录2

文章目录 哥哥的秘密黄道十二官where is flag一段新闻 哥哥的秘密 给出了一个qq&#xff0c;那就去看看呗 hint里面说 收集空间信息——相册——收集微博信息——相册——解题——相册——提交flag 那看看空间先 盲文&#xff1a; hint&#xff1a;密码时地人 旗帜存在相册里…

Nature子刊最新研究:Hi-C宏基因组揭示土壤-噬菌体-宿主相互作用

土壤中有大量的噬菌体。然而&#xff0c;大多数宿主未知&#xff0c;无法获得其基因组特征。2023年11月23日&#xff0c;最新发表于《Nature communications》期刊题为“Hi-C metagenome sequencing reveals soil phage–host interactions”的文章&#xff0c;通过高通量染色体…

京东数据产品推荐-京东数据挖掘-京东平台2023年10月滑雪装备销售数据分析

如今&#xff0c;滑雪正成为新一代年轻人的新兴娱乐方式&#xff0c;借助北京冬奥会带来的发展机遇&#xff0c;我国冰雪经济已逐渐实现从小众竞技运动到大众时尚生活方式的升级。由此也带动滑雪相关生意的增长&#xff0c;从滑雪服靴到周边设备&#xff0c;样样都需要消费者掏…

基于Eclipse+SDK+ADT+DDMS的安卓开发环境完整搭建过程

基于EclipseSDKADTDDMS的安卓开发环境完整搭建过程 1 基本概念2 SDK安装3 Eclipse安装4 ADT插件安装4.1 在线安装&#xff08;太慢不建议选择&#xff09;4.2 离线安装&#xff08;建议选择&#xff09; 5 配置SDK6 集成安装7 创建安卓虚拟设备8 创建并启动安卓虚拟机8 关于DDM…

Zemax光学设计——单透镜设计

单透镜系统参数&#xff1a; 入瞳直径&#xff1a;20mm F/#&#xff08;F数&#xff09;&#xff1a;10 全视场&#xff1a;10 波长&#xff1a;587nm 材料&#xff1a;BK7 优化方向&#xff1a;最佳均方根光斑直径 设计步骤 一、单透镜系统参数 步骤一&#xff1a;入…

45、Flink 的指标体系介绍及验证(2)-指标的scope、报告、系统指标以及追踪、api集成示例和dashboard集成

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

【傻瓜级JS-DLL-WINCC-PLC交互】7.​C#直连PLC并读取PLC数据

思路 JS-DLL-WINCC-PLC之间进行交互&#xff0c;思路&#xff0c;先用Visual Studio创建一个C#的DLL控件&#xff0c;然后这个控件里面嵌入浏览器组件&#xff0c;实现JS与DLL通信&#xff0c;然后DLL放入到WINCC里面的图形编辑器中&#xff0c;实现DLL与WINCC的通信。然后PLC与…

有理有据:数据库选择集中式还是分布式

OLTP类型的业务系统采用集中式数据库还是分布式数据库是在做国产数据库改造中经常被问到的问题&#xff0c;无论是对技术架构发展演变&#xff0c;还是对现有业务长期发展提供必要的支撑&#xff0c;这个问题都具有讨论意义。在分布式大行其道的背景下&#xff0c;似乎任何架构…

三年后重启港股IPO,卷出国门后的宁德时代实力几何?

近些年&#xff0c;国内的新能源汽车发展如火如荼&#xff0c;与之紧密相关的动力电池企业也搭上了发展的高速列车。经过初期的扩产潮后&#xff0c;国内动力电池行业目前产能过剩的风险正在逐渐加剧。 国内的头部企业为了减轻库存压力&#xff0c;在新一轮的竞争与洗牌周期中…