ESP32-S3驱动0.96寸ST7735彩屏软件SPI与硬件SPI移植实战指南最近在玩ESP32-S3想给它配个小屏幕显示点信息就找到了这款0.96寸的ST7735彩屏。这屏幕尺寸小巧分辨率是80x160色彩显示也不错很适合嵌入式项目。但在实际驱动时我发现很多朋友对软件SPI和硬件SPI的选择和配置有点迷糊今天我就结合自己的移植经验手把手带大家走一遍完整的流程。咱们这篇教程的目标很明确让你手里的ESP32-S3成功点亮这块0.96寸屏。我会分别讲解软件模拟SPI和硬件SPI两种驱动方式从原理、接线、代码移植到最终验证一步步拆解。无论你是刚接触嵌入式的新手还是想优化项目性能的开发者都能从中学到实用的东西。1. 认识你的屏幕0.96寸ST7735彩屏在动手之前咱们先搞清楚要驱动的对象是什么。这块屏幕的核心参数如下参数项规格说明屏幕尺寸0.96英寸分辨率80 (水平) x 160 (垂直) RGB像素驱动芯片ST7735通信协议SPI (串行外设接口)工作电压2.8V ~ 3.3V (与ESP32-S3的3.3V IO电平完美匹配)工作电流约30mA接口8 Pin 2.54mm间距排针屏幕通过SPI接口与主控通信。SPI是一种高速、全双工的同步通信总线需要用到几根关键信号线时钟线(SCK)、主机输出从机输入线(MOSI)、片选线(CS)。此外屏幕还有复位线(RES)和背光控制线(BLK)。注意这块屏的驱动芯片ST7735内部有一些重要的寄存器其中最关键的是0x36内存访问控制寄存器。它决定了屏幕的显示方向旋转和像素点的扫描顺序。在后续的驱动代码初始化序列里会配置这个寄存器如果你想旋转屏幕主要就是改这里的值。2. ESP32-S3的SPI资源我们能用哪个ESP32-S3芯片内部集成了多个SPI控制器但并不是所有都能给我们随便用。SPI0 和 SPI1这两个控制器主要预留给内部访问外部Flash和PSRAM我们一般不能直接用于驱动外设。SPI2 (GP-SPI2) 和 SPI3 (GP-SPI3)这两个是通用的SPI控制器我们可以自由使用它们来驱动像屏幕这样的外部设备。所以当我们说使用“硬件SPI”时指的就是使用SPI2或SPI3控制器。硬件SPI的好处是通信速率高、不占用CPU资源由DMA或硬件自动处理。而“软件SPI”则是用普通的GPIO引脚通过代码模拟SPI的时序好处是引脚选择灵活但速度慢会消耗CPU时间。3. 软件SPI驱动移植引脚灵活适合学习软件SPI不依赖特定的硬件外设任何GPIO都能用接线和配置相对自由非常适合理解SPI通信的底层时序。3.1 引脚连接首先我们需要把屏幕和ESP32-S3的引脚连起来。软件SPI下你可以根据自己开发板的空闲引脚来灵活选择。下面是我推荐的一组连接方式屏幕引脚功能连接至ESP32-S3引脚说明GND电源地GND共地VCC电源正(3.3V)3.3V供电SCLSPI时钟线(SCK)GPIO 12时钟信号由主控产生SDASPI数据线(MOSI)GPIO 13主控输出数据到屏幕RES复位GPIO 14用于硬件复位屏幕DC数据/命令选择GPIO 21高电平写数据低电平写命令CS片选GPIO 15低电平选中屏幕BLK背光控制3.3V 或 GPIO接3.3V则常亮接GPIO则可调光提示如果你的项目GPIO引脚紧张有两个引脚可以简化RES复位可以接到ESP32-S3的复位引脚EN。这样开发板复位时屏幕也跟着复位省下一个GPIO。代价是失去了软件单独复位屏幕的能力。BLK背光可以直接接到3.3V让背光常亮。代价是无法通过代码控制背光开关或调节亮度。3.2 获取并放置驱动文件驱动代码我已经为大家准备好了是一个完整的“LCD”文件包。你需要先下载它。下载“LCD”文件包。打开你的ESP32-S3工程比如用VS Code和PlatformIO或者ESP-IDF。将下载的整个LCD文件夹复制到你工程的主目录下通常是包含main.c的那个目录。3.3 配置工程路径以ESP-IDF为例为了让编译器能找到我们新加入的驱动文件需要修改工程的CMakeLists.txt文件。在你的main目录下找到CMakeLists.txt文件并打开。在文件中添加以下内容将LCD文件夹的头文件路径包含进来# 将LCD目录加入头文件搜索路径 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/LCD)将LCD文件夹内的C源文件添加到编译列表中# 将LCD目录下的.c文件加入工程 file(GLOB_RECURSE srcs *.c ${CMAKE_CURRENT_SOURCE_DIR}/LCD/*.c)完成以上步骤软件SPI的驱动移植就基本完成了。接下来我们看看硬件SPI怎么搞。4. 硬件SPI驱动移植追求性能的首选硬件SPI利用ESP32-S3内置的SPI外设通信速度快效率高。但引脚是固定的需要按照硬件SPI控制器的要求来连接。4.1 引脚连接以SPI2为例ESP32-S3的硬件SPI2有默认的引脚映射为了发挥最佳性能我们尽量使用这些默认引脚。连接方式如下屏幕引脚功能连接至ESP32-S3引脚 (SPI2)说明GND电源地GNDVCC电源正3.3VSCLSPI时钟线(SCK)GPIO 12(默认SPI2 CLK)硬件SPI固定引脚SDASPI数据线(MOSI)GPIO 11(默认SPI2 MOSI)硬件SPI固定引脚RES复位GPIO 14可使用其他GPIODC数据/命令选择GPIO 21可使用其他GPIOCS片选GPIO 10(默认SPI2 CS0)硬件SPI固定引脚BLK背光控制3.3V 或 GPIO注意硬件SPI的SCK、MOSI、CS这三个引脚通常是绑定到特定GPIO的不能随意更改。RES和DC作为控制线仍然可以使用普通GPIO。4.2 获取并配置硬件SPI驱动硬件SPI的驱动文件包和软件SPI的是分开的但获取和放置步骤类似。下载专用于“硬件SPI”的LCD驱动文件包。同样地将这个LCD文件夹复制到你工程的main目录下覆盖或替换之前的软件SPI驱动文件。重复3.3节的步骤修改CMakeLists.txt文件确保新的驱动文件路径被正确包含。硬件SPI的驱动代码内部已经配置好了ESP32-S3的SPI2外设包括时钟频率、通信模式等我们无需再手动初始化SPI硬件直接调用提供的LCD_Init()函数即可。5. 移植验证编写测试代码点亮屏幕无论你选择哪种SPI方式移植完成后都需要写个简单的程序来测试屏幕是否正常工作。在你的main.c文件中输入以下测试代码#include stdio.h #include inttypes.h #include sdkconfig.h #include freertos/FreeRTOS.h #include freertos/task.h #include esp_chip_info.h #include esp_flash.h #include esp_timer.h // 包含LCD驱动头文件 #include LCD/lcd_init.h #include LCD/lcd.h #include LCD/pic.h // 如果有图片数据的话 void app_main(void) { float t 0.0; // 1. 初始化LCD屏幕 LCD_Init(); // 2. 清屏填充为黑色 LCD_Fill(0, 0, LCD_W, LCD_H, BLACK); while(1) { // 3. 显示屏幕宽度和高度信息 LCD_ShowString(0, 16*0, (uint8_t *)LCD_W:, WHITE, BLACK, 16, 0); LCD_ShowIntNum(48, 16*0, LCD_W, 3, WHITE, BLACK, 16); LCD_ShowString(80, 16*0, (uint8_t *)LCD_H:, WHITE, BLACK, 16, 0); LCD_ShowIntNum(128, 16*0, LCD_H, 3, WHITE, BLACK, 16); // 4. 显示一个递增的浮点数 LCD_ShowString(0, 16*1, (uint8_t *)Num:, WHITE, BLACK, 16, 0); LCD_ShowFloatNum1(8*4, 16*1, t, 4, WHITE, BLACK, 16); t 0.11; // 5. 显示中文字符需要字库支持 // LCD_ShowChinese(8*5, 16*3, (uint8_t *)中电网, RED, BLACK, 32, 0); // 延时1秒 vTaskDelay(pdMS_TO_TICKS(1000)); } }代码说明LCD_Init()这个函数最重要它完成了屏幕的硬件复位、发送初始化序列、设置显示区域和方向等所有准备工作。LCD_Fill()将整个屏幕填充为指定颜色这里是黑色相当于清屏。LCD_ShowString(),LCD_ShowIntNum(),LCD_ShowFloatNum1()这些是驱动提供的API用于在指定位置显示字符串、整数和浮点数。程序循环中会动态更新一个浮点数并在屏幕上显示出来可以用来观察屏幕刷新是否正常。将代码编译并下载到ESP32-S3开发板上电后你应该能看到屏幕点亮并显示屏幕尺寸和一个不断变化的数字。6. 软件SPI vs 硬件SPI我该怎么选最后咱们来聊聊两种方式怎么选这也是很多朋友纠结的地方。选软件SPI如果你GPIO引脚资源紧张需要把硬件SPI的固定引脚挪作他用。只是想快速验证屏幕好坏图个接线方便。对屏幕刷新速度要求不高比如只显示静态文字或缓慢更新的数据。正在学习SPI通信原理想通过代码理解时序。选硬件SPI如果你项目需要较高的刷新率比如显示动画、动态图表或摄像头图像。希望降低CPU占用率让CPU有时间处理其他任务。追求更稳定、更可靠的通信。你的ESP32-S3的默认SPI引脚恰好空闲。在实际项目中如果引脚不冲突我强烈推荐使用硬件SPI。它的优势是实实在在的移植过程也并不比软件SPI复杂多少。这次提供的驱动包已经帮我们封装好了底层细节直接调用就行非常方便。好了关于ESP32-S3驱动0.96寸ST7735屏幕的两种方法就讲到这里。接线时务必仔细尤其是电源不要接反。如果屏幕没亮先检查背光BLK是否接了高电平再检查复位时序和初始化代码。祝你一次点亮成功