Arduino环境下ESP32使用SPI/HSPI的方法及无输出卡死问题咨询
ESP32 HSPI 无输出/卡死问题排查与正确用法
一、关于SPI驱动的常见疑问
- ESP32在Arduino开发环境下不需要安装独立的专用SPI驱动。SPI驱动是随官方ESP32开发板核心包预装的组件,不会出现在Arduino库管理器的可搜索列表中,属于正常情况。
- 驱动安装状态检查方法:打开Arduino IDE的「工具」-「开发板」菜单,若能找到对应型号的ESP32开发板选项,说明核心包已正常安装,SPI驱动同步可用。如果找不到ESP32选项,说明仅配置了开发板源但未完成包安装,需要打开「开发板管理器」,搜索ESP32并安装官方核心包即可。
- 注意:仅在偏好设置中填写ESP32的开发板源地址,不代表核心包已安装,必须完成安装流程才能正常调用ESP32的外设功能。
二、现有代码无法运行的核心原因
ESP8266的SPI代码不能直接在ESP32上运行,两者的硬件映射逻辑完全不同:
- 第一段示例代码直接调用
SPI.begin(),使用的是ESP32默认的FSPI端口,该端口在绝大多数ESP32开发板上已经被板载Flash、PSRAM等固定外设占用,不仅不会在你测试的D12/D13/D14引脚输出数据,还可能因外设冲突导致设备卡死。 - 第二段示例代码虽然声明了使用HSPI端口,但未通过
begin()方法手动指定SPI对应的GPIO引脚,会直接使用HSPI的默认引脚映射(SCLK=14、MISO=12、MOSI=13),30引脚的ESP32开发板上这几个引脚通常同样被板载SPI外设占用,最终表现为引脚无输出、设备跑飞卡死。
三、HSPI正确使用方法
- 初始化HSPI时必须手动指定所有关联的GPIO引脚,绕开被板载外设占用的默认引脚,参考代码结构如下:
#include "SPI.h" char buff[] = "Hello Slave\n"; // 初始化HSPI实例 SPIClass myHSPI(HSPI); void setup() { // 自定义SPI引脚,根据实际接线调整,参数顺序为 SCLK, MISO, MOSI, CS myHSPI.begin(14, 12, 13, -1); myHSPI.setClockDivider(80); // 80MHz APB时钟分频后为1MHz速率,配置合法 } void loop() { for(int i=0; i<sizeof(buff); i++) { myHSPI.transfer(buff[i]); } delay(1000); } - 引脚选择注意事项:优先选无板载外设占用的空闲GPIO(如4、5、18、19等),避免使用被板载Flash、PSRAM、SD卡槽占用的固定引脚,从硬件层面消除冲突。
- 编译烧录前必须确认:Arduino IDE「工具」菜单中选中的开发板是你实际使用的ESP32型号,而非ESP8266,否则烧录的固件不匹配会直接导致设备卡死。
内容的提问来源于stack exchange,提问作者CvdO
相关产品推荐
相关产品推荐

