記事一覧

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PSoC5LPのEMFIを使ったパラレルメモリ液晶表示(PSoC Advent Calender 2016)

Twitter上の成り行きで勢い余ってPSoCAdvendCalenderなるものに登録してみたもののどんな感じに書けばよいか???なので、関係各所?ご指導の方宜しくお願い致します^^;







上記ツイッターに上げた動画のプロジェクトは、ここ5288_ILI9486L_16bit_EMFI_testに有ります。
フォルダを指定後(緑色チェック)ダウンロード、解凍して中にある..cyprjファイルをダブルクリックでプロジェクトが開きます。
CY8C5288用となっているので、プロジェクト名を左クリックし、デバイスセレクタを開きご使用のデバイスに変更してお試しください。


またここには私用で作ったeagle6.5用のPSoC5LPのブレイクアウトボードのファイルも置いてあります。
必ず自己で内容確認後、改変等々したりして使っていただければ幸いです。。


本題のEMFIでの液晶パネルへのデータ/コマンドの送り方を先に、液晶パネル表示に関する事を後に書きます。

通常、PSoC5LPを使ってパラレル8bit16bit接続なグラフィック液晶パネル(カラー、モノクロ問わず)を使って表示をする時、Cypressご謹製のGraphic LCD Interface (GraphicLCDIntf)とゆうコンポーネントがPSoC Creater内にあるのでソレを使うと、とても簡単にパラレル接続なグラフィック液晶パネルの表示ができます。

しかし、最近のカラーTFT液晶パネルのコントローラーの作動速度等々、このGraphic LCD Interfaceコンポーネントを使うと通信速度の上限がある程度なので、設定可能条件の上限にぶち当たってしまいカラーTFT液晶パネルの性能を十二分に発揮することができません。

Web上では、PSoC5LP同じCortexM3なCPUコアを持つSTM32F103(72MHz駆動)が綺麗に動画を再生しています。
STM32F103に出来て最大作動速度80MHzなPSoC5LPに出来ないはずはない、と思い実際にやってみました。

STM32F103での高速なカラーTFT液晶パネル表示を簡便に行うにはFSMC (flexible static memory controller)とゆう100pin以上のF103に載っている外部メモリインターフェースを使います。
PSoC5LPの場合、名前もそのままExternal Memory Interface (EMIF)(外部メモリインターフェース)コンポーネントを使います。
今回はマクロ化?されたAnsynchronusExternalMemoryInterfaceを使用しています。

グラフィックLCDインターフェースコンポーネントを使わずAnsynchronusExternalMemoryInterfaceを液晶パネル表示に使う最大のデメリットは外部メモリインターフェース側から見た液晶パネルのアドレスは2つしか使わずアドレス指定用のピンを1本しか使用しないにも関わらす、アドレス指定用のピンを8本確保してしまうことです。

多分何らかの方法でこのアドレス指定のピンの使用量の削減の手段は有るのだと思いますが、私の知識が足らず、、残念です。。



PSoC5LPのEMFIを使ったPSoC5LPのEMFIを使ったパラレルメモリ液晶へのコマンド、データの書き込み

さてさて、8080な16bitパラレルな液晶パネルのインターフェースのI/Oピンは、

D/C(Data/Command) 若しくは RS(RegisterSelect) input
CS (ChipSerect)input
WR (WriteRegister?)input
RD (ReadData)input
D[16:0] (Data16bit)input/output

です。
パラレル液晶パネル駆動時にはEMFIのアドレス指定ピン(EMFI:emfi_Addr_lsb[7:0])を使用し液晶パネルのD/Cを指定します。

STM32の場合の参考  とんすけぶろぐさんの記事 STBeeボード+2.4インチ液晶パネルYHY024006Aで動画再生60FPS超える

STM32F103もPSoC5LPも双方ともCortexM3でGCCなので、外部メモリコントローラーの設定方法が違うだけで、外部メモリアクセスに関するC言語での記述はほぼ同じでとんすけさんのブログを参考としています。

ちょっと話がすっ飛びましたが、液晶パネルのI/OとEMFIの接続は次のようになります。

液晶パネルI/O <= EMFI
D/C <= Adress[1]
CS <= cen
WR <= wen
RD <= oen
D[16:0] <= DATA

となります。
PSoC Createrの回路図入力では

すけま

で、上記のピン以外にLCDパネルのリセットピンをGPIOで1本必要です。

EMFIの設定は

emfi設定

ExternalMemorySpeed(ns) は、使用するカラーTFT液晶パネルのデータシートから算出してください。
今回の例ではILITEKのILI9486液晶パネルコントローラーを使用したebayやAliexpressで手に入る480x320ピクセルの3.5インチの液晶パネルを使用しています。

ebay参考
3.5 Inch TFT LCD Screen Module 320*480 HD New Trendy Fashion Style Screen F7
3.5 Inch TFT LCD Screen Module 320*480 HD New Trendy Fashion Style Screen QT

また、PSoC5LP側が同じ設定で480x852ピクセルで5インチのILI9806Gも作動しています。

参考Aliexpress
IPS 5.0 inch 51P 16M HD TFT LCD RGB Resistive Touch Screen with Adapter Board ILI9806G IC 8/16/18/ 24Bit MCU Interface 480*854

もちろんILI9806Gの場合と、ILI9486の場合では、液晶パネル作動時に最初に送る初期設定コマンド/データは違います。また、厳密に言えば表示のガンマ値等々液晶パネル自体の制御に関するパラメーターが微妙に違うので、パネルの品番毎に初期設定データは違うはずです。

