以前遊んだLilygoのT-Deck Plusですが
espressif32のバージョンを
platform = espressif32@6.3.0
指定すると普通に動いたのでが(Lilygoのサンプルは@6.3.0)
6.9.0等の新しいを指定すると動きませんでした(本校執筆時の最新版6.10.0)
別に古いバージョンを使っていれば良いのだけど、他のライブラリ等の整合も考えると
出来る限り最新版を使いたい所
原因は?
色々調べた結果、T-Deck PlusのMCUは ESP32-S3 が原因のようで。
- ESP32(普通のESP32)の場合
- HSPI(SPI2)とVSPI(SPI3)が使える。
(通常、TFT_eSPIはVSPI(デフォルトのSPIバス、ピンは固定)を使う設計になってる。) - 必要に応じて -DUSE_HSPI_PORT を指定すると、HSPI側(自由にピンを設定できる)に切り替えることができた。
ESP32-S3の場合
- ESP32-S3もSPI2/HSPI、SPI3/VSPIみたいな命名が一応あるけど、
- 実際には**"Flexible SPI" (FSPI)** という新しい仕組みになっていて、
ピンが完全に自由に割り当てできる仕様になった。
でも!ライブラリ(TFT_eSPI)の内部では依然として 「VSPIを使う」「HSPIを使う」みたいな昔ながらの記述が残っている。
ここで問題:
- TFT_eSPIが "デフォルトでVSPIを使う" → でも、S3ではそれが正しく動作しないことがある。
- S3では、ピンを手動で設定したい=自由なバスを使いたい → HSPI(SPI2)を選びたい。
(このとき、-DUSE_HSPI_PORT を指定することで、手動でピン設定できるバスに強制切り替えできる。)
VSPIだとS3で一部不安定になる場合があって、それを避けるためにも使う。
そのため、platformio.iniに記述が必要になります。
platformio.ini
build_flags = -DUSE_HSPI_PORT
後はUser_Setup.hに以下の内容を追加(インクルード)すれば最新版でも動作します。
tft_espi_setting.h
#define ST7789_DRIVER /* ST7789を使うと指定 */
#define TFT_WIDTH 240
#define TFT_HEIGHT 320
// ==== Pin Config for ESP32-S3 ====
#define TFT_MISO 38
#define TFT_MOSI 41
#define TFT_SCLK 40
#define TFT_CS 12
#define TFT_DC 11
#define TFT_RST -1
// バックライト制御(必要なら)
#define TFT_BL 5
#define TFT_BACKLIGHT_ON HIGH
// ==== SPI Settings ====
#define TFT_SPI_FREQUENCY 40000000