ESP32等のマルチスレッディングでSPI使用する際にはHSPI選択が必要な場合がある。
- 標準ライブラリの SPI をはじめとする大抵のライブラリでは VSPI が暗黙で選択されている。
- マルチスレッドで複数のSPI処理(例えばTFT描画とセンサ入力とかね)を並行処理する場合、VSPIとHSPIを使い分けることで同時処理できる。
- ただし、pin配置で「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 * hspi = NULL;
hspi = new SPIClass(HSPI); // <--HSPIを選択
// ↓ デフォルトのVSPIをあえて明示的に選択したい場合にはこちらを使う。
//SPIClass * vspi = NULL;
//vspi = new SPIClass(VSPI); // <--VSPIを選択
#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となる。