ST7789P3を使った液晶パネルGMT147SPI(Aliexpressで購入)をESP32で動かそうとした時のメモ.日本語で情報があまり無かったように思う.
買った物
-
1.47 "1.47 インチ 172x320 SPI フルカラー TFT HD IPS スクリーン LCD LED ディスプレイモジュール 172*320 ST7789 コントローラ 3.3V SPI インターフェイス
- 基板にはGMT147SPIと書いてある
- https://ja.aliexpress.com/i/1005008154401059.html?gatewayAdapt=glo2jpn (2026-07-11時点)
-
ST7789はよく使うから楽勝!と思っていた
設定
// SPIバスの設定
cfg.spi_host = VSPI_HOST; // 使用するSPIを選択 (VSPI_HOST or HSPI_HOST)
cfg.spi_mode = 0; // SPI通信モードを設定 (0 ~ 3)
cfg.freq_write = 40000000; // 送信時のSPIクロック (最大80MHz, 80MHzを整数で割った値に丸められます)
cfg.freq_read = 16000000; // 受信時のSPIクロック
cfg.spi_3wire = true; // 受信をMOSIピンで行う場合はtrueを設定
cfg.use_lock = true; // トランザクションロックを使用する場合はtrueを設定
cfg.dma_channel = SPI_DMA_CH_AUTO; // Set the DMA channel (1 or 2. 0=disable) 使用するDMAチャンネルを設定 (0=DMA不使用)
cfg.pin_sclk = PIN_LCD_CLK; // SPIのSCLKピン番号を設定 CLK
cfg.pin_mosi = PIN_LCD_DIN; // SPIのMOSIピン番号を設定 DI
cfg.pin_miso = -1; // SPIのMISOピン番号を設定 (-1 = disable)
cfg.pin_dc = PIN_LCD_DC; // SPIのD/Cピン番号を設定 (-1 = disable) DC
// 表示パネル制御の設定
cfg.panel_width = 240; // 実際に表示可能な幅
cfg.panel_height = 320; // 実際に表示可能な高さ
cfg.offset_x = -34; // パネルのX方向オフセット量
cfg.offset_y = 0; // パネルのY方向オフセット量
cfg.offset_rotation = 0; // 回転方向の値のオフセット 0~7 (4~7は上下反転)
cfg.dummy_read_pixel = 8; // ピクセル読出し前のダミーリードのビット数
cfg.dummy_read_bits = 1; // ピクセル以外のデータ読出し前のダミーリードのビット数
cfg.readable = true; // データ読出しが可能な場合 trueに設定
cfg.invert = true; // パネルの明暗が反転してしまう場合 trueに設定
cfg.rgb_order = false; // パネルの赤と青が入れ替わってしまう場合 trueに設定
cfg.dlen_16bit = false; // データ長を16bit単位で送信するパネルの場合 trueに設定
cfg.bus_shared = false; // SDカードとバスを共有している場合 trueに設定(drawJpgFile等でバス制御を行います)
-
cfg.spi_mode = 0にしないと動作しない. -
バックライトはVDDに繋げば光る(ので制御しない)
-
画面の大きさは縦方向がデフォルトで,幅172x高さ320とされている.これに従って
cfg.panel_width=172という値を入れると,ノイズを画面に表示してしまう.いろいろ試行錯誤したところ,cfg.panel_width=240とし,実際の画面の大きさとの差分68pxの半分だけずらすためにcfg.offset_x = -34とすることで,ノイズが現れなくなった.
最後のあたり,とても泥縄的ですが,もっと良い方法があったら教えてください…