オリジナル16ビットCPUコアMoscoviumで使用しているSPI-TFT表示器は、ドライバチップにST7735Rを搭載して、128×160[ドット]で約26万色表示(18ビットカラー)が特長です。前回、新しくSPI-TFT表示器(ドライバチップはST7789V)を購入してアップグレイドして見ました。今回はソフトウェアの対応を進めたいと思います。
ソフトウェアに話を移すと、ST7735RとST7789Vは同シリーズのドライバチップ🏌️なので、従来のSPI-TFT(ST7735R)で作成して来たソフトウェアの小改定で対応可能なはずです。
ST7789Vのデータシートを検索(別ウインドウが開きます)
SPI-TFT(ST7735R)は、Blockly for Moscoviumのサポートがあります。SPI-TFT(ST7789V)に対応させるため、ランタイムライブラリを改定しました(以下リンク)。
改定後ランタイムライブラリ:blky2mcvm_libstft.incl
改定した内容をまとめておきます。
改定内容:
SPI-TFT(ST7735R)をBlockly for Moscoviumへ適応した時に作成したデモプログラム(以下リンク)を使って、新しいSPI-TFT(ST7789V)を評価しようと思います。
デモプログラム:blky_spi_tft.bxml
ざっと見直して見たところ、SPI-TFT制御ブロック(従ってランタイムライブラリ)によって隠蔽されているので、上のプログラム自体は変更なしで使えそうです。
ただし、SPI-TFT表示器の自動判別には対応していないため、使用するSPI-TFT表示器に従って変換オプションの設定が必要です。
変換オプション:
上でリンクしたプログラムは、元々SPI-TFT(ST7735R)用なので、SPI-TFT(ST7789V)を使う場合は変換オプション「@STFT_ST7789V@」を追加してからコンパイル(変換・アセンブル)してください。
以下接続表に従って、Cmod A7ボードと、SPI-TFTアダプタ、SPI-TFT(ST7789V)を接続します。
| Cmod A7ボード | 接続 | SPI-TFTアダプタ | 接続 | SPI-TFT(ST7789V) |
| PMODコネクタ | ⇔ | ピンヘッダ | ||
| ピンソケット | ⇔ | ピンヘッダ | ||
Cmod A7ボードには、MSOC115TF3208など、STFT61ユニットを搭載したマイコンを書き込んでください。
以下図は実験中の様子です。

実験サンプルに従って実験を進めましょう。
実験サンプル:【 】内はシリアルモニタからの送信データ
【demo,0】
OK+ demo,1
OK+ pix(32,32)=0xffff (0x041f=orange)
OK+ demo,2
OK+ pix(64,64)=0xffff (0x8410=gray)
OK+ demo,3
OK+ pix(0x89,0xab,0xcd)=0xcd51 (0xcd51)
OK+ chars N=10275
OK+ demo,4
OK+ pix(0x80,0x40,0x20)=0x2210 (0x2210)
OK+ dots N=0x7bca
OK+ demo,5
OK+ pix(0x12,0x34,0x56)=0x51a2 (0x51a2)
OK+ boxes N=82
OK+ demo,6
OK+ pix(0x3f,0xff,0x7f)=0x7fe7 (0x7fe7)
OK+ lines N=1134
OK+ demo,7
OK+ demo,8
OK+ demo,9
OK: demo
一通りデモを実行してみました。SPI-TFT(ST7789V)の画面描画状況等、概ね期待通りの動作を確認しました。

