ESP32-S3-GEEK集成LCD屏幕编程黑屏故障求助
ESP32-S3-GEEK集成LCD黑屏问题求助
正在为自带集成显示屏的ESP32-S3-GEEK开发板编写LCD驱动程序,严格遵循官方文档操作后仍无法正常工作。烧录代码后ESP32进入循环,但LCD屏幕始终处于黑屏状态。
相关硬件信息
ESP32-S3-GEEK开发板自带集成LCD,其原理图包含完整引脚映射。
使用代码
#include <stdio.h> #include <inttypes.h> #include "sdkconfig.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_chip_info.h" #include "esp_system.h" // LCD相关头文件 #include "esp_lcd_panel_io.h" // 用于面板I/O函数,如esp_lcd_new_panel_io_spi #include "esp_lcd_panel_vendor.h" // 用于厂商特定面板,如esp_lcd_new_panel_st7789 #include "esp_lcd_types.h" // 用于LCD特定类型(如esp_lcd_panel_handle_t) #include "hal/lcd_types.h" // 用于色彩空间及其他LCD相关定义 #include "driver/gpio.h" #include "esp_lcd_panel_rgb.h" #include "esp_lcd_panel_vendor.h" #include "esp_lcd_panel_ops.h" // 注:这是之前遗漏的必要库 // 根据硬件连接定义引脚 #define LCD_HOST SPI2_HOST // LCD使用SPI2 #define PIN_NUM_MOSI 16 // MOSI引脚 #define PIN_NUM_CLK 17 // 时钟引脚 #define PIN_NUM_CS 15 // 片选引脚 #define PIN_NUM_DC 13 // 数据/命令引脚 #define PIN_NUM_RST 14 // 复位引脚 #define PIN_NUM_BL 12 // 背光引脚 void app_main(void) { printf("初始化LCD...\n"); // 测试打印信息 // SPI总线配置 spi_bus_config_t buscfg = { .mosi_io_num = PIN_NUM_MOSI, .miso_io_num = -1, // LCD不使用MISO .sclk_io_num = PIN_NUM_CLK, .quadwp_io_num = -1, .quadhd_io_num = -1, //.max_transfer_sz = EXAMPLE_LCD_H_RES * 80 * sizeof(uint16_t), // 单次SPI事务最多传输80行像素(假设像素为RGB565格式) }; ESP_ERROR_CHECK(spi_bus_initialize(LCD_HOST, &buscfg, SPI_DMA_CH_AUTO)); // 启用DMA功能 // SPI LCD面板配置 esp_lcd_panel_io_handle_t io_handle = NULL; esp_lcd_panel_io_spi_config_t io_config = { .dc_gpio_num = PIN_NUM_DC, .cs_gpio_num = PIN_NUM_CS, .pclk_hz = 500 * 1000, // 1MHz,可按需调整 .spi_mode = 0, .trans_queue_depth = 10, }; // 将LCD挂载到SPI总线 ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)LCD_HOST, &io_config, &io_handle)); // LCD面板设备配置 esp_lcd_panel_handle_t panel_handle = NULL; esp_lcd_panel_dev_config_t panel_config = { .reset_gpio_num = PIN_NUM_RST, .color_space = ESP_LCD_COLOR_SPACE_RGB, .bits_per_pixel = 16, }; // 创建ST7789型LCD面板句柄,关联SPI IO设备句柄 ESP_ERROR_CHECK(esp_lcd_new_panel_st7789(io_handle, &panel_config, &panel_handle)); // 复位并初始化LCD面板 ESP_ERROR_CHECK(esp_lcd_panel_reset(panel_handle)); ESP_ERROR_CHECK(esp_lcd_panel_init(panel_handle)); // 开启背光 gpio_set_direction(PIN_NUM_BL, GPIO_MODE_OUTPUT); gpio_set_level(PIN_NUM_BL, 1); // 设置为1开启背光 // 红色矩形尺寸定义 #define RECT_X_START 0 // 起始X坐标 #define RECT_Y_START 0 // 起始Y坐标 #define RECT_WIDTH 500 // 矩形宽度 #define RECT_HEIGHT 500 // 矩形高度 // 为红色矩形分配内存缓冲区 size_t num_pixels = RECT_WIDTH * RECT_HEIGHT; uint16_t *rectangle_buffer = malloc(num_pixels * sizeof(uint16_t)); if (rectangle_buffer == NULL) { printf("矩形缓冲区内存分配失败\n"); return; // 处理分配错误 } // 将缓冲区填充为红色(RGB565格式) for (size_t i = 0; i < num_pixels; i++) { rectangle_buffer[i] = 0xF800; // 红色 } // 在LCD上绘制红色矩形 ESP_ERROR_CHECK(esp_lcd_panel_draw_bitmap(panel_handle, RECT_X_START, RECT_Y_START, RECT_WIDTH, RECT_HEIGHT, rectangle_buffer)); printf("LCD初始化完成\n"); vTaskDelay(5000 / portTICK_PERIOD_MS); // 等待5秒 esp_restart(); }
已采取的排查步骤
- 对照原理图核对引脚映射,并尝试修改引脚分配;
- 查阅ESP-IDF官方LCD文档并自行翻译为中文内容。
内容的提问来源于stack exchange,提问作者fubiii11
相关产品推荐
相关产品推荐

