梁山派RGB接口屏幕学习

2023-10-14 02:59
文章标签 接口 学习 屏幕 rgb 梁山

本文主要是介绍梁山派RGB接口屏幕学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

梁山派RGB接口屏幕学习

0. 目标和结论

0.1 学习RGB屏幕接口

  1. RGB接口的硬件连接
  2. RGB的软件控制
  3. SDRAM的使用

0.2 使用梁山派的RGB接口点亮之前买的屏幕TFT1P7148

  1. TFT1P7148屏幕使用的JLC大佬的转接板:https://oshwhub.com/qq_qq/rgb_tft

  2. TFT1P7148屏幕可以使用两种接口点亮,9bit的SPI接口和RGB接口,实际RGB接口也需要使用SPI先配置好才能使用

0.3 信息总结

  1. TFT1P7148屏幕的转接板的RGB数据引脚线序错乱,需要重新调整
  2. 40pin标准的RGB屏幕背光使用串联方式连接,5寸屏幕大概需要20V的电压才能点亮
  3. RGB接口的硬件连接可以通过灰度彩条显示来测试
  4. RGB接口的PCLK频率过高超过屏幕驱动芯片设定值可能会出现像素偏移
  5. 我手上的屏幕貌似都存在一定问题:白色竖条、灰度显示亮条纹、屏幕边沿亮条纹,也有可能是没调好
  6. TFT1P7148屏幕显示效果挺好的
  7. TFT1P7148屏幕的驱动IC(RM68041/2)使用RGB接口控制之前,需要先使用SPI口进行初始化和显示接口模式切换

0.4 遗留问题

  1. TFT1P7148屏幕使用RGB接口驱动,还存在一个两排像素点的白色竖条,应该是可以通过SPI配置解决的,需要仔细研究规格书,暂时没找到解决方案
  2. TFT1P7148屏幕转接板的RGB三个通道的线序有点问题,需要调整,判断标准为灰度显示是否正常

1. RGB接口学习

1.1 资料收集

  1. RGB屏幕接口介绍:https://blog.csdn.net/Oushuwen/article/details/110542307

1.2 Parallel RGB接口定义

在这里插入图片描述
  1. RGB信号线:

    RGB 信号线各有8 根,分别用于表示液晶屏一个像素点的红、绿、蓝颜色分量

  2. 同步时钟信号CLK:

    液晶屏与外部使用同步通讯方式,以CLK 信号作为同步时钟,在同步时钟的驱动下,每个时钟传输一个像素点数据

  3. 水平同步信号HSYNC:表示屏幕上一行像素数据的传输结束

    水平同步信号HSYNC(Horizontal Sync)用于表示液晶屏一行像素数据的传输结束,每传输完成液晶屏的一行像素数据时,HSYNC 会发生电平跳变,如分辨率为800x480 的显示屏(800 列,480 行),传输一帧的图像HSYNC 的电平会跳变480 次

  4. 垂直同步信号VSYNC: 表示屏幕上一帧数据的传输结束

    垂直同步信号VSYNC(Vertical Sync)用于表示液晶屏一帧像素数据的传输结束,每传输完成一帧像素数据时,VSYNC 会发生电平跳变。其中“帧”是图像的单位,一幅图像称为一帧,在液晶屏中,一帧指一个完整屏液晶像素点。人们常常用“帧/秒”来表示液晶屏的刷新特性,即液晶屏每秒可以显示多少帧图像,如液晶屏以60 帧/秒的 速率运行时,VSYNC 每秒钟电平会跳变60 次

  5. 数据使能信号DE

    用于表示数据的有效性,当DE信号线为高电平时,RGB信号线表示的数据有效

2. 梁山派的RGB接口

2.1 梁山派有一款RGB屏幕拓展板

  1. 拓展版链接:https://oshwhub.com/li-chuang-kai-fa-ban/rgb_mcu_480x800
  2. 拓展版资料下载:https://lckfb.com/docs/lspi_rgb_mcu_lcd_ex/#/%E5%B1%8F%E5%B9%95%E6%89%A9%E5%B1%95%E6%9D%BF%E8%B5%84%E6%96%99%E4%B8%8B%E8%BD%BD

