ArduinoでaitendoのTFT液晶(M-Z18SPI-2PB)を制御するライブラリを作成するための調査(4)

投稿者: | ↻ : 2019年3月24日

はじめに

一旦、ソースコードの解析は休んで、ハードウェアについて調べます。

aitendoの液晶モジュールに使われている制御チップ(ST7735S)のデータシートから仕様を理解し、ソースコードを解析する際のあたりが付けられるようにします。

素人だから解釈が間違っているヶ所があるかもしれないけど突き進むよ(>ω<)b

ST7735Sの仕様について

ST7735Sデータシート V1.3

ST7735Sのデータシートから、aitendoの液晶モジュールを制御することを考えながら仕様を読み解きます。

対応しているインターフェス

データシートの「2 FEATURES」参照

Various Interfaces

  • Parallel 8080-series MCU Interface (8-bit, 9-bit, 16-bit & 18-bit)
  • ​Parallel 6800-series MCU Interface (8-bit, 9-bit, 16-bit & 18-bit)
  • ​3-line Serial Interface
  • ​4-line Serial Interface

パラレル接続とシリアル接続に対応しています。

絶対最大定格

この値を超えると破損するか、品質が低下をまねくので超えてはならない値です。

データシートの「7.1 Absolute Operation Range」参照。

ItemSymbolRatingUnit
Supply VoltageVDD– 0.3 ~ +4.8V
Supply Voltage (Logic)VDDI– 0.3 ~ +4.6V
Supply Voltage (Digital)VCC-0.3 ~ +1.95V
Driver Supply VoltageVGH-VGL-0.3 ~ +30.0V
Logic Input Voltage RangeVIN-0.3 ~ VDDI + 0.3V
Logic Output Voltage RangeVO-0.3 ~ VDDI + 0.3V
Operating Temperature RangeTOPR-30 ~ +85°C
Storage Temperature RangeTSTG-40 ~ +125°C

データシートでVOの項目名が「Logic Input Voltage Range」になっていたが同型のST7735のデータシートを確認すると「Logic Output Voltage Range」でったので修正してます。

Driver Supply Voltage:VGH-VGLとは?

「5 BLOCK DIAGRAM」のブロック図を確認すると、VGHとVGLはBoosterの出力となっています。このBoosterは液晶駆動電圧を生成する昇圧回路(らしい)です。液晶駆動電圧がDriver Supply Voltageです。液晶モジュール内の仕様になるので存在だけ覚えておきます。

Supply Voltage:VDDとは?

回路の駆動に必要な電圧です。

Supply Voltage (Logic):VDDIとは?

内蔵ドライバのロジック回路の駆動に必要な電圧です。

Supply Voltage (Digital):VCCとは?

内部動作を監視するための出力らしいです。(このピンには接続しないでくださいとの説明があるので詳細は追いません)

Logic Input/Output Voltage Range:VIN/VOとは?

内蔵ドライバのロジック回路の入出力電圧です。入出力の最大電圧は4.9V(VDDI+0.3)だと分かります。

直流特性

通常利用する場合は、絶対最大定格のギリギリではなく、直流特性の範囲内か代表値(Typ)付近で利用します。

データシートの「7.2 DC Characteristic」参照。

制御チップをどう組み込んでいるかは液晶モジュールごとの仕様となります。

aitendoの液晶モジュールでは以下の通り:

電源電圧(VCC)に3.3V、バックライトLED(VLED)に5.0Vを入力するようになっています。バックライトLEDは制御チップと関係ありません。
VDDIが3.3Vになるので入出力信号の、Logic-High Input Voltage (VIH) = HIGHと判断する電圧、Logic-Low Input Voltage (VIL) = LOWと判断する電圧が分かります。

左が入力信号、右が出力信号を表しています。

ここで少し疑問が生まれます。

5Vで動作するArduinoボードで、ピンがOUTPUTに設定されているときdigitalWriteでHIGHを出力すると、そのピンの出力は5Vになります。

Arduino 日本語リファレンス – HIGH/LOW (ピンのレベルを定義する定数)

なので、ArduinoからST7735Sへ信号を送るとき、5Vだと絶対最大定格を超えるので対応が必要なのではと調べました。結果は問題有りで、部品の寿命が縮むので降圧などの対応した方が良さそうです。

4ラインのシリアル接続

データシートの「9.4 Serial Interface」参照。

aitendoの液晶モジュールは、ST7735Sの4ラインのシリアル接続に対応しています。

aitendoの製品ページではSPI接続と書かれていますが、シリアル接続であってもSPIではありません。

モトローラが提唱した規格SPI(Serial Peripheral Interface)では以下の4本の信号線で接続します。

  • SCLK (Serial Clock):通信の同期を取るためのクロック信号線
  • SS (Slave Select):通信する相手を決める信号線
  • MOSI (Master Out Slave In):マスターからスレーブ方向への通信を行う信号線
  • MISO (Master In Slave Out):スレーブからマスター方向への通信を行う信号線

ST7735Sの4ラインのシリアル接続は以下の4本の信号線で接続します。

  • SCL (Serial Clock):通信の同期を取るためのクロック信号線
  • CSX (Chip Selection):通信する相手を決める信号線
  • SDA (Serial data Input/output):マスターとスレーブで入出力を行う信号線
  • D/CX (Data/Command Selection):制御チップに送る信号がコマンドかデータかを選択する信号線

