数码之家

 找回密码
 立即注册
搜索
查看: 6751|回复: 55

[综合] 时隔一年多,用ESP32S3成功驱动8bitRGB屏,一鼓作气又驱动2.8元的RGB delta屏

    [复制链接]
发表于 2023-3-7 21:56:18 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、前言
一年前入手动力工具DIY家SEW-3037W 婴儿无线监视器(发文链接 https://www.mydigit.cn/thread-280592-1-1.html),当时尝试用ESP32的SPI来驱动3.5寸显示屏没有成功,后来找到了屏驱动IC为HX8238-D,并等待ESP32S3上市后购入。时隔一年后,ESP32S3模块降价到与ESP32一样的价格,官方代码也逐渐稳定了,是时候行动了。于是斥资40元入手了非官方版本的ESP32-S3-DevKitC-1模块。下载了开发包,编译测试模块一样好用。模块集成串口,不用按BOOT键直接烧录,很香!
IMG_20230307_162517.jpg

2、婴儿无线监视器显示屏点亮
2.1、用逻辑分析仪测试得出屏接口定义如下:

PIN          FUN
1            D0
2        D1
3        D2
4        D3
5        D4
6        D5
7        D6
8        D7
9        DOTCLK
10        VSYNC
11        HSYNC
12        SCK
13        SDI
14        CSB
15        VCC3V3
16        GND
17        BLED-
18        NC
19        BLED+
20        NC
.
.
.
39        RESB
40        NC

2.2、接口转接板
网上有卖各种接口转接板,转成2.54mm能够插杜邦线的双排针,方便连接。
IMG_20230307_162603.jpg

2.3、连线
按照接口定义和代码中定义连好开发板和接口板连线,插上LCD排线。
IMG_20230307_162712.jpg


2.4、代码
采用的是Espressif\frameworks\esp-idf-v5.0\components\esp_lcd\test_apps\rgb_lcd的参考代码,增加模拟SPI配置LCD。代码比较简单,后面附上。
调用test_rgb_panel_initialization(8, 24, 0, false, NULL, NULL);配置8bit RGB,24代表串行8位RGB数据,也就是一个点需要分别传RGB三中颜色8bit数据。
调用esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, TEST_LCD_H_RES, TEST_LCD_V_RES, img);刷新显示缓冲区即可显示。
时序按照手册推荐值设置即可

        .timings = {
            .pclk_hz = TEST_LCD_PIXEL_CLOCK_HZ,
            .h_res = TEST_LCD_H_RES,
            .v_res = TEST_LCD_V_RES,
            .hsync_back_porch = 204,
            .hsync_front_porch =60,
            .hsync_pulse_width = 1,
            .vsync_back_porch = 18,
            .vsync_front_porch = 4,
            .vsync_pulse_width = 1,            
        },


image.png

2.5、显示
完美显示图片。3.5寸屏幕分辨率320*240,颗粒感较强。
IMG_20230307_163150.jpg IMG_20230307_163203.jpg IMG_20230307_175616.jpg

3、老王家2.8元的3寸屏驱动
有了以上驱动经验,对付老王家的这个屏就好办了。由于已有大侠分析出了驱动芯片和接口,并用FPGA和STM32来驱动的,我这次用ESP32S3来驱动,比较方便。
image.png

3.1、同样,上转接板,这个屏需要外接一些电容,LED需要9.6V电压,用个12V适配器串接120欧姆电阻降压。
IMG_20230307_175956.jpg
IMG_20230307_180012.jpg

3.2、连线,显示
该屏物理尺寸是16:9,但是像素是4:3,320*240分辨率,SPI配置可以切换比例。没有仔细分析两种模式的像素点数。
IMG_20230307_192811.jpg
IMG_20230307_192817.jpg IMG_20230307_193326.jpg IMG_20230307_193344.jpg IMG_20230307_200826.jpg