2.2 梁山派RGB接口电路连接

  1. 梁山派核心板工程使用LCEDA专业版绘制:https://oshwhub.com/li-chuang-kai-fa-ban/liang-shan

  2. 专用的屏幕接口有两种,RGB接口和8080并口
    梁山派屏幕接口

  3. RGB接口使用16bit的模式,格式为RGB565

  4. 梁山派的RGB接口排线上,除了标准的RGB565接口外,还加入了一个SPI接口和一个触摸屏用的接口(目前没用到,没有触摸屏)

3. 直接点亮屏幕

3.1 点亮通用的40pin排线的RGB屏幕

  1. 接使用排线连接TFT1P7148屏幕(使用上接FPC座,实测下接的方向反了),发现只能点亮背光,同时背光可控,说明排线连接顺序正常

  2. 发现TFT1P7148屏幕转接板上还有40pin标准的RGB屏幕接口,屏幕接口连线为直通

    • 40pin标准的RGB屏幕背光使用串联方式连接,大概需要20V的电压才能点亮,直接使用可调电源限流10mA~50mA供电点亮背光

    • 背光需要将背光的排线单独拆下飞线用20V供电,否则可能会反向高电压供电烧掉核心板的电路

    在这里插入图片描述

    • 将fpc连接到TFT1P7148屏幕转接板,RGB屏幕成功点亮
      在这里插入图片描述

    • 实际电路连接,图片为后续补拍

      在这里插入图片描述

3.2 点亮TFT1P7148屏幕

  1. 寻找线索找到这款屏幕的驱动IC需要SPI配置成为RGB接口后才能使用,大佬给的SPI驱动代码中有切换RGB接口的配置

  2. 刚好看到梁山派配套的屏幕拓展板一样需要配置,且TFT1P7148屏幕转接板上预留有引出SPI接口的测试点

  3. 屏幕驱动IC(RM68041/2)规格书也有配置设定

在这里插入图片描述

  1. 飞线连接SPI接口
    在这里插入图片描述

  2. 替换屏幕初始化代码

    //************* Start Initial Sequence **********// 
    // RM68042+ AUO3.2 320*480LCD_WR_REG(0X11);delay(20);LCD_WR_REG(0XD0);//VCI1  VCL  VGH  VGL DDVDH VREG1OUT power amplitude settingLCD_WR_DATA(0X07); LCD_WR_DATA(0X42); LCD_WR_DATA(0X1D); LCD_WR_REG(0XD1);//VCOMH VCOM_AC amplitude settingLCD_WR_DATA(0X00);LCD_WR_DATA(0X1a);LCD_WR_DATA(0X09); LCD_WR_REG(0XD2);//Operational Amplifier Circuit Constant Current Adjust , charge pump frequency settingLCD_WR_DATA(0X01);LCD_WR_DATA(0X22);LCD_WR_REG(0XC0);//REV SM GS LCD_WR_DATA(0X10);LCD_WR_DATA(0X3B);LCD_WR_DATA(0X00);LCD_WR_DATA(0X02);LCD_WR_DATA(0X11);LCD_WR_REG(0XC5);// Frame rate setting = 72HZ  when setting 0x03LCD_WR_DATA(0X08);LCD_WR_REG(0XC8);//Gamma settingLCD_WR_DATA(0X00);LCD_WR_DATA(0X25);LCD_WR_DATA(0X21);LCD_WR_DATA(0X05);LCD_WR_DATA(0X00);LCD_WR_DATA(0X0a);LCD_WR_DATA(0X65);LCD_WR_DATA(0X25);LCD_WR_DATA(0X77);LCD_WR_DATA(0X50);LCD_WR_DATA(0X0f);LCD_WR_DATA(0X00);    LCD_WR_REG(0XF8);LCD_WR_DATA(0X01);    LCD_WR_REG(0XFE);LCD_WR_DATA(0X00);LCD_WR_DATA(0X02);LCD_WR_REG(0X20);//Exit invert modeLCD_WR_REG(0X36);//Set_address_mode.XY,rgb.bgroáêú?áLCD_WR_DATA(0X28);// 28LCD_WR_REG(0X3A);LCD_WR_DATA(0X55);//rgb565.16bit
    LCD_WR_REG(0xB4); //RGB
    LCD_WR_DATA(0x11);    LCD_WR_REG(0X2B);LCD_WR_DATA(0X00);LCD_WR_DATA(0X00);LCD_WR_DATA(0X01);LCD_WR_DATA(0X3F);LCD_WR_REG(0X2A);LCD_WR_DATA(0X00);LCD_WR_DATA(0X00);LCD_WR_DATA(0X01);LCD_WR_DATA(0XDF);LCD_WR_REG(0X29);     delay(200);
    
  3. 成功点亮TFT1P7148屏幕,但是屏幕显示的文字貌似存在错位的问题
    在这里插入图片描述

  4. 反复对比查找问题,发现RM68041/2驱动IC使用RGB接口时,合适的驱动频率为11MHz,示波器实测屏幕上PCLK上的信号为24MHz