大きく違うのは、SPIでは一方方向の信号線(MOSIとMISO)でデータを送信するのに対して、SDAだけで通信するところです。

SDAをMOSIとして扱うと、MISOを利用しないSPI接続とほぼ同じになるため、ArduinoのSPIライブラリにより通信が行えます。しかし、SPIライブラリではST7735Sからデータを読み取ることは出来ません。

コマンドとデータ

データシートの「9.4.1 Command Write Mode」参照。

ST7735Sへ送る信号にはコマンドとデータ(パラメータと表示データ)があり、どちらもSDAを使用して送信します。コマンドとデータはバイト単位(8ビット)です。

SDAで送られた信号は、D/CXがLOWならばコマンド、D/CXがHIGHならばデータとして扱われます。

データシートの「10 COMMAND」に各種コマンドとパラメータの一覧と詳細があります。

リセット

ハードウェア・リセットとソフトウェア・リセットがあります。

ハードウェア・リセット

データシートの「9.17 Reset Timing」参照。

RESX(active low)を一定時間LOWにすることでハードウェア・リセットが開始されます。

aitendoの液晶モジュールではRSTピンがRESXに接続されています。

表のtREST部分が分かりにくいですが続く説明から10us以上LOWにするとリセット処理が開始されます。非スリープ状態(Sleep-Out)ならば、コマンドを受け付ける状態になるまで最大120msかかります。

ソフトウェア・リセット

データシートの「10.1.2 SWRESET (01h): Software Reset」参照。

SWRESET(01h):Software Resetコマンドを送信することでソフトウェア・リセットが開始されます。いくつかの条件でコマンドを受け付ける状態になるまで最大120msかかります。

リセット後の状態

制御する液晶パネルサイズによりモードが決まり、設定値が決まってます。

aitendoの液晶モジュールでは128×160ドットなので「9.15.1 Reset Table(Default Value, GM[1:0]=“11”, 128RGB x 160)」の設定値となります。

設定値を確認するとリセット後は、スリープ状態(Sleep-In)かつ、表示オフ(液晶パネルへの出力無し)だと分かります。なので液晶パネルへ点を表示するには、スリープ解除(Sleep-Out)と表示オンにします。

フレームメモリー

データシートの「9.9 Display Data RAM」参照。

液晶モジュールは画像データを保持するRAM(フレームメモリー)を持っています。フレームメモリーは384,912ビットの容量があり、132RGBx162ドット、18ビットカラー(262,144色)分の情報を保持できます。フレームメモリーの内容の一部を液晶パネルへ転送することで表示されます。

フレームメモリー上で液晶パネルに表示される範囲は、開始位置も含めて製品化された液晶モジュールごとに異なります。液晶モジュールを使用する側でフレームメモリーへの書き込み開始位置を調節します。これが、「ArduinoでaitendoのTFT液晶(M-Z18SPI-2PB)を制御するライブラリを作成するための調査(1)」でAdafruitのライブラリにコードを追加した理由です。

データシートの「9.9.7 When using 128RGB x 160 resolution (GM[1:0] = “11”)」も参照。

アドレスカウンタ

データシートの「9.10 Address Counter」参照。

画像データをフレームメモリーに書き込む場合は、アドレスカウンタ(X,Y)を設定します。アドレス範囲は列Xが0〜131(83h)、行Yが0〜161(A1h)で範囲外のアクセスは許可されません。

フレームメモリーはピクセル単位で二次元配列になっています。フレームメモリーに1ピクセル分の書き込みが行われると、列カウンタが1進み列の終端まで来たら先頭に戻り行カウンタが1増加します。最終行で列の終端まで来たら列カウンタと行カウンタが先頭に戻ります。

表示が有効ならば、1ピクセル分の書き込みが完了すると、即液晶パネルへ転送が行われます。

アドレスカウンタの先頭と終端は固定ではなく書き込み開始時に設定します。なので常に全画面を更新せず必要な部分だけを更新できます。

まとめ

ST7735Sのデータシートを読み解く過程で、液晶パネルの制御の概要と、データシートの読み方が分かってきた気がします。気がしますノω・)

ここまでの解釈をふまえてソースコードの解析に戻ります。

用語

VDD、VSS、VCC、VEEとは?

Wikipedia – IC power-supply pin

はっきりとコレ!という一次情報が見つからないけども、近いと思われたものをメモしておきます。

VDD(Voltage Drain Drain)、VSS(Voltage Source Source)

MOS型ICには複数のFET(Field effect transistor)が搭載されています。FETを駆動するには、いくつかのピンに電圧を印加する必要があります。印加するピンの違いによりD(Drain)、S(Source)となります。DDやSSのように二つ重ねるのは複数のMOSFETへの接続を表しています。

VCC(Voltage Collector Collector)、VEE(Voltage Emitter Emitter)

バイポーラ型ICにはBJT(Bipolar junction transistor)が搭載されています。ピンの呼び名が異なるだけで、EFTと同じ理由でC(Collector)、E(Emitter)となります。