WAVプレーヤーの製作(その11 小型TFT LCDに嵌る)

小型コンパクト機器を作るのが身上なので、今使っている3.2インチよりもずっと小さい2.4インチの物が目に止まった。50%off祭りとかで、何と!625円です。

TFT液晶の動作も勉強になるだろうと思い、ポチッとしたのが運のつきでした。

【やっと動いた2.4インチTFT液晶・S95417】 oh! 撮影のデジカメが反射で写ってます。

stm32_proj_39.jpg

上が3.2インチ液晶です。長さ比は75%なのですが、面積比は約半分なので、やはり半分に見えます。
S95417がこの液晶の商品型番ですが、コントローラチップはst7787です。
これを使うに当たり、いちばん難しいところは初期化コードなのですが、ねむいさんのところのものをお借りするつもりでおりました。

・・・・・・・ところが、ところがですよ、うんともすんとも動きません。フルに4日間を費やしましたヨ。
あれやこれやと試しましたが、功無く挫折か?

気を取り直し、ハード故障かなと思いを転じ、複数個(激安なので)買っておいたものに交換しようとして、ハット気がつきました。この1個だけのシルク印刷が違うのです!  

・・・・・・交換したら、何のことなく動くではありませんか。
何だこれは。ヘロヘロです。

【誤品だったTFT液晶・cp2401】  4日間の激闘でパネルの保護シートが剥がれかけてます。
stm32_proj_41.jpg

外見がS95417にそっくりなcp2401です。白の印字を良く見ると[2401]と見えます。
一番上の写真がs95417ですが、これはこれで、s95417等の型番は付いてません。0h! 中華品質?
cp2401の初期化コードに換えると、 ハイ、これも見事に動きました。 やれやれでした。


出鼻をくじかれて始まった小型液晶ですが、動くとなるとssd1289コントローラ搭載の3.2インチ液晶の画面を出したくなります。動かない時にNETを徘徊したのですが、s95417(st7787)を動かしたという記事は、ねむいさんところでしか見つけられませんでした。

st7787のドライバー・コードを見ると、グラフィック・データを表示するルーチンはありますが、点、線、文字を表示させるコードはありませんね。こうなれば、ssd1289のコードやデータシートをベースにして、st7787のデータシートを辿っていかねばなりません。

以下、備忘録です。
-----------------------------------------------------------------------------------------
・線や文字を表示させるベースは「点」を打つこと。スタートは、Draw_Pixel()です。
void Draw_Pixel(uint16_t x, uint16_t y, uint16_t color)
{
  Set_Cursor(x, y);  // 1) 液晶のGDRAM位置を指定する
  Write_GDDRAM_Prepare(); // 2) 液晶に出力するコマンドを出す
  Write_Data(color); // 3) カラーデータをGDRAMに書き込む
}
以上の 1)、2)、3) が基本、これは具体的にはどうなっているか

1)
void Set_Cursor(uint16_t x, uint16_t y){  //ssd1289
  Write_Command(0x004E, x);  // 0x4Eというコマンドとxの位置を指定する
  Write_Command(0x004F, y);   // 0x4F、同上 y
}

2)
void Write_GDDRAM_Prepare(void){
  LCD->Register = 0x0022;  // GDRAMへ書き取り・読み取りコマンド0x0022を書き込む
}

3)
void Write_Data(uint16_t data){
  LCD->Data = data;
}

これを st7787に適用します。異なるところは、1) と 2) です。

これらのことはst7787 DataSheet のこのような表にまとめられていました。
stm32_proj_38.jpg
1) ssd1289は簡単にx,yを指定できましたが、st7787には点を指定するコマンドは無く、「範囲指定」する機能を使うことになります。
void st7787_rect(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end){

        // 後述しますが、x <-> y を入れ替えしています
        Write_Cmd(0x002A);              // x-start & x-end RAM ADDR
        Write_Data( y_start>>8);
        Write_Data( y_start);              // start
        Write_Data(y_end>>8);
        Write_Data(y_end);                // end

        Write_Cmd(0x002B);             //  y-start & end RAM ADDR
        Write_Data( x_start>>8);
        Write_Data( x_start);              // start
        Write_Data( x_end)>>8);
        Write_Data( x_end);                // end
}

2)  Write_Cmd(0x002C);              // Write Data to GRAM

・グラフィック液晶は指定した座標位置から連続して点を打っていく機能がベースになっていますが、これのスタート点とその方向を決める必要があり、初期化コード内で行っています。ssd1289液晶がベースになっていますので、st7787(s95417)液晶も同じにすれば、線や文字、そしてグラフィックなどを表示させる関数がそのまま使えるようになるはずです。

