
SPI 通信协议:


注:与传统的 SPI 协议不同的地方是:由于是只需要显示,故而将从机发往主机的数据线进行了隐藏
RESX 为复位,模块上电时拉低,通常情况下置 1;
CSX 为从机片选, 仅当 CS 为低电平时,芯片才会被使能。
D/CX 为芯片的数据/命令控制引脚,当 DC = 0 时写命令,当 DC = 1 时写数据
SDA 为传输的数据,即 RGB 数据;
SCL 为 SPI 通信时钟。
对于 SPI 通信而言,数据是有传输时序的,即时钟相位(CPHA)与时钟极性 (CPOL) 的组合:
CPHA 的高低决定串行同步时钟是在第一时钟跳变沿还是第二个时钟跳变沿数据被采集,当 CPHA = 0,在第一个跳变沿进行数据采集;
CPOL 的高低决定串行同步时钟的空闲状态电平,CPOL = 0,为低电平。
从图中可以看出,当 SCLK 第一个下降沿时开始传输数据,一个时钟周期传输 8bit 数据,使用 SPI0,按位传输,高位在前,低位在后
在使用板上预留的 GPIO 端子时需注意接线颜色和对应功能,避免接线惯性导致烧坏开发板


为了让用户能够快速了解产品的各个功能,我们提供了一系列的测试例程,方便客户了解各个接口的使用。除了 ESP32-S3-Touch-LCD-1.54 主机和配套的器件之外,为了能够运行例程,需要准备的器件如下:
安装电池时,组装 PC 绝缘片有绝缘及阻燃的作用,用于隔开电池和 PCB 板

若出现 无法识别端口 的情况,请进入 Boot 模式:
下载完成后,重新上电运行程序。
Firmware 目录中。ESP32-S3 及 USB
ESP32-S3-LCD-1.54-Demo\Firmware或ESP32-S3-Touch-LCD-1.54-Demo\Firmware目录下的 bin 文件,并手动输入下载地址 “0x00”,最左侧勾选

若出现一直处于“等待上电同步中”的情况,需按住“boot”重新上电,进下载模式即可解决
拥有 WIFI 扫描和配网功能,点击 WIFI 界面 wifi config可以扫描二维码进行配网操作
可以调节显示亮度以及音量大小
显示电池 ADC 电压
产品关于界面,可以查看 MAC 地址

支持 jpg 图片显示, 更多图片格式正在适配中
模拟电子相册的界面,此 APP 需要插入内存卡,并在 photo 目录下放入 jpg 图片文件才能正常运行

模拟音乐播放器的界面,此 APP 需要插入内存卡,并在 music 目录下放入 MP3 文件才能正常运行

模拟视频播放器的界面,此 APP 需要插入内存卡,并在 video 目录下放入 MP3 文件才能正常运行

模拟电子书的界面,此 APP 需要插入内存卡,并在 fiction 目录下放入 txt 文件才能正常运行

此例程可以进行双麦克风收音测试,点击开始按钮即开始录音,再次点击停止录音,然后会自动播放录制的音频
录制的音频文件保存在内存卡根目录下

此示例展示 squareline 制作的 LVGL demo

此示例展示基于六轴姿态传感器的重力小球 App, 小球会跟随设备的倾斜,转动姿态实时移动

点击 APP 即可进入小智 AI 应用,跟小智官网适配的版本一致,操作方式相同,双击 boot 按键可以回到 brookesia 界面

XiaozhiAI(小智 AI)是一个基于 ESP32 开发板的开源 AI 语音聊天机器人项目,旨在将大语言模型(LLM)的通用智能赋予边缘设备。它提供了一套软硬件结合的解决方案,支持全双工语音对话及 IoT 设备控制,致力于协助开发者低成本、快速地构建高定制度的实体 AI 智能体。
本文演示如何为微雪电子支持小智 AI 的 ESP32 开发板烧录固件,包括无开发环境烧录(直接烧录预编译固件)和有开发环境烧录(从源码编译并烧录)两种方式。
本文以 ESP32-S3-Touch-AMOLED-1.8 开发板为例进行演示,若使用其他开发板,操作步骤类似。
请先确认你的硬件在 小智 AI 适配产品列表 中。