3.3 认识Delta屏
不知各位有没有注意到,上图中佩奇的照片颜色不一致,这就是Delta屏造成的。婴儿监视器的屏所有行数据就是RGBRGB。。。。RGB,而这个Delta屏的数据是偶数行GRBGRB。。。
奇数行GBRGBR。。。,需要对数据作处理交换才可以正常显示颜色。
image.png


  1.                 while(1)
  2.                 {
  3.                         for(int i=0;i<TEST_LCD_V_RES;i++)
  4.                         {
  5.                                 for(int j=0;j<TEST_LCD_H_RES*3;j++)    // RED
  6.                                         {
  7.                                                 if(i%2==0)
  8.                                                 {
  9.                                                         if(j%3==1)        *(img+TEST_LCD_H_RES*3*i+j)=0xff;   
  10.                                                         else *(img+TEST_LCD_H_RES*3*i+j)=0x00;
  11.                                                 }        
  12.                                                 else
  13.                                                 {
  14.                                                         if(j%3==2)        *(img+TEST_LCD_H_RES*3*i+j)=0xff;
  15.                                                         else *(img+TEST_LCD_H_RES*3*i+j)=0x00;                                       
  16.                                                 }        
  17.                                         }
  18.                         }        
  19.                         esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, TEST_LCD_H_RES, TEST_LCD_V_RES, img);
  20.                         vTaskDelay(pdMS_TO_TICKS(400));
  21.                         
  22.                         for(int i=0;i<TEST_LCD_V_RES;i++)
  23.                         {
  24.                                 for(int j=0;j<TEST_LCD_H_RES*3;j++)    // GREEN
  25.                                         {
  26.                                                 if(i%2==0)
  27.                                                 {
  28.                                                         if(j%3==2)        *(img+TEST_LCD_H_RES*3*i+j)=0xff;   
  29.                                                         else *(img+TEST_LCD_H_RES*3*i+j)=0x00;
  30.                                                 }        
  31.                                                 else
  32.                                                 {
  33.                                                         if(j%3==0)        *(img+TEST_LCD_H_RES*3*i+j)=0xff;
  34.                                                         else *(img+TEST_LCD_H_RES*3*i+j)=0x00;                                       
  35.                                                 }        
  36.                                         }
  37.                         }        
  38.                         esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, TEST_LCD_H_RES, TEST_LCD_V_RES, img);
  39.                         vTaskDelay(pdMS_TO_TICKS(400));               
  40.                         
  41.                         for(int i=0;i<TEST_LCD_V_RES;i++)
  42.                         {
  43.                                 for(int j=0;j<TEST_LCD_H_RES*3;j++)    // BLUE
  44.                                         {
  45.                                                 if(i%2==0)
  46.                                                 {
  47.                                                         if(j%3==0)        *(img+TEST_LCD_H_RES*3*i+j)=0xff;   
  48.                                                         else *(img+TEST_LCD_H_RES*3*i+j)=0x00;
  49.                                                 }        
  50.                                                 else
  51.                                                 {
  52.                                                         if(j%3==1)        *(img+TEST_LCD_H_RES*3*i+j)=0xff;
  53.                                                         else *(img+TEST_LCD_H_RES*3*i+j)=0x00;                                       
  54.                                                 }        
  55.                                         }
  56.                         }        
  57.                         esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, TEST_LCD_H_RES, TEST_LCD_V_RES, img);
  58.                         vTaskDelay(pdMS_TO_TICKS(400));        
  59.                         
  60.                         for(int i=0;i<TEST_LCD_V_RES;i++)                        //WHITE
  61.                                 for(int j=0;j<TEST_LCD_H_RES*3;j++)
  62.                                         *(img+TEST_LCD_H_RES*3*i+j)=0xFF;        
  63.                         esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, TEST_LCD_H_RES, TEST_LCD_V_RES, img);
  64.                         vTaskDelay(pdMS_TO_TICKS(400));                                
  65.                
  66.                         memset(img, 0x00, TEST_LCD_V_RES * TEST_LCD_H_RES * 3);
  67.                
  68.                         esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, TEST_LCD_H_RES, TEST_LCD_V_RES, img);               
  69.                         vTaskDelay(pdMS_TO_TICKS(400));
  70. //                        LCD_SPI_Transfer_Packet(0x4,0x8B);                 //narrow display        

  71.                         for(int i=0;i<TEST_LCD_V_RES;i++)
  72.                         {
  73.                                 for(int j=0;j<TEST_LCD_H_RES*3;j++)    //Display picture
  74.                                         {
  75.                                                 if(i%2==0)        //偶数行不交换
  76.                                                 {
  77.                                                         *(img+TEST_LCD_H_RES*3*i+j)=gImage_pig_BRG[TEST_LCD_H_RES*3*i+j];   
  78.                                                 }        
  79.                                                 else                   //奇数行交换颜色
  80.                                                 {
  81.                                                         if(j%3==0)                *(img+TEST_LCD_H_RES*3*i+j)=gImage_pig_BRG[TEST_LCD_H_RES*3*i+j+2];
  82.                                                         else if(j%3==1)        *(img+TEST_LCD_H_RES*3*i+j)=gImage_pig_BRG[TEST_LCD_H_RES*3*i+j-1];        
  83.                                                         else                        *(img+TEST_LCD_H_RES*3*i+j)=gImage_pig_BRG[TEST_LCD_H_RES*3*i+j-1];        
  84.                                                 }        
  85.                                         }
  86.                         }

  87.                         esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, TEST_LCD_H_RES, TEST_LCD_V_RES, img);               
  88.                         vTaskDelay(pdMS_TO_TICKS(2000));        
  89. //                        LCD_SPI_Transfer_Packet(0x4,0x0B);                 //normal display                        
  90.                 }
