I2Cの前にSPI接続を試しておく予定だったのですが、前後してしまった。
で、早速、SPI接続の簡単なテストから始めてみました~
とりあえず、書き込みだけで、動作を確認できそうなので、LCDで実験してみます。
基板付きFSTN液晶モジュール(SPI) [M-G0812P7567]
このLCDモジュールは、128×32ピクセルで、LEDバックライト内臓のタイプです。
※3.3Vで動作させる為、バックライトLED用の電源は、HT7750Aで昇圧しています。
※先日作ったシリアルモジュールを繋なげるようにして、フラッシュ書き込みのモードスイッチ、
リセットスイッチも設けました。
ビットマップグラフィックスでは、描画の利便性から、どうしても、解像度と同じメモリーが必要
です、R8C/M120AN の場合、RAM が1280バイトしか無いので、128×32だと512バイトの
RAMを消費します、この容量が、限界ギリギリのとこでしょうか・・・
LCDにデータを送ったら、このRAMは他の用途に使えるので、シェアリングする事も出来ると
思いますが、その場合を考えて、システムを設計しておかなければなりません・・
LCDの制御コードは、U8glib を参考にしましたが、ST7567の制御コードは無かったので、
多分近そうなST7565の初期化パターンを参考にしました。
※ST7567のデータシートはネットを探すとあるのですが、いくつかの流動的パラメーター
があり、とりあえず、どのようにするのか目安が必要です。
※Aitendoさんの商品は、安くて、魅力的なのが多いのですが、参考資料が少ないのが難点です。
カットアンドトライで、コードを変えながら、1時間くらいかかって、ようやく画面がまともに
出るとこまで来ました。
※まだ多少不安定な事があり、原因を究明中・・・
SPIでは、SCL、SDA_OUT、SDA_INPの3本が、ベースで、デバイスセレクトや、
アドレスセレクトは、別に考える必要があります、複数のSPIデバイスを繋ぐ場合、ベースの
制御信号は、シェアする為です。
spi_io クラスは、非常にシンプルで、基本、write、read のみです。(まだ write のみの実装)
※R8C/M120AN には、UARTの同期モードがあり、これを使うと良さそうですが、そうすると、
UARTが使えなくなってしまう為、ソフト制御としました。
lcd_io(ST7567の制御)では、LCD制御を含めて、SPIを制御します。
今回のLCDでは4本の制御線が必要です。
SPI(共通部分):
・SDA シリアルデータ
・SCL シリアルクロック
LCD(固有部分):
・A0 アドレスセレクト(コマンドレジスタとデータレジスタの切り替え)
・/CS チップセレクト
※RES信号は、R8Cのリセットに接続しています。
SPI制御ポートの定義
struct spi_base { void init() const { device::PD4.B2 = 1; device::PD4.B5 = 1; } void scl_out(bool b) const { device::P4.B2 = b; } void sda_out(bool b) const { device::P4.B5 = b; } };
LCD制御ポート(A0、/CS)の定義
struct spi_ctrl { void init() const { device::PD3.B3 = 1; device::PD3.B7 = 1; } void a0_out(bool b) const { device::P3.B3 = b; } void cs_out(bool b) const { device::P3.B7 = b; } };