访问 小智 GitHub 下载对应设备的固件文件,点击 Assets 展开全部文件列表:

参考 Flash 固件的烧录与擦除教程 完成固件烧录。
此仓库 汇总了微雪电子支持小智 AI 的 ESP32 开发板固件,所有固件均已在对应开发板上测试验证,方便用户集中查找和下载。固件版本更新可能略晚于小智官方仓库。
访问 微雪 GitHub 仓库,根据需求选择合适版本的固件进行下载:

参考 Flash 固件的烧录与擦除教程 完成固件烧录。
访问 XiaoZhi AI Chatbot 仓库下载完整工程代码:

参考 ESP-IDF 环境搭建教程 完成开发环境的配置。
点击 选择目标设备,根据您的开发板选择对应的芯片型号(如
esp32s3):

设置目标设备时,ESP-IDF 会自动配置相应的工具链和库,此过程可能需要一些时间,请耐心等待。更多详情请参阅 官方文档。
点击 打开 ESP-IDF 终端,执行
idf.py menuconfig 命令进入配置界面,选择 Xiaozhi Assistant:

选择 Board Type 进入开发板类型选择:

选择与您的开发板对应的产品型号:

按 S 键保存配置并退出,然后点击 一键构建、烧录和监视图标,自动完成编译、烧录和串口监视。
使用手机或电脑连接设备的 WiFi 热点:Xiaozhi-xxxxxx。连接成功后通常会自动跳转到配置页面,若未自动跳转,请手动在浏览器中访问 http://192.168.4.1。
在网络配置页面选择要连接的 WiFi 名称(仅支持 2.4G 频段;若要连接 iPhone 热点,需在手机系统设置中开启最大兼容性),SSID 将自动填入,输入密码后点击 Connect 开始连接:

确保设备已成功连接到互联网,此时设备会播报 6 位设备验证码(可重复唤醒设备再次播报)。
访问 小智 AI 控制面板,如未注册请先完成账号注册并登录:



输入 6 位验证码后,设备将自动激活并显示在设备管理页面,即可正常使用。
说出唤醒词 "你好,小智" 即可唤醒设备,开始语音对话。
ESP32-S3-Touch-AMOLED-1.8 按键说明:

请注意:该教程使用 ESP32-S3-Zero 作为教学示例,所有硬件代码均基于其引脚布局。在动手实践前,建议您对照手中的开发板引脚图,确认引脚配置无误。
请参考 安装和配置 Arduino IDE 教程 下载安装 Arduino IDE 并添加 ESP32 支持。
要运行示例,需要安装对应的库。示例代码使用 GFX Library for Arduino 库驱动 ST7789 显示屏 ,并使用 SensorLib 库驱动 CST816 触摸芯片。
可从 此链接 下载 ESP32-S3-Touch-LCD-1.54 开发板的示例程序包。包内的 Arduino\libraries 目录已包含本教程所需的全部库文件。
| 库或文件名称 | 说明 | 版本 | 安装方式 |
|---|---|---|---|
| lvgl | LVGL 图形化库 | v8.4.0 或 v9.3.0 | 通过库管理器或手动安装 |
| GFX_Library_for_Arduino | GFX 图形化库 | v1.6.0 | 通过库管理器或手动安装 |
| U8g2 | 图形显示库 | v2.35.30 | 通过库管理器或手动安装 |
| SensorLib | 传感器驱动库 | v0.3.1 | 通过库管理器或手动安装 |
| ESP32-audioI2S-master | 音频处理库 | v3.4.0 | 通过库管理器或手动安装 |
| OneButton | 按键库 | v2.6.1 | 通过库管理器或手动安装 |
LVGL 及其驱动库的版本之间存在较强的依赖关系。例如,为 LVGL v8 编写的驱动可能不兼容 LVGL v9。为确保示例能够稳定复现,推荐使用上表列出的特定版本。混合使用不同版本的库可能导致编译失败或运行时异常。
安装步骤:
解压已下载的 示例程序包。
将其 Arduino\libraries 目录下的所有文件夹(ESP32-audioI2S-master 、GFX_Library_for_Arduino 等)复制到 Arduino 的库文件夹中。
Arduino 库文件夹的路径通常是:c:\Users\<用户名>\Documents\Arduino\libraries。
也可以在 Arduino IDE 中通过 文件 > 首选项,查看“项目文件夹位置”来定位。库文件夹就是此路径下的 libraries 文件夹。
其他安装方式请参考:Arduino 库管理教程。
ESP32-S3-Touch-LCD-1.54 所需开发板安装说明
| 板名称 | 板安装要求 | 版本号要求 |
|---|---|---|
| ESP32 by Espressif Systems | “离线”安装/“在线”安装 | 3.2.0 |
ESP32-S3-Touch-LCD-1.54 需要选择及配置开发板。