在这里插入图片描述

  1. 修改代码,直接强制将RGB接口时钟设置为4分频,屏幕上文字显示错位消失

    switch (tli_clk.v){case 2:rcu_tli_clock_div_config(RCU_PLLSAIR_DIV2);break;case 4:rcu_tli_clock_div_config(RCU_PLLSAIR_DIV4);break;case 8:rcu_tli_clock_div_config(RCU_PLLSAIR_DIV8);break;case 16:rcu_tli_clock_div_config(RCU_PLLSAIR_DIV16);break;default:rcu_tli_clock_div_config(RCU_PLLSAIR_DIV4);break;}}else{/* configure the PLLSAI clock to generate lcd clock */if (ERROR == rcu_pllsai_config(192, 2, 3)){while (1);}rcu_tli_clock_div_config(RCU_PLLSAIR_DIV2);}rcu_tli_clock_div_config(RCU_PLLSAIR_DIV4);  
    
  2. 屏幕上文字显示错位问题消失,但屏幕旁边还存在一个白色的竖条,大概占据2排竖直像素点

    在这里插入图片描述

  3. 反复尝试修改配置代码,白色的竖条均无法去掉,问题暂留,看后续能否解决

    • 尝试修改分辨率,发现只要横向分辨率不为480,均会显示异常,而40pin标准的RGB屏幕,分辨率改小只会导致超出设定分辨率的部分显示重影,但是设定分辨的区间内显示正常

    • 尝试修改初始化寄存器,可以将白色竖条切换到左边,但是依然不会消失

      LCD_WR_REG(0X36);//Set_address_mode.XY,rgb.bgroáêú?á
      LCD_WR_DATA(0X38);// 28
      //0x38和0x28可以将白条切换到左边和右边
      //‘0’ = LCD Refresh Top to Bottom
      //‘1’ = LCD Refresh Bottom to Top 
      

在这里插入图片描述

4. 尝试显示图片