复制代码


4、几点说明
DOTCLK时钟设置为20MHz,设置太高屏幕显示会横向漂移。
ESP32S3模块要用带8线PSRAM的,示例程序需要用到PSRAM,8线80MHz的速率PSRAM才能正常显示。
ESP32S3 SDK写好了SPI,I2C,i80,RGB等各种屏的示例程序,使用起来比较方便。

5、资料附件下载:

3inch16-9规格书.rar

3.23 MB, 下载次数: 16, 下载积分: 家元 -55

3寸屏规格书

rgb_lcd-babymonitor.zip

275.65 KB, 下载次数: 9, 下载积分: 家元 -55

婴儿监视器屏代码

rgb_lcd-delta.zip

218.23 KB, 下载次数: 13, 下载积分: 家元 -55

3寸delta屏代码

打赏

参与人数 9家元 +180 收起 理由
jf201006 + 30 優秀文章
hongo + 20 原創內容
fu691 + 20 謝謝分享
200birds + 20
慕名而来 + 20 優秀文章
qrut + 20
ww5223017240 + 20 謝謝分享
nokia5320 + 10
海上生明月丶 + 20 謝謝分享

查看全部打赏

发表于 2023-3-7 22:33:13 来自手机浏览器 | 显示全部楼层
高手在民间啊
回复 支持 反对

使用道具 举报

发表于 2023-3-8 07:19:32 | 显示全部楼层
看到代码就头晕

回复 支持 1 反对 0

使用道具 举报

发表于 2023-3-8 07:42:23 | 显示全部楼层
用于钻研和实践的人啊
回复 支持 反对

使用道具 举报

发表于 2023-3-8 08:26:24 | 显示全部楼层
看来这个屏该涨价了,往往各种研究最终受益者却是商家
回复 支持 0 反对 0

使用道具 举报

发表于 2023-3-8 09:03:02 | 显示全部楼层
qrut 发表于 2023-3-8 08:26
看来这个屏该涨价了,往往各种研究最终受益者却是商家

估计又给商家创收益了。
回复 支持 反对

使用道具 举报

发表于 2023-3-8 09:09:20 | 显示全部楼层
qrut 发表于 2023-3-8 08:26
看来这个屏该涨价了,往往各种研究最终受益者却是商家

可以选择研究出来后直接包圆了

打赏

参与人数 1家元 +10 收起 理由
qrut + 10 精彩回帖

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2023-3-8 09:59:59 | 显示全部楼层
飞向狙沙 发表于 2023-3-8 09:09
可以选择研究出来后直接包圆了

哈哈,贪婪的人类
回复 支持 0 反对 0

使用道具 举报

发表于 2023-3-8 11:54:33 | 显示全部楼层

好贴 ,感谢分享  
回复 支持 反对

使用道具 举报

发表于 2023-3-8 18:18:57 | 显示全部楼层
膜拜,依葫芦画瓢都画不了
回复 支持 反对

使用道具 举报

发表于 2023-3-8 18:51:29 | 显示全部楼层
楼主真是高手
回复 支持 反对

使用道具 举报

发表于 2023-3-8 19:23:56 | 显示全部楼层
好技 术, 点屏操作很详细
回复 支持 反对

使用道具 举报

发表于 2023-3-8 19:46:21 | 显示全部楼层
膜拜下大神。。。。
回复 支持 反对

使用道具 举报

发表于 2023-3-9 13:01:08 来自手机浏览器 | 显示全部楼层
有本事的人
回复 支持 反对

使用道具 举报

发表于 2023-3-9 13:45:00 | 显示全部楼层
虽然不懂但是看着就必须加分
回复 支持 反对

使用道具 举报

发表于 2023-3-9 14:45:09 | 显示全部楼层
image.png 这是高手啊  
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-26 20:21 , Processed in 0.171600 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表