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となる。