printf() 函数可直接使用;
若要使用 Serial.println() 函数,需要额外配置:在 IDE 工具菜单中启用"USB CDC On Boot"选项,或在代码中声明 HWCDC 对象处理 USB 串口通信。
Arduino 示例程序位于 示例程序包 的 Arduino/examples 目录中。
| 示例程序 | 基础例程说明 | 依赖库 |
|---|---|---|
| 01_audio_out | 读取 SD 卡的音频文件,并播放 | ESP32-audioI2S-master |
| 02_button_example | 按键测试 | OneButton |
| 03_qmi8658_example | 打印 IMU 获取的数据 | SensorLib FastLED |
| 04_gfx_helloworld | 屏幕上显示 HelloWorld | GFX_Library_for_Arduino |
| 05_esp_wifi_analyzer | 屏幕上显示 WiFi 信号强度 | GFX_Library_for_Arduino |
| 06_gfx_u8g2_font | 通过加载字库,实现各国文字显示 | GFX_Library_for_Arduino、U8g2 |
| 07_sd_card_test | 测试 SD 卡的读写 | --- |
| 08_lvgl_example_v8 | lvgl v8.4.0 示例程序 | GFX_Library_for_Arduino、lvgl |
| 09_lvgl_example_v9 | lvgl v9.3.0 示例程序 | GFX_Library_for_Arduino、lvgl |
| 10_esp_sr | 测试语音唤醒、语音识别 | --- |
本示例演示 ESP32-S3-Touch-LCD-1.54 读取 SD 卡的音频文件并使用喇叭播放,屏幕无现象,支持 MP3、AAC、WAV 等格式。
初始化 SD 卡:
if (!SD_MMC.setPins(clk, cmd, d0, d1, d2, d3)) {
Serial.println("Pin change failed!");
return;
}
if (!SD_MMC.begin()) {
Serial.println("Card Mount Failed");
return;
}
设置 I2S 引脚和音量大小:
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT, I2S_MCLK);
audio.setVolume(21); // 0...21
设置播放的音频文件:
audio.connecttoFS(SD_MMC, "music/1.mp3");
绑定回调函数:
button1.attachClick(click1);
button1.attachDoubleClick(doubleclick1);
button1.attachLongPressStart(longPressStart1);
button1.attachLongPressStop(longPressStop1);
button1.attachDuringLongPress(longPress1);

初始化 QMI8658:
if (!qmi.begin(Wire, QMI8658_L_SLAVE_ADDRESS, SENSOR_SDA, SENSOR_SCL)) {
Serial.println("Failed to find QMI8658 - check your wiring!");
while (1) {
delay(1000);
}
}

Arduino_DataBus* bus = new Arduino_ESP32SPI(45 /* DC */, 21 /* CS */, 38 /* SCK */, 39 /* MOSI */, -1 /* MISO */);
Arduino_GFX* gfx = new Arduino_ST7789(
bus, 40 /* RST */, 0 /* rotation */, true, 240, 240);



SD 卡初始化 :
if (!SD_MMC.setPins(clk, cmd, d0, d1, d2, d3)) {
Serial.println("Pin change failed!");
return;
}
if (!SD_MMC.begin()) {
Serial.println("Card Mount Failed");
return;
}

本示例演示了使用 ESP32-S3-Touch-LCD-1.54 运行 lvgl(v8.4.0)示例程序。
需要安装 lvgl v8.4.0 版本,如已安装其他版本,请重新安装。


