3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ESP32マルチスレッドとSPI

Last updated at Posted at 2023-11-04

ESP32等のマルチスレッディングでSPI使用する際にはHSPI選択が必要な場合がある。

  • 標準ライブラリの SPI をはじめとする大抵のライブラリでは VSPI が暗黙で選択されている。
  • マルチスレッドで複数のSPI処理(例えばTFT描画とセンサ入力とかね)を並行処理する場合、VSPIとHSPIを使い分けることで同時処理できる。
  • ただし、HSPIとされるpinに繋ぐだけではHSPI処理にならない。
    • → ESP32内部の“GPIOマトリクス”によってVSPIのピンに繋がっているから。
  • 明示的にHSPIを選択する必要がある。

↓ 本件に関しては次のページがとても参考になりました(感謝)
https://trac.switch-science.com/wiki/esp32_tips


サンプルとしてMCP3008というADコンバータをHSPIで使う時のコードを置いときます。

selecting_HSPI_for_MCP3008
//  #define ALTERNATE_PINS  //  Uncomment this line for irregular pin-setting
#ifdef ALTERNATE_PINS
  #define VSPI_MISO   **
  #define VSPI_MOSI   **
  #define VSPI_SCLK   **
  #define VSPI_SS     **

  #define HSPI_MISO   **
  #define HSPI_MOSI   **
  #define HSPI_SCLK   **
  #define HSPI_SS     **
#else
  #define VSPI_MISO   MISO  //19
  #define VSPI_MOSI   MOSI  //23
  #define VSPI_SCLK   SCK  //18
  #define VSPI_SS     SS  //5

  #define HSPI_MISO   12
  #define HSPI_MOSI   13
  #define HSPI_SCLK   14
  #define HSPI_SS     15
#endif

//SPIClass * vspi = NULL;  //  明示的にVSPIを選択する場合にはこちらを使う。
//vspi = new SPIClass(VSPI);  //  <--VSPIを選択
SPIClass * hspi = NULL;  
hspi = new SPIClass(HSPI);    //  <--HSPIを選択

#include <Adafruit_MCP3008.h>
Adafruit_MCP3008 adc;
adc.begin(15, hspi);  // (cs, *spi);

// adc.begin(14, 13, 12, 15);  // (sck, mosi, miso, cs);
// ↑ このようにSPIの指定無しでbegin()すれば、VSPIとなる。
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?