4.1 调整好程序

  1. 尝试抄一个图片显示的写入函数,就是简单粗暴的向SDRAM中写入数据

    void LCD_ShowPicture(uint8_t layer, uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t *data)
    {uint16_t i = 0;uint16_t j = 0;uint16_t *lcd_framebuf;for(i = 0; i < height; i++){if((y+i) >= ACTIVE_HEIGHT)   break;lcd_framebuf = ltdc_framebuf[layer] + (  ((y+i) * ACTIVE_WIDTH + x) ) ;for(j = 0; j < width; j++){if((x+j) >= ACTIVE_WIDTH) break;*(lcd_framebuf + j) = *(data + i*width + j);}}}
    
  2. 直接使用Img2Lcd转换图片成为数组

    const unsigned char gImage_cat[64800] = { /* 0X00,0X10,0XB4,0X00,0XB4,0X00,0X01,0X1B, */
    0XE6,0X49,0XC5,0X49,0XC5,0X49,0XC5,0X49,0XC5,0X49,0XC5,0X49,0X84,0X41,0X64,0X39,
    0X44,0X39,0X64,0X39,0X64,0X41,0X64,0X39,0X64,0X41,0X23,0X31,0X64,0X39,0X44,0X39,
    0X44,0X39,0X64,0X39,0X64,0X39,0X64,0X39,0X64,0X39,0X85,0X41,0X64,0X39,0X44,0X31,
    ...
    
  3. 同时需要学习以下指针加一的操作:https://blog.csdn.net/speargod/article/details/90144041

    • 指针加一,结果是对该指针增加1个存储单位
    • 所以uint16_t *的指针,直接加一就是后一个元素了,不用手动计算字节数

4.2 显示到屏幕上

  1. 40pin标准的RGB屏幕显示相对正常,但是有不正常的亮点,TFT1P7148屏幕显示图形正常,颜色完全异常

在这里插入图片描述

4.3 找到显示异常的原因

  1. 写了一个灰度显示的彩条程序用于测试

    #define C_COLOR_REPEAT 14
    void LCD_draw_colorgradation(uint8_t layer, uint16_t x, uint16_t y)
    {//color leveluint16_t color_level = 0;uint16_t cnt_color = 0;uint8_t cnt_repeat = 0;for(color_level = 0; color_level <= 0x1F; color_level ++){for(cnt_repeat = 0; cnt_repeat <C_COLOR_REPEAT;cnt_repeat++){for(cnt_color = 0; cnt_color < 50 ; cnt_color++){*(ltdc_framebuf[layer] + (color_level*C_COLOR_REPEAT +cnt_repeat +x) + (cnt_color+y)*ACTIVE_WIDTH ) = (uint16_t)color_level<<11;//0x7000;//*(ltdc_framebuf[layer] + (color_level*C_COLOR_REPEAT +cnt_repeat+x) + (50+cnt_color+y)*ACTIVE_WIDTH ) = (color_level)<<6;*(ltdc_framebuf[layer] + (color_level*C_COLOR_REPEAT +cnt_repeat+x) + (100+cnt_color+y)*ACTIVE_WIDTH ) = (color_level)<<0;*(ltdc_framebuf[layer] + (color_level*C_COLOR_REPEAT +cnt_repeat+x) + (150+cnt_color+y)*ACTIVE_WIDTH ) = ((color_level)<<11)+((color_level)<<0);*(ltdc_framebuf[layer] + (color_level*C_COLOR_REPEAT +cnt_repeat+x) + (200+cnt_color+y)*ACTIVE_WIDTH ) = ((color_level)<<11)+((color_level)<<6);*(ltdc_framebuf[layer] + (color_level*C_COLOR_REPEAT +cnt_repeat+x) + (250+cnt_color+y)*ACTIVE_WIDTH ) = ((color_level)<<0)+((color_level)<<6) +((color_level)<<11);}}}
    }
    
  2. 40pin标准的RGB屏幕灰度显示出现亮条纹,还只占横向显示的一个像素点,而软件上最少会有5个以上的像素的竖条,应该是屏幕问题

    在这里插入图片描述

  3. TFT1P7148屏幕灰度显示完全不按顺序排列,换一个40pin标准的RGB屏幕灰度显示正常,但是边沿也有条纹

在这里插入图片描述

  1. 灰度显示测试结论

    • TFT1P7148屏幕的RGB颜色通道的线序应该是乱的
    • 灰度显示有亮条纹的40pin标准的RGB屏幕应该本身存在时序问题
    • 可以通过灰度测试来检测RGB接口线序是否正常

这篇关于梁山派RGB接口屏幕学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/207670

相关文章

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert