You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino环境下ESP32使用SPI/HSPI的方法及无输出卡死问题咨询

ESP32 HSPI 无输出/卡死问题排查与正确用法

一、关于SPI驱动的常见疑问

  • ESP32在Arduino开发环境下不需要安装独立的专用SPI驱动。SPI驱动是随官方ESP32开发板核心包预装的组件,不会出现在Arduino库管理器的可搜索列表中,属于正常情况。
  • 驱动安装状态检查方法:打开Arduino IDE的「工具」-「开发板」菜单,若能找到对应型号的ESP32开发板选项,说明核心包已正常安装,SPI驱动同步可用。如果找不到ESP32选项,说明仅配置了开发板源但未完成包安装,需要打开「开发板管理器」,搜索ESP32并安装官方核心包即可。
  • 注意:仅在偏好设置中填写ESP32的开发板源地址,不代表核心包已安装,必须完成安装流程才能正常调用ESP32的外设功能。

二、现有代码无法运行的核心原因

ESP8266的SPI代码不能直接在ESP32上运行,两者的硬件映射逻辑完全不同:

  1. 第一段示例代码直接调用SPI.begin(),使用的是ESP32默认的FSPI端口,该端口在绝大多数ESP32开发板上已经被板载Flash、PSRAM等固定外设占用,不仅不会在你测试的D12/D13/D14引脚输出数据,还可能因外设冲突导致设备卡死。
  2. 第二段示例代码虽然声明了使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 12:15:00