【问题标题】:How to use SPI with ESP32 and Arduino如何将 SPI 与 ESP32 和 Arduino 一起使用
【发布时间】:2021-03-20 13:53:10
【问题描述】:

我正在尝试从 SPI 发送数据,但无法正常工作。 SPI 端口(D12、13、14;用示波器检查)上没有数据,ESP32 似乎挂起。我想使用 HSPI 端口。

我还想知道是否需要一个特殊的 SPI 驱动程序才能在 ESP32 上运行,如果需要,我如何检查我是否已经拥有该驱动程序以及如何安装它。当我查看库管理器时,我没有看到特殊的 SPI 驱动程序。

我尝试过使用这个程序(复制自https://diyi0t.com/spi-tutorial-for-arduino-and-esp8266/)。它显然是为 esp8266 设计的。它是否也适用于 ESP32?

#include "SPI.h"
char buff[]="Hello Slave\n";

void setup() {
 SPI.begin();
}

void loop() {
 for(int i=0; i<sizeof buff; i++)
 {
  SPI.transfer(buff[i]);
 }
 delay(1000);  
}

还有这个程序:

#include "SPI.h"
char buff[]="Hello Slave\n";
SPIClass SPI1(HSPI);

void setup() {
 SPI1.begin();
 SPI1.setClockDivider(80);
}

void loop() {
 for(int i=0; i<sizeof buff; i++)
 {
  SPI1.transfer(buff[i]);
 }
 delay(1000);  
}

我使用的是 30 针 ESP32 开发板,Arduino 版本 1.8.13。在偏好-->更多董事会经理中,它说:

http://arduino.esp8266.com/stable/package_esp8266com_index.json, https://dl.espressif.com/dl/package_esp32_index.json

【问题讨论】:

  • ESP8266 和 ESP32 不兼容。确保您拥有 ESP32 版本的 Arduino 库(看起来您可能拥有 ESP8266 库),找到 SPI 通信的 ESP32 示例。
  • 使用您的引脚来查看您的板上哪些是 MOSI/MISO/SCK 线并选择您自己的 CS,确保在传输/读取数据之前/之后将其设置为 LOW/HIGH。
  • 看来 Tarmo 是正确的,我使用了错误的库。我用 ESP8266 替换了 ESP32 硬件,很快就让它工作了。

标签: arduino esp32 spi


【解决方案1】:

对于 ESP32,您需要声明要使用的 SPI 实例,如下所示:

#include <SPI.h>

SPIClass SPI1(HSPI);

SPI1.begin();
// Optional
// SPI1.beginTransaction(SPISettings(3000000, MSBFIRST, SPI_MODE2));

其余同ESP8266

【讨论】:

    【解决方案2】:
    #include <SPI.h>
    
    #define HSPI_MISO 12
    #define HSPI_MOSI 13
    #define HSPI_SCLK 14
    #define HSPI_CS   15
    static const int spiClk = 240000000; // 1 MHz
    SPIClass * hspi = NULL;
    
    char buff[]="Hello Slave\n";
    
    //byte buff[] = {0xAA, 0xBB, 0xAA, 0x01,
                      0x89, 0xAB, 0xCD, 0xEF};
    
    
    
    void setup() {
    Serial.begin(9600);
    hspi = new SPIClass(HSPI);
    hspi->begin();
    hspi->begin(HSPI_SCLK, HSPI_MISO, HSPI_MOSI, HSPI_CS); //SCLK, MISO, MOSI, SS
    pinMode(HSPI_CS, OUTPUT); //HSPI SS
    }
    
    void loop() {
     for(int i=0; i<sizeof buff; i++)
     {
      SPI.transfer(buff[i]);
      Serial.println(buff[i]);
    
     }
     delay(1000);  
    }
    

    【讨论】:

    • 一个好的答案将始终包括解释为什么这会解决问题,以便 OP 和任何未来的读者可以从中学习。
    猜你喜欢
    • 2013-11-06
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多