プログラムの方は、上で書いたようにとんすけぶろぐさんに倣って、、、

typedef struct
{
uint16_t CMD;
uint16_t DATA;
}TFT_TypeDef;


#define TFT_BASE ((uint32_t)(0x60000000))
#define TFT ((TFT_TypeDef*)TFT_BASE)

とします。

そうすると、液晶パネルへのコマンドの書き込みは

TFT->CMD = Command;

と記述するだけでこ液晶パネルにコマンドが送信されます。

データは

TFT->DATA = Data;

と記述するだけです。

データの構造をコマンド、データ、双方16bitとしてあるので、コマンドを送る時のアドレスbitはアドレスの一番最初なので、0b00000000となり、コマンド送信を指定します。データを送る時にHighになるbitが0b00000010となり、液晶パネル側のD/Cインプットに繋ぐピンがAdress[1]となります。

CortexM3だからか、STM32と、PSoC5LPで、外部メモリがマッピングされるアドレスが同じですね。。



メモリ液晶への初期設定と描画


ライセンス表示が無いのでアレですが、Cypress Developer Community内のSPI TFT Color LCD240x320 +SDスレッド内のTFT240_320_SD.zip とゆうファイルを展開した中に有るTFT.h、TFT.c、fonts.hとゆうライブラリを私は使わせていただいています。

TFT.h上部のコメント欄内にあるURLを開いてみるとСхемы, виртуальные приборы и др.とゆう、ロシア語のPSoCに関する記述のページにたどり着きます。このページ内にも、先のライブラリの入ったPSoCのプロジェクトが幾つか有ります。

先の TFT240_320_SDとゆうプロジェクトを展開すると、PSoC4用のプロジェクトが開きますが、液晶表示に使われているライブラリ自体はPSoC5LPのプロジェクトに入れて、SPIインターフェースをPSoC5LPの物できちんと設定すると海外通販で販売されている安価な240x320pixelの2.2インチSPI接続なILI9341液晶コントローラーを使用した液晶パネルがそのまま動きます。

参考 ebay
2.2 inch 2.2" SPI TFT LCD Display module 240x320 ILI9341 51/AVR/STM32/ARM/PIC


チョイと脱線してしまいましたが、上記リンク内のTFTのライブラリ内の関数
void TFT_SendCMD(uint8_t cmd);
void TFT_WriteData(uint8_t data);
void TFT_SendData(uint16_t data);
はSPIインターフェースが指定してあるので、ココを

TFT->CMD = cmd;
TFT->DATA=Data;

に置き換えることでEMFIを使った16bitパラレルでコマンドデータの送信が出来るハズ。。

初期設定コマンド、データは色々とWeb上沢山有りLinuxのドライバ内にも有ったりします。
また、国内Web上でTFT液晶パネル表示のとても参考になるブログとしてねむいさんのぶろぐがあります。
ねむいさんのぶろぐ内のおきば内のCortex-M7、CortexM4Fの所のリンクをクリックしてダウンロード出来るファイル(STM32用)の\lib\display\drivers以下のsrc,incフォルダ内に各種TFTLCDコントローラー用の初期化コマンド、データ等々が参照出来るライブラリがあります。
ご参考まで。。

上記ねむいさんのぶろぐのWVGAな解像度で容量性タッチパネルなTFT-LCDモジュールを動かすその2内の記述に 
引用
動かし方は初期化の呪文を唱えた後は有名なILI9341たちと同じようにMIPI DisplayCommandSetに倣って0x2A,0x2Bでレクタングルを指定したら0x2Cでデータを送信するというお決まりのパターンです。
引用終わり

とあり、基本的な描画に関するコマンドは決まっているようです。
ただ、液晶パネルコントローラーの表示、パネル内の原点設定や、画面の回転、反転に関するコマンド、初期設定に関するコマンドは液晶パネルコントローラー毎に違うので、注意が必要です。


この手の小型メモリ液晶パネルの場合、上記で引用させて頂いたねむいさんの記述のように、0x2A(コマンド)を送り、X始点アドレス(データ)、X終点アドレス(データ)を送り指定、0x2B(コマンド)を送りY始点アドレス(データ)、Y終点アドレス(データ)を送り指定し、画面内に四角形の描画範囲を指定し、0x2C(コマンド)を送り指定範囲内の色(データ)を指定した範囲内のピクセルの数だけ送信し描画します。

水平の線、垂直の線、四角形、四角形のアイコンや、画面全体を描画するような時は位置指定コマンド、データ数に対して色データの数の方が多くなり非常に効率的な描画が出来る反面、点や円、斜めに走る線等の描画時には、位置指定コマンド、データの量が色データの量より多くなり、送信データに対する描画効率が落ちます。

Web上で見かけるこの手の液晶パネル、主な用途が動画再生だったりするので、非常に効率の良い使い方なんだろうなと思います。

基本、点が書ければ線や円、フォントが表示きます。
このあたり、このページで取り上げさせて頂いたTFTライブラリや、他液晶パネル表示用のライブラリを読んでみるとその仕組がわかると思います。








とはいえども、STM32F303VEが遅いわけではなく、PSoCLP5が予想以上に速い描画が、、、ってことです。。

スポンサーサイト

コメント

コメントの投稿

非公開コメント

プロフィール

akirahitosi

Author:akirahitosi
タイトルの通り個人的な備忘帳です。
使用しているMCUはSTM32F4とPSoC5LPなどなど。
自分が使う機能で、Web上の記事で参考にさせて頂いたページ等々を残しておこうとしてるので、このブログの記事のみでは、「できる」ようにはならないのでは?と思います。

最新コメント

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。