解像度が×4倍近く異なるので、同じフォントサイズで描画すると、上図の様な感じです。一番上の大きめな文字は、縦・横×2倍に拡大した倍角文字(16×16[ドット])です。普通の文字(8×8[ドット])は小さすぎて読み難いです。SPI-TFT(ST7789V)では倍角文字が基本でしょう。
描画面積(ドット数)も×4倍に増加しているため、全画面消去や面積の大きな塗りつぶし矩形を描画するのには相応の時間を要しています。端的に表現すると、「遅く」なりました。
また、「概ね期待通り」と記した通り、実は二点ほど期待と異なる動作を観測しました。以下、期待と異なる動作について報告します。
期待と異なる一点目は、シリアルモニタに送信されてきたログの中で、SPI-TFTのグラフィックRAMからデータを読み出した以下の部分です。
該当箇所の抜粋:
OK+ pix(32,32)=0xffff (0x041f=orange)
OK+ pix(64,64)=0xffff (0x8410=gray)
丸カッコ内に期待値が表示されているのですが、読み出した値はいずれも0xffffであり、期待と異なります。
「ああ、そう来たか……」
何が起きているのかは、一瞬で理解できました。
ST7789VはST7735Rと同様、SPI通信のMISO信号がMOSI信号と多重化されていて双方向信号線と言う仕様です。通信プロトコルの中で入力と出力が切り替わり、半二重通信しています。
SPI-TFT(ST7735R)では、ちゃんと双方向信号線として機能していたので、グラフィックRAMからの読み出しができたのですが、SPI-TFT(ST7789V)では、基板上の何らかの回路によって単方向(入力専用、MOSI信号)と言う扱いになっている模様です。だから、データの読み出しができず、期待値が不一致する原因となっています。
グラフィックRAMは、18ビットピクセル×(240×320[ドット])=172,800バイト=168.75Kバイトもの大容量なので、描画したデータを読み出せる事には大きな利点がありました。
例えばマンデルブロ集合などを計算させて描画終了後、「グラフィックRAMからデータを読み出してセーブする」等の応用を期待していたので、筆者にとってグラフィックRAMの読み出し機能は「必須」に近い機能でした。それが使えないのは、すこぶる「痛い」です。致命的と言っても良いくらいです。
期待と異なる二点目は、バックライトの輝度を変化させる【demo,8】コマンドが機能しなかった事です。
// SPI-TFT (ST7789V) 初期化コマンド抜粋
// WRCTRLD (write control display)
datb 2,0x53,0x24,0 // バックライト制御有効
:
: (中略)
:
// ST7789V WRDISBV (write display brightness)
ldvar r2,_stft_spi_buf
ldbiu r1,0x51
stb [r2],r1
addi r2,1
stb [r2],r0 // r0=バックライト輝度0〜255
// spi
ldbiu r1,2
subi r2,1
jal$(z)r7 _stft_send_r1_r2
上のコードで抜けは無いと思いますが……。結果としてバックライトの輝度制御は機能しませんでした。
ドライバチップST7789Vにはバックライト制御が機能として備わっているのですが、基板上の回路またはTFTパネルの何れかが対応していない模様です。SPI-TFT(ST7735R)と異なり、バックライト制御用の端子が引き出されていないため、SPI-TFT(ST7789V)ではバックライトの明るさを調整する事はできません。
こちらは、それほど重要な機能では無いので、普通に「残念」と言ったところです。
気を取り直して、一旦、実験を閉じておきましょう。
今回のアダプタボード改造は、新たにSPI-TFT(ST7789V)を使用可能にすると同時に、従来から使っていたSPI-TFT(ST7735R)でも継続使用可能な事を目標仕様としていました。
改造によるデグレイドが起きていないかどうか、SPI-TFT(ST7735R)を装着して従来通りの動作となる事を確認しました(以下動画参照)。
※上の動画自体は過去に作成した物ですが、同等の実行結果となる事を確認しました。
アダプタボードの改造後も、従来のSPI-TFT(ST7735R)がそのまま使用可能な事を確認できました。ソフトウェアの方も、ST7735RとST7789Vの制御コード切り替えが正常に行われた事を示しています。
何しろ、新しいSPI-TFT(ST7789V)は解像度が約×4倍で、ドット密度も約×2倍なので、兎に角、文字が小さくて老眼には致命的です。描画面積が約×4倍に拡大した事に起因する描画速度の低下も欠点となり得るでしょう。一方、マンデルブロ集合などのグラフィック描画等の用途に於いては、高精細な事が大きな優位となります。
つまり、SPI-TFT(ST7735R)とSPI-TFT(ST7789V)は、用途によってうまく使い分けた方が賢いという事です。アダプタボード並びに開発環境(Blockly for Moscovium)の品質劣化なく、両方に共通使用できる事が確認できたのは成果です。
SPI-TFT表示器の解像度を一気に×4倍へアップグレイドしたつもりが、残念な事に、筆者にとって必須に近い「グラフィックRAMの読み出し機能」が使用不能なモジュールになっていることが判明し、お蔵入り確定です。