そこでやったことは、ssd1289に0,0点から始まる斜め線を描かせ、「原点位置と、x,y方向」を調べる。

#if USE_SSD1289 == 1
  Clear_Screen(LCD_GBLUE);  //for SSD1289
#else
  st7787_clear(LCD_GBLUE);  //for st7787
#endif

//LCD原点&x,y方向テスト
while(1) {
    //座標テスト
    //(x0,y0)-(x100,y100)ライン
    Draw_Line(0, 0, 100, 100, LCD_BLACK);

    //(x0,y0)-(x239,y319) SSD1289 FULL POINT
    Draw_Line(0, 0, 239, 319, LCD_RED);

    //(x0,y0)-(x239,y200)
    Draw_Line(0, 0, 239, 200, LCD_BLUE);


【ssd1289】
stm32_proj_42.jpg
右上が作図開始点、←x方向、↓y方向

初期化プログラムの設定記述内容は
  /*
   * Entry Mode R11h = 6018h
   *
   * DFM1 = 1, DFM0 = 1 => 65k Color Mode
   * ID0 = 1, AM = 1    => the way of automatic incrementing
   *                       of address counter in RAM
   */

  Write_Command(0x0011, 0x6018);




0x0011 でカラーモードとGRAMのアドレスカウンター方向を設定している。
0x18部分がアドレスカウンターの原点と方向を決めるので、0x18は下図の右上図になる。
(写真は下図に対し、時計方向に90度回っている)


さて、st7787で同じ向きになるような設定をするには、データシートのこのデータを参考にする。



原点は左上(B点)、x方向 を下図の下側に、y方向 を右側にするのがこの設定。即ち、MX=MY=0,MV=1



とすると、初期化プログラムは以下の通り(0x0036部分のみ表記)

  Write_Cmd(0x0036);
  Write_Data(0x0020);   //縦:x=320,y=240, st7787_rect(0,0,x,y) 左スタート

この設定を行うことで、LCDは以下の表示となる。ssd1289と同じです。

【st7787(st95417)】
stm32_proj_43.jpg

・・・と、ここまで記述してきて、やっと解りました。 9.12.2 の表を見ると、「X-Y Exchange」とあります。
先に記述した、void st7787_rect() 関数で、x、yを入れ替えた原因はここにあったのです。

【s95417での表示画面】
stm32_proj_40.jpg

苦労してやっと動いたs95417ですが、アイコン・バックが透過しません。色々と設定を変えてみましたが直りません。背景色を何故 BLUEと認識してしまうのだろうか? それが解りません。

このLCDは小さくて好きなのですが、
1.このアイコン背景色の問題
2.タッチパネルが4線式のA/D入力なのでSPIに慣れた身には未体験領域だ。安定度が心配です。
  ソフトも新作を要します。
3.タッチの割り込みはどうやるのだろうか? A/Dの割り込みってあるの? 動作安定するの?

安い代わりに手がかかりすぎるのが最大の欠点のようです。  どうしようかな?

625円で貴重な勉強をさせて頂きました、ということで THE END かな?

------------------------------------------------------
6月16日追記

アイコンバックカラーNGの原因が判りました。
stm32_proj_46.jpg

原因はバックカラーの取得結果が正常値になっていなかったです。過去形で書くと直ったように思えますが、恒久的にはダメ状態が続いています。
上の画像では修復されたように見えますが、実は自分で塗ったバックカラー0x07FFをアイコン作図のバックカラーデータを強制的に割り当てただけです。

st7787ではバックカラー取得に0x002E コマンドを使いますが、正常ならば 0x07FFが取得できるはずなので、取得データは 0x00FCです。色々と設定を試しましたがうまくできません。

まあ、背景に複雑な画像を配置しないプレーンな1色塗りだったら、アイコンの背景色にそれを使えば一応の解決策にはなるかな。それにしても65k色のLCDなのだから、背景色16ビットが読み取れない訳がないはずなのだが・・・ まだ何かを見落としているのかもしれない。





コメントの投稿

非公開コメント

プロフィール

haiga

Author:haiga
私のブログへようこそ!
電気オンチが始めた自作オーディオです
2010/3/17 電子工作をプラスしました。

自作オーディオの楽しみ共有のため、私が作ったパーツ提供をしてます。質問や要望を遠慮なくコメント欄に書き込んでください。

FC2カウンター
その日1回目にアクセスいただいた方の総カウントです
最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード