主要参考资料:
ESP32-S3 开发 SPI 屏【DIY 智能手表】: https://www.bilibili.com/video/BV1Yc411y7bb/?spm_id_from=333.337.search-card.all.click&vd_source=dd284033cd0c4d1f3f59a2cd40ae4ef9
使用 SPI 屏和 I2C 触屏运行 SquareLine Studio 提供的手表 UI 示例: https://gitee.com/esp-friends/lcd_touch
B站【乐鑫全球开发者大会】DevCon23 #17 |HMI 智能屏解决方案
目录
- 1. 简介
- 2. 硬件层接线
- 3. 软件层
- 3.1 SDK层component模块
- 3.2 确认驱动兼容性
- 3.3 配置端口层(SPI屏幕和触摸)
- 3.3.1 LCD的初始化
- 3.3.2 输入设备的初始化
- 3.4 配置LVGL
1. 简介
MCU常用的驱动接口在下面,大致可以划分为串口屏和并口屏。
串口屏相较于并行屏优势是占用IO少,相应地数据传输带宽也低。
SPI有标准SPI和QSPI之分,具体可以看链接: https://blog.csdn.net/wangguchao/article/details/105593303
2. 硬件层接线
对于 SPI/I80接口,命令和颜色数据使用同一个接口。
3. 软件层
为了便于封装接口,习惯上会将屏幕代码分为三个层级:SDK层、驱动层和APP层。
3.1 SDK层component模块
在SDK层中封装了对 IO配置 和 总线配置的接口。已经作为components在ESP-IDF中。
比如触摸芯片cst816,在乐鑫组件库中搜索
在idf_component.yml中添加依赖
或者使用命令行idf.py add-dependency “espressif/esp_lcd_touch_cst816s^1.0.3~1”
3.2 确认驱动兼容性
3.3 配置端口层(SPI屏幕和触摸)
3.3.1 LCD的初始化
- SPI总线配置
/* =============== Initialize SPI bus =============== */
ESP_LOGI(TAG, "Initialize SPI bus");
const spi_bus_config_t buscfg = ILI9341_PANEL_BUS_SPI_CONFIG(EXAMPLE_PIN_NUM_LCD_PCLK, EXAMPLE_PIN_NUM_LCD_DATA0,
EXAMPLE_LCD_H_RES * EXAMPLE_LCD_V_RES * sizeof(uint16_t));
ESP_ERROR_CHECK(spi_bus_initialize(EXAMPLE_LCD_HOST, &buscfg, SPI_DMA_CH_AUTO));
- IO配置
/* =============== Install panel IO =============== */
ESP_LOGI(TAG, "Install panel IO");
esp_lcd_panel_io_handle_t io_handle = NULL;
const esp_lcd_panel_io_spi_config_t io_config = ILI9341_PANEL_IO_SPI_CONFIG(EXAMPLE_PIN_NUM_LCD_CS, EXAMPLE_PIN_NUM_LCD_DC,
example_notify_lvgl_flush_ready, &disp_drv);
/* Attach the LCD to the SPI bus */
ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)EXAMPLE_LCD_HOST, &io_config, &io_handle));
- 安装LCD驱动
/* =============== Install ili9341 panel driver =============== */
ESP_LOGI(TAG, "Install ili9341 panel driver");
esp_lcd_panel_handle_t panel_handle = NULL;
ili9341_vendor_config_t vendor_config = {
.init_cmds = lcd_init_cmds,
.init_cmds_size = sizeof(lcd_init_cmds) / sizeof(ili9341_lcd_init_cmd_t),
};
const esp_lcd_panel_dev_config_t panel_config = {
.reset_gpio_num = EXAMPLE_PIN_NUM_LCD_RST,
.rgb_endian = LCD_RGB_ENDIAN_RGB,
.bits_per_pixel = EXAMPLE_LCD_BIT_PER_PIXEL,
.vendor_config = &vendor_config,
};
ESP_ERROR_CHECK(esp_lcd_new_panel_ili9341(io_handle, &panel_config, &panel_handle));
ESP_ERROR_CHECK(esp_lcd_panel_reset(panel_handle));
ESP_ERROR_CHECK(esp_lcd_panel_init(panel_handle));
ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_handle, true));
3.3.2 输入设备的初始化
安装触摸端口