数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2245|回复: 44

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

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

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

                while(1)
                {
                        for(int i=0;i<TEST_LCD_V_RES;i++)
                        {
                                for(int j=0;j<TEST_LCD_H_RES*3;j++)    // RED
                                        {
                                                if(i%2==0)
                                                {
                                                        if(j%3==1)        *(img+TEST_LCD_H_RES*3*i+j)=0xff;   
                                                        else *(img+TEST_LCD_H_RES*3*i+j)=0x00;
                                                }       
                                                else
                                                {
                                                        if(j%3==2)        *(img+TEST_LCD_H_RES*3*i+j)=0xff;
                                                        else *(img+TEST_LCD_H_RES*3*i+j)=0x00;                                       
                                                }       
                                        }
                        }       
                        esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, TEST_LCD_H_RES, TEST_LCD_V_RES, img);
                        vTaskDelay(pdMS_TO_TICKS(400));
                       
                        for(int i=0;i<TEST_LCD_V_RES;i++)
                        {
                                for(int j=0;j<TEST_LCD_H_RES*3;j++)    // GREEN
                                        {
                                                if(i%2==0)
                                                {
                                                        if(j%3==2)        *(img+TEST_LCD_H_RES*3*i+j)=0xff;   
                                                        else *(img+TEST_LCD_H_RES*3*i+j)=0x00;
                                                }       
                                                else
                                                {
                                                        if(j%3==0)        *(img+TEST_LCD_H_RES*3*i+j)=0xff;
                                                        else *(img+TEST_LCD_H_RES*3*i+j)=0x00;                                       
                                                }       
                                        }
                        }       
                        esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, TEST_LCD_H_RES, TEST_LCD_V_RES, img);
                        vTaskDelay(pdMS_TO_TICKS(400));               
                       
                        for(int i=0;i<TEST_LCD_V_RES;i++)
                        {
                                for(int j=0;j<TEST_LCD_H_RES*3;j++)    // BLUE
                                        {
                                                if(i%2==0)
                                                {
                                                        if(j%3==0)        *(img+TEST_LCD_H_RES*3*i+j)=0xff;   
                                                        else *(img+TEST_LCD_H_RES*3*i+j)=0x00;
                                                }       
                                                else
                                                {
                                                        if(j%3==1)        *(img+TEST_LCD_H_RES*3*i+j)=0xff;
                                                        else *(img+TEST_LCD_H_RES*3*i+j)=0x00;                                       
                                                }       
                                        }
                        }       
                        esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, TEST_LCD_H_RES, TEST_LCD_V_RES, img);
                        vTaskDelay(pdMS_TO_TICKS(400));       
                       
                        for(int i=0;i<TEST_LCD_V_RES;i++)                        //WHITE
                                for(int j=0;j<TEST_LCD_H_RES*3;j++)
                                        *(img+TEST_LCD_H_RES*3*i+j)=0xFF;       
                        esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, TEST_LCD_H_RES, TEST_LCD_V_RES, img);
                        vTaskDelay(pdMS_TO_TICKS(400));                               
               
                        memset(img, 0x00, TEST_LCD_V_RES * TEST_LCD_H_RES * 3);
               
                        esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, TEST_LCD_H_RES, TEST_LCD_V_RES, img);               
                        vTaskDelay(pdMS_TO_TICKS(400));
//                        LCD_SPI_Transfer_Packet(0x4,0x8B);                 //narrow display       

                        for(int i=0;i<TEST_LCD_V_RES;i++)
                        {
                                for(int j=0;j<TEST_LCD_H_RES*3;j++)    //Display picture
                                        {
                                                if(i%2==0)        //偶数行不交换
                                                {
                                                        *(img+TEST_LCD_H_RES*3*i+j)=gImage_pig_BRG[TEST_LCD_H_RES*3*i+j];   
                                                }       
                                                else                   //奇数行交换颜色
                                                {
                                                        if(j%3==0)                *(img+TEST_LCD_H_RES*3*i+j)=gImage_pig_BRG[TEST_LCD_H_RES*3*i+j+2];
                                                        else if(j%3==1)        *(img+TEST_LCD_H_RES*3*i+j)=gImage_pig_BRG[TEST_LCD_H_RES*3*i+j-1];       
                                                        else                        *(img+TEST_LCD_H_RES*3*i+j)=gImage_pig_BRG[TEST_LCD_H_RES*3*i+j-1];       
                                                }       
                                        }
                        }

                        esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, TEST_LCD_H_RES, TEST_LCD_V_RES, img);               
                        vTaskDelay(pdMS_TO_TICKS(2000));       
//                        LCD_SPI_Transfer_Packet(0x4,0x0B);                 //normal display                       
                }


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

5、附件:
3inch16-9规格书.rar (3.23 MB, 下载次数: 7) rgb_lcd-babymonitor.zip (275.65 KB, 下载次数: 3) rgb_lcd-delta.zip (218.23 KB, 下载次数: 1)

打赏

参与人数 8家元 +150 收起 理由
hongo + 20 原創內容
fu691 + 20 謝謝分享
200birds + 20
慕名而来 + 20 優秀文章
qrut + 20
ww5223017240 + 20 謝謝分享
nokia5320 + 10
18249666722 + 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:09:39 | 显示全部楼层

谢谢分享 学习一下
回复 支持 反对

使用道具 举报

发表于 2023-3-8 09:47:54 | 显示全部楼层
感谢分享   
回复 支持 反对

使用道具 举报

发表于 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 来自手机浏览器 | 显示全部楼层
有本事的人
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2023-3-22 06:53 , Processed in 0.109200 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2023, smzj.net

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