本示例演示了使用 ESP32-S3-Touch-LCD-1.54 运行 lvgl(v9.3.0)示例程序。
需要安装 lvgl v9.3.0 版本,如已安装其他版本,请重新安装。


本示例演示了使用 ESP32-S3-LCD-1.54 运行 ESP_SR 示例程序。

Wire.begin(I2C_PIN_SDA, I2C_PIN_SCL);
es7210_init();
i2s.setPins(I2S_PIN_BCK, I2S_PIN_WS, I2S_PIN_DOUT, I2S_PIN_DIN, I2S_PIN_MCK);
i2s.setTimeout(1000);
i2s.begin(I2S_MODE_STD, 16000, I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO);
ESP_SR.onEvent(onSrEvent);
ESP_SR.begin(i2s, sr_commands, sizeof(sr_commands) / sizeof(sr_cmd_t), SR_CHANNELS_STEREO, SR_MODE_WAKEWORD);
static const sr_cmd_t sr_commands[] = {
{ 0, "Turn on the light", "TkN nN jc LiT" },
{ 0, "Switch on the light", "SWgp nN jc LiT" },
{ 1, "Turn off the light", "TkN eF jc LiT" },
{ 1, "Switch off the light", "SWgp eF jc LiT" },
{ 1, "Go dark", "Gb DnRK" },
{ 2, "Start fan", "STnRT FaN" },
{ 3, "Stop fan", "STnP FaN" },
};
请注意:该教程使用 ESP32-S3-Zero 作为教学示例,所有硬件代码均基于其引脚布局。在动手实践前,建议您对照手中的开发板引脚图,确认引脚配置无误。
对于 ESP32-S3-Touch-LCD-1.54 开发板,需要使用 ESP-IDF V5.5.0 以上版本。
以下内容以 Windows 系统为例,使用 VS Code + ESP-IDF 扩展 的方式进行开发。Mac/Linux 用户请参考 官方说明。
前往 ESP-IDF Installation Manager 下载 ESP-IDF 安装管理器。这是乐鑫最新推出的跨平台安装工具,下文将演示如何使用其离线安装功能。
在页面中点击 Offline Installer 标签,然后在筛选栏中选择 Windows 操作系统和你要安装的版本。

确认选择无误后,点击下载按钮。浏览器将自动同时下载两个文件:一个是 ESP-IDF 离线整合包(.zst),另一个是 ESP-IDF 安装器(.exe)。

请耐心等待两个文件下载完成。
下载完成后,双击运行 ESP-IDF 安装器(eim-gui-windows-x64.exe)。
启动后,可在右上角将界面语言切换为中文。

安装工具会自动检测同一目录下是否存在离线整合包。点击 从存档安装。

接下来,选择安装路径。建议使用默认路径;若需自定义,请确保路径中不包含中文或空格。确认无误后,点击 开始安装。

当看到如下界面时,表示 ESP-IDF 已安装成功。

建议同时安装驱动程序。点击 完成安装,然后点击 安装驱动程序。

下载并安装 Visual Studio Code。
安装时建议勾选 通过 Code 打开操作添加到 Windows 资源管理器文件上下文菜单,以便快速打开项目文件夹。
在 VS Code 中,点击侧边活动栏中的 扩展图标(或使用快捷键 Ctrl + Shift + X)打开 扩展 视图。
在搜索框中输入 ESP-IDF,找到 ESP-IDF 扩展并点击安装。

