展锐UIS8850 外接LCD屏 ST7735S 驱动

发布时间 2023-05-25 09:59:36作者: 429512065

1. 首先配置全局的 target  

CONFIG_LCD_SUPPORT=y
CONFIG_SUPPORT_LCD_GC9305=n
CONFIG_SUPPORT_LCD_GC9306=n
CONFIG_SUPPORT_LCD_ST7735S=y

这里遇到一个问题,如果同时出现了下面两行,对同一个配置开关,最后结果是未设置

CONFIG_SUPPORT_LCD_ST7789h2=y

# CONFIG_SUPPORT_LCD_ST7789h2 is not set

 

2. 代码中有两套LCD 的驱动,用的 V2版本,增加一个 st7735s 的驱动,从st7789h2 拷贝一份即可

 

3.  在这份文件中修改,注意选8位EGB565, 4线SPI,方向选正常,宽度高度等

const drvLcdPanelDesc_t gLcdSt7735SDesc = {
    .ops = {
        .probe = prvSt7735SProbe,
        .init = prvSt7735SInit,
        .blit_prepare = prvSt7735SBlitPrepare,
    },
    .name = "St7735S",
    .dev_id = 0x858552,
    .reset_us = 20 * 1000,
    .init_delay_us = 100 * 1000,
    .width = 128,
    .height = 160,
    .out_fmt = DRV_LCD_OUT_FMT_8BIT_RGB565,
    .dir = DRV_LCD_DIR_NORMAL,
    .line_mode = DRV_LCD_SPI_4WIRE,
#ifdef CONFIG_8850_FPGA_BOARD
    .fmark_enabled = false,
#else
    .fmark_enabled = true,
#endif
    .fmark_delay = 0x18000,
#ifdef CONFIG_8850_FPGA_BOARD
    .freq = 10 * 1000000,
    .frame_us = (unsigned)(11200000 / 28.0),
#else
    .freq = 50 * 1000000,
    .frame_us = (unsigned)(1000000 / 28.0),
#endif
};

 

4. 去掉读ID 的过程

static bool prvSt7735SProbe(void *d)
{
    const drvLcdPanelDesc_t *desc = drvLcdGetDesc(d);

    OSI_LOGI(0x100089ce, "St7735S probe");
    //qhq  ID值直接返回1, 屏不用读取ID
    //return prvSt7735SReadId(d) == desc->dev_id;
    prvSt7735SReadId(d);
    return true;
    //qhq
}

 

5.  panel_desc.c  里面添加 st7735s 的句柄

 

6. 上层应用

void atCmdHandleLLCD(atCommand_t *cmd)
{
    static drvLcd_t *gLcd;

        uint8_t command = 1; 
        drvLcdInitV2();
        gLcd = drvLcdGetByname(DRV_NAME_LCD1);
        if (gLcd == NULL)
        {
        }
        if (!drvLcdOpenV2(gLcd))
        {
        }
        drvLcdPanelInfo_t panel_info;
        if (!drvLcdGetPanelInfo(gLcd, &panel_info))
        {
        }
        drvLcdSetBackLightEnable(gLcd, true);
        if(command == 1)
        {
            drvLcdFill(gLcd, 0xf800, NULL, false); // 红色
        }
        else if(command == 2)
        {
            drvLcdFill(gLcd, 0x07e0, NULL, false); // 绿色
        }
        else
        {
            drvLcdFill(gLcd, 0x01f, NULL, false); // 蓝色
        }
}

 

7.  硬件接法,实际测试不接CS,原因未知

 

8. 测试效果

 

 

9.  总结,8位 RGB565  和 16位 RGB565 不一样,要注意,CS引脚不要接,接上有奇怪的问题。接下来的工作是移植 Little VGL.