
xiaozhi-esp32 移植实战LCD Wiki ES3C35P 3.5 寸 ESP32-S3 开发板适配指南【免费下载链接】xiaozhi-esp32An MCP-based chatbot | 一个基于MCP的聊天机器人项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32ES3C35P 是一款集成 3.5 寸 IPS 触控屏ST77922 QSPI、ES8311 音频编解码与 MEMS 麦克风的 ESP32-S3 智能显示模块是构建小智 AI 聊天机器人xiaozhi-esp32的理想载体。本文以 main/boards/lcdwiki-es3c35p/README.md 为核心结合 板级初始化源码 与 引脚配置完整讲解该板的硬件规格、引脚分配、编译烧录流程以及 QSPI 显示 / I2C 触摸 / I2S 音频三路外设的底层驱动原理帮助你快速完成该板卡的固件适配与二次开发。一、硬件规格概览ES3C35P 属于 LCD Wiki 出品的 3.5 寸 ESP32-S3 智能显示模块官方资料指向其产品页SKU 分为带喇叭的 ES3C35P 与无喇叭的 ES3C35P-NS。下表汇总了核心规格项目参数SKUES3C35P带喇叭/ ES3C35P-NS无喇叭主控芯片ESP32-S3 Xtensa LX7 双核 240MHz存储16MB QSPI Flash 8MB OPI PSRAMN16R8无线Wi-Fi 2.4GHz 802.11b/g/n蓝牙 5.0 BLE工作电压5VUSB Type-C 供电电池支持 3.7V 锂电池TP4054 充电管理显示屏项目参数屏幕类型3.5 IPS TFT分辨率320×480 像素色彩65K RGB565驱动 ICST77922 TDDI触显一体显示接口QSPI接 ESP32-S3触摸屏电容触摸全贴合I2C 0x55背光PWM 控制亮度 300 cd/m²ST77922 是触显一体TDDITouch and Display Driver Integration控制器即显示驱动与电容触摸控制器集成在同一颗芯片内因此触摸功能不需要额外挂载独立的触摸 IC。板上 I2C 总线同时服务 ES8311 音频芯片与 ST77922 触摸部分地址分别为 ES8311 默认地址与0x55。音频项目参数编解码芯片ES8311功放FM8002E麦克风MEMS 麦克风LMA2718B381音频接口I2S双工输入输出采样率输入/输出 24000Hz与 config.h 中AUDIO_INPUT_SAMPLE_RATE 24000、AUDIO_OUTPUT_SAMPLE_RATE 24000的定义完全对应——小智固件的音频链路AFE 唤醒 对话正是运行在 24kHz 双工采样率之上。外设项目型号/接口RGB LEDWS2812B ×1IO40MicroSDSDIO 4-bit充电管理TP4054电池 ADCIO8按键BOOTIO0RESETEN二、完整引脚分配引脚定义可在 config.h 中逐一核对与板级源码一一对应GPIO功能说明IO0BOOT 按键开机按下下载模式运行中切换对话IO1PA 使能低电平使能功放IO2SD D2SDIO DATA2IO3SD D3SDIO DATA3IO4SD CMDSDIO 命令IO5SD CLKSDIO 时钟IO6SD D0SDIO DATA0IO7SD D1SDIO DATA1IO8电池 ADC电压检测IO9LCD D3QSPI 数据 D3IO10LCD CSQSPI 片选低有效IO11LCD D0QSPI 数据 D0IO12LCD CLKQSPI 时钟IO13LCD D1QSPI 数据 D1IO14LCD D2QSPI 数据 D2IO15I2S DOUT音频输出IO16I2S DIN音频输入MEMS 麦克风IO17I2S MCLKI2S 主时钟IO18I2S BCLKI2S 位时钟IO21I2S WSI2S 左右声道IO38I2C SDA音频触摸共用IO39I2C SCL音频触摸共用IO40RGB LEDWS2812B 单线IO41背光PWM 高电平点亮IO43UART RXD0串口/普通 IOIO44UART TXD0串口/普通 IOIO45GPIO45扩展 IOIO46GPIO46扩展 IOIO47触摸 INT触摸中断低有效IO48触摸 RST触摸复位低复位ENLCD RST与 ESP32-S3 共用注意 IO0 的复用逻辑启动阶段按住进入下载模式运行阶段单击则通过 InitializeButtons() 注册的OnClick回调切换对话状态启动过程中按下则进入 WiFi 配网模式这是小智设备一键交互的典型入口。显示 QSPI 引脚组CS IO10 D0 IO11 CLK IO12 D1 IO13 D2 IO14 D3 IO9对应源码 InitializeQspiBus()QSPI 使用 SPI2 主机data0~data3四线数据 sclk 片选max_transfer_sz由DISPLAY_BUFFER_SIZE * sizeof(uint16_t)计算得出即 320×80×2 51200 字节约 51KB并启用SPI_DMA_CH_AUTO自动分配 DMA 通道。I2C 设备地址设备地址总线ES8311 音频ES8311_CODEC_DEFAULT_ADDRI2C0ST77922 触摸0x55I2C0共享两设备挂在同一条 I2C0 总线上IO38/IO39配置为I2C_NUM_0且开启内部上拉enable_internal_pullup 1见 InitializeI2c()。三、编译与烧录方式一一键编译打包推荐python scripts/build.py lcdwiki-es3c35p --zipscripts/build.py 会读取 config.json 中的目标信息target: esp32s3、16MB Flash 配置自动完成设置目标、编译、合并分区并打包固件。方式二手动编译idf.py set-target esp32s3 idf.py menuconfig # Xiaozhi Assistant - Board Type - LCD Wiki ES3C35P (3.5寸 ESP32-S3) idf.py build flash monitor菜单项对应 main/Kconfig.projbuild 中的BOARD_TYPE_LCDWIKI_ES3C35P仅对IDF_TARGET_ESP32S3生效选中后 main/CMakeLists.txt 会将BOARD_DIR指向lcdwiki-es3c35p并把该目录下的所有.cc/.c文件纳入编译。ST77922 驱动通过组件依赖引入见 main/idf_component.yml 中的espressif/esp_lcd_st77922: ^2.0.2。四、关键配置说明与源码级原理4.1 显示ST77922 QSPI配置项值原因DISPLAY_WIDTH/HEIGHT320×480原生竖屏分辨率DISPLAY_RGB_ORDERBGR面板实际色彩顺序SPI_DMA_CH_AUTOmax_transfer_sz51KBSPI 总线 DMA缓冲在 SRAM 避免 PSRAM 中转buff_dma1, buff_spiram0SRAM DMASRAM 可直接 DMA 访问无需中转缓冲buffer_sizewidth×8051KB部分刷新缓冲st77922_rounder_cbx 坐标 4 对齐ST77922 硬件要求否则花屏这些配置的落地位置非常清晰config.h 定义DISPLAY_WIDTH 320、DISPLAY_HEIGHT 480、DISPLAY_RGB_ORDER LCD_RGB_ELEMENT_ORDER_BGR、DISPLAY_BUFFER_LINES 80缓冲行数与DISPLAY_SWAP_XY falseInitializeLcdDisplay() 以 80MHz 像素时钟、32 位命令宽度、quad_mode 方式创建 QSPI panel IO并注册 ST77922 驱动st77922_vendor_config_t传入use_qspi_interface 1LVGL 显示配置中buff_dma 1、buff_spiram 0、swap_bytes 1缓冲完全位于内部 SRAM避免 PSRAM 中转带来的延迟与带宽损耗。x 坐标 4 对齐是 ST77922 的硬性要求源码中 st77922_rounder_cb 通过LV_EVENT_INVALIDATE_AREA事件回调将每次刷新的 x 范围强制对齐到 4 的倍数x1 (x1 2) 2x2 ((x2 2) 2) 3否则会出现花屏。由于该控制器不支持 X/Y 轴交换源码开头还有一行编译期断言static_assert(!DISPLAY_SWAP_XY, ...)来兜底。此外lcdwiki-es3c35p.cc 内置了长达 70 条的 ST77922 初始化命令表lcd_init_cmds涵盖电源时序、Gamma 校正、背光、扫描方向等寄存器序列并在末尾按序执行 0x11Sleep Out延时 120ms与 0x29Display On确保屏幕一次点亮。4.2 触摸ST77922 内置电容触摸配置项值I2C 地址0x55寄存器位宽16 位单点数据7 字节读取方式必须一次性读7 × max_points字节清空缓冲源码中触摸控制器以TOUCH_I2C_ADDR 0x55注册寄存器按 16 位地址访问touch_i2c_read先发送高字节再发低字节。关键实现细节上电后先对TOUCH_RST_PINIO48做 10ms 低电平复位、100ms 高电平恢复见 InitializeTouch()读取TOUCH_REG_MAX_TOUCHES0x0009动态获取最大触摸点数1~5用于确定后续读取长度轮询读取信息寄存器TOUCH_REG_INFO0x0010当 bit3 置位表示有触摸事件时一次性读取7 × max_points字节的坐标缓冲区并解析每个点x/y 均为 12 位拼接格式代码还内置了小于 4px 的抖动过滤dx 3 || dx -3 || dy -3避免轻触时误触发滚动。4.3 音频ES8311 FM8002E配置项值PA 引脚IO1PA 极性低电平使能pa_invertedtrueI2C 总线I2C0与触摸共享 IO38/39采样率24000Hz 输入/输出GetAudioCodec() 中创建Es8311AudioCodec时将 PA 引脚设为AUDIO_CODEC_PA_PINIO1并传入pa_invertedtrue——与文档低电平使能功放一致也对应 Es8311AudioCodec 构造签名中的pa_inverted参数。I2S 使用 MCLKIO17、BCLKIO18、WSIO21、DOUTIO15、DINIO16五线全双工接法MEMS 麦克风拾音与喇叭放音同时工作。五、已知限制与设计权衡ST77922 不支持swap_xy— 只能使用原生 320×480 竖屏横屏需求需自行旋转 UI 而非硬件交换坐标ST77922 要求 x 坐标 4 对齐— 已通过rounder_cb自动处理二次开发时不要绕过该回调触摸无 DMA/中断— 使用轮询方式读取约 30fps对语音交互场景足够但不适合高频游戏类交互LVGL 缓冲在 SRAM— 占用约 51KB剩余约 180KB 供其他模块使用内存规划时需留意。这些限制既是硬件特性也反映了板级适配时的取舍用 SRAM 换 DMA 直写性能用轮询换引脚与驱动复杂度属于小智固件在该硬件上的平衡方案。六、文件结构main/boards/lcdwiki-es3c35p/ config.h — 引脚/硬件配置宏 config.json — 构建目标 (esp32s3, 16MB Flash) lcdwiki-es3c35p.cc — 板级初始化 (QSPI 显示 I2C 触摸 ES8311 音频 LED) README.md — 本文档其中 lcdwiki-es3c35p.cc 继承WifiBoard网络能力来自 boards/common/wifi_board.h通过DECLARE_BOARD(LCDWikiES3C35P_Board)注册为可被固件识别的板卡并覆写了GetAudioCodec、GetDisplay、GetBacklightIO41 PWM 背光、GetLedIO40 WS2812B 单灯四个接口构成完整的小智设备抽象。若有self.system.reconfigure_wifi等 MCP 工具调用也会在 InitializeTools() 中注册与云端能力打通。【免费下载链接】xiaozhi-esp32An MCP-based chatbot | 一个基于MCP的聊天机器人项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考