当 ESP-IDF 扩展版本 ≥ 2.0 时,扩展会自动检测并识别上述步骤中安装的 ESP-IDF 环境,无需手动配置。
ESP-IDF 示例程序位于 示例程序包 的 ESP-IDF 目录中。
本示例演示是 ESP32-S3-Touch-LCD-1.54 的综合示例,也是出厂默认烧录的示例。
![]() ![]() ![]() ![]() |
|---|
本示例演示如何使用 espressif/button 库读取按键的单击、双击和长按等状态,并通过串口打印。
绑定回调函数 :
ret = iot_button_register_cb(boot_btn, BUTTON_PRESS_DOWN, NULL, button_event_cb, NULL);
ret |= iot_button_register_cb(boot_btn, BUTTON_PRESS_UP, NULL, button_event_cb, NULL);
ret |= iot_button_register_cb(boot_btn, BUTTON_PRESS_REPEAT, NULL, button_event_cb, NULL);
ret |= iot_button_register_cb(boot_btn, BUTTON_PRESS_REPEAT_DONE, NULL, button_event_cb, NULL);
ret |= iot_button_register_cb(boot_btn, BUTTON_SINGLE_CLICK, NULL, button_event_cb, NULL);
ret |= iot_button_register_cb(boot_btn, BUTTON_DOUBLE_CLICK, NULL, button_event_cb, NULL);
ret |= iot_button_register_cb(boot_btn, BUTTON_LONG_PRESS_START, NULL, button_event_cb, NULL);
ret |= iot_button_register_cb(boot_btn, BUTTON_LONG_PRESS_HOLD, NULL, button_event_cb, NULL);
ret |= iot_button_register_cb(boot_btn, BUTTON_LONG_PRESS_UP, NULL, button_event_cb, NULL);
ret |= iot_button_register_cb(boot_btn, BUTTON_PRESS_END, NULL, button_event_cb, NULL);

本示例演示如何使用 sensorlib 库读取读取 qmi8658 的数据并打印
代码解释
if (qmi.getDataReady())
{
if (qmi.getAccelerometer(acc.x, acc.y, acc.z))
{
printf("ACCEL--x:%5.2f y:%5.2f z:%5.2f ", acc.x, acc.y, acc.z);
}
if (qmi.getGyroscope(gyr.x, gyr.y, gyr.z))
{
printf("GYRO--x:%5.2f y:%5.2f z:%5.2f ", gyr.x, gyr.y, gyr.z);
}
printf("Temperature:%5.2f degrees C", qmi.getTemperature_C());
}
printf("Timestamp:%ld \r\n", qmi.getTimestamp());

本示例使用 ESP32-S3-Touch-LCD-1.54 对 SD 卡的读写功能进行测试。
SD 卡初始化,并挂载:
sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT();
#if EXAMPLE_IS_UHS1
slot_config.flags |= SDMMC_SLOT_FLAG_UHS1;
#endif
// Set bus width to use:
#ifdef CONFIG_EXAMPLE_SDMMC_BUS_WIDTH_4
slot_config.width = 4;
#else
slot_config.width = 1;
#endif
// On chips where the GPIOs used for SD card can be configured, set them in
// the slot_config structure:
#ifdef CONFIG_SOC_SDMMC_USE_GPIO_MATRIX
slot_config.clk = CONFIG_EXAMPLE_PIN_CLK;
slot_config.cmd = CONFIG_EXAMPLE_PIN_CMD;
slot_config.d0 = CONFIG_EXAMPLE_PIN_D0;
#ifdef CONFIG_EXAMPLE_SDMMC_BUS_WIDTH_4
slot_config.d1 = CONFIG_EXAMPLE_PIN_D1;
slot_config.d2 = CONFIG_EXAMPLE_PIN_D2;
slot_config.d3 = CONFIG_EXAMPLE_PIN_D3;
#endif // CONFIG_EXAMPLE_SDMMC_BUS_WIDTH_4
#endif // CONFIG_SOC_SDMMC_USE_GPIO_MATRIX
// Enable internal pullups on enabled pins. The internal pullups
// are insufficient however, please make sure 10k external pullups are
// connected on the bus. This is for debug / example purpose only.
slot_config.flags |= SDMMC_SLOT_FLAG_INTERNAL_PULLUP;
ESP_LOGI(TAG, "Mounting filesystem");
ret = esp_vfs_fat_sdmmc_mount(mount_point, &host, &slot_config, &mount_config, &card);

本示例演示了 ESP32-S3-Touch-LCD-1.54 运行 lvgl 示例程序(支持 lvgl v8 和 lvgl v9)
main/idf_component.yml 文件中的 LVGL 配置,例如将其改为 lvgl/lvgl:^8.4.0。
初始化:
/* LCD HW initialization */
ESP_ERROR_CHECK(app_lcd_init());
/* Touch initialization */
app_touch_init();
/* LVGL initialization */
ESP_ERROR_CHECK(app_lvgl_init());

开发板设计文件
ESP32-S3 芯片官方手册
板载器件数据手册