LCD屏入门(基于ESP-IDF、I80屏)

主要参考资料:
B站【乐鑫全球开发者大会】DevCon23 #17 |HMI 智能屏解决方案

1. 简介

MCU常用的驱动接口在下面,大致可以划分为串口屏和并口屏。
串口屏相较于并行屏优势是占用IO少,相应地数据传输带宽也低。
SPI有标准SPI和QSPI之分,具体可以看链接: https://blog.csdn.net/wangguchao/article/details/105593303

在这里插入图片描述

2. 硬件层

对于 SPI/I80接口,命令和颜色数据使用同一个接口。
在这里插入图片描述
可以看到屏幕有40线
在这里插入图片描述

在这里插入图片描述

3. 软件层

为了便于封装接口,习惯上会将屏幕代码分为三个层级:SDK层、驱动层和APP层。

在这里插入图片描述

3.1 SDK层component模块

在SDK层中封装了对 IO配置 和 总线配置的接口。已经作为components在ESP-IDF中

3.2 确认驱动兼容性

3.3 配置端口层(I80屏幕和触摸)

下面的代码是lv_port的一个示例,可以看到对 LCD的初始化、显示的初始化 和 输入设备的初始化。

esp_err_t lv_port_init(void)
{
    /* Initialize LVGL library */
    lv_init();

    /* Register display for LVGL */
    ESP_ERROR_CHECK(bsp_lcd_init());
    lv_port_disp_init();

    /* Register input device for LVGL*/
    ESP_ERROR_CHECK(indev_init_default());
    lv_port_indev_init();

    /* Initialize LVGL's tick source */
    lv_port_tick_init();

    /* Nothing error */
    return ESP_OK;
}

3.3.1 LCD的初始化

在lv_port_disp_init函数中,安装屏幕端口和驱动,主要做以下三件事。

  • I80总线配置
    ESP_LOGI(TAG, "init lvgl lcd display port");
    esp_lcd_i80_bus_handle_t i80_bus = NULL;
    esp_lcd_i80_bus_config_t bus_config = {
        .dc_gpio_num = GPIO_LCD_RS,
        .wr_gpio_num = GPIO_LCD_WR,
        .data_gpio_nums = {
            GPIO_LCD_D00,
            GPIO_LCD_D01,
            GPIO_LCD_D02,
            GPIO_LCD_D03,
            GPIO_LCD_D04,
            GPIO_LCD_D05,
            GPIO_LCD_D06,
            GPIO_LCD_D07,
#if LCD_BIT_WIDTH == 16
            GPIO_LCD_D08,
            GPIO_LCD_D09,
            GPIO_LCD_D10,
            GPIO_LCD_D11,
            GPIO_LCD_D12,
            GPIO_LCD_D13,
            GPIO_LCD_D14,
            GPIO_LCD_D15,
#endif
        },
        .bus_width = LCD_BIT_WIDTH,
        .max_transfer_bytes = LCD_WIDTH * 480 * sizeof(uint16_t),
        .psram_trans_align = 64,
        .sram_trans_align = 4,
    };
    ESP_ERROR_CHECK(esp_lcd_new_i80_bus(&bus_config, &i80_bus));
  • IO配置
    esp_lcd_panel_io_handle_t io_handle = NULL;
    esp_lcd_panel_io_i80_config_t io_config = {
        .cs_gpio_num = GPIO_LCD_CS,
        .pclk_hz = 20000000,  //20MHZ
        .trans_queue_depth = 20,
        .dc_levels = {
            .dc_idle_level = 0,
            .dc_cmd_level = 0,
            .dc_dummy_level = 0,
            .dc_data_level = 1,
        },
        .flags = {
#if LCD_BIT_WIDTH == 8
            .swap_color_bytes = 1, // Swap can be done in LvGL (default) or DMA
#else
            .swap_color_bytes = 0, // Swap can be done in LvGL (default) or DMA
#endif
        },
        .on_color_trans_done = notify_lvgl_flush_ready, // Callback invoked when color data transfer has finished
        .user_ctx = &disp_drv,                          // User private data, passed directly to on_color_trans_done’s user_ctx
        .lcd_cmd_bits = 16,
        .lcd_param_bits = 16,
    };
    ESP_ERROR_CHECK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handle));
  • 安装LCD驱动
	esp_lcd_panel_dev_config_t panel_config = {
	    .reset_gpio_num = GPIO_LCD_RST, //gpio of reset
	    .color_space = ESP_LCD_COLOR_SPACE_RGB, //the order of rgb
	    .bits_per_pixel = 16, 
	};
	ESP_ERROR_CHECK(esp_lcd_new_panel_nt35510(io_handle, &panel_config, &panel_handle));
	esp_lcd_panel_reset(panel_handle); // LCD Reset before config
	vTaskDelay(10);
	nt35510_reg_config(io_handle);//send register's address and data to nt35510
	esp_lcd_panel_init(panel_handle); // LCD init
	esp_lcd_panel_swap_xy(panel_handle, true);
	esp_lcd_panel_mirror(panel_handle, true, false);

3.3.2 输入设备的初始化

安装触摸端口

3.4 配置LVGL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值