Skip to content

Latest commit

 

History

History
125 lines (99 loc) · 7.5 KB

File metadata and controls

125 lines (99 loc) · 7.5 KB

ILI9341 ディスプレイドライバ

Copyright 2020 Moddable Tech, Inc.
改訂: 2024年9月10日

ILI9341 LCDコントローラは、16ビット/ピクセル(RGB565LE)ディスプレイを動作します。ディスプレイは最大240ピクセル幅、320ピクセル高さです。

ILI9341ドライバは、128 x 128ピクセルの正方形ディスプレイで16ビット/ピクセルのILI9163Cディスプレイコントローラでも正常に動作します。

プロジェクトにILI9341を追加する

プロジェクトにILI9341ドライバを追加するには、そのマニフェストをインクルードします:

"include": [
	/* other includes here */
	"$(MODULES)/drivers/ili9341/manifest.json"
],

CommodettoまたはPiuを使用する場合、マニフェストのconfigオブジェクトのscreenプロパティをili9341に設定して、ILI9341をデフォルトのディスプレイドライバにします。タッチ入力がない場合は、タッチドライバ名を空の文字列に設定して無効にします。

"config": {
	"screen": "ili9341",
	"touch": ""
},

: manifest_piu.jsonマニフェストにはILI9341がインクルードされています。したがって、manifest_piu.jsonを使用するプロジェクトは、自分でそれをインクルードする必要はありません。

ピクセルフォーマット

ILI9341ドライバは、入力として多くの異なるピクセルフォーマットをサポートしています。16ビットカラーのピクセルはドライバのネイティブフォーマットであり、最も一般的に使用されます。mcconfigを使用してビルドする際には、コマンドラインでピクセルフォーマットをrgb565leに設定します:

mcconfig -m -p esp -f rgb565le

ILI9341ドライバが直接サポートする他のフォーマットには、8ビットグレー(gray256)、8ビットカラー(rgb332)、および4ビットグレー(gray16)があります。

さらに、4ビットカラー(clut16)もサポートされています。デフォルトのカラーテーブルはありません。アプリケーションはカラーテーブルを設定する必要があります。Pocoを使用する場合、カラーテーブルはコンストラクタの辞書内のclutプロパティとして渡されます。Piuを使用する場合、カラーテーブルはmain.cctという名前のResourceから自動的にロードされます。また、アプリケーションのclutプロパティに明示的に設定することもできます。スクリプトからカラーテーブルを変更する実例については、Piuのclutのサンプルを参照してください。

ほとんどのプロジェクトでは16ビットRGBピクセルを使用しますが、他のピクセルフォーマットも有用です:

  • アプリケーションが低い色解像度のディスプレイでどのようにレンダリングされるかをテストするため
  • ROM内のカラー画像リソースのサイズを削減するため
  • RAMの使用量を削減するため(小さいサイズのピクセルは小さいレンダリングバッファを使用します。例えば、4ビットのグレーピクセルは16ビットのRGBピクセルよりも75%少ないRAMを使用します)

定義

definesオブジェクト内で、ピクセルのwidthheightを宣言します。

"defines": {
	"ili9341": {
		"width": 128,
		"height": 128
	}
}

オプションのregistersプロパティは、ILI9341のデフォルトのレジスタ初期化を上書きするために使用されます。レジスタプロパティはドライバのソースコードの一部としてCでコンパイルされるため、ドライバと同じ#define定数にアクセスできます。そのため、以下のようにkDelayMSMODDEF_ILI9341_FLIPY、およびMODDEF_ILI9341_FLIPXが使用されています。レジスタコマンドのリストは、値が0の擬似レジスタkDelayMSで終了します。

"defines": {
	"ili9341": {
		/* other properties here */
		"registers": [
			"0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02,",
			"0xCF, 3, 0x00, 0xC1, 0X30,",
			"0xE8, 3, 0x85, 0x00, 0x78,",
			"0xEA, 2, 0x00, 0x00,",
			"0xED, 4, 0x64, 0x03, 0x12, 0x81,",
			"0xF7, 1, 0x20,",
			"0xC0, 1, 0x23,",
			"0xC1, 1, 0x10,",
			"0xC5, 2, 0x3e, 0x28,",
			"0xC7, 1, 0x86,",
			"0x36, 1, (0x48 ^ (MODDEF_ILI9341_FLIPY ? 0x80 : 0)) ^ (MODDEF_ILI9341_FLIPX ? 0x40 : 0),",
			"0x3A, 1, 0x55,",
			"0xB1, 2, 0x00, 0x18,",
			"0xB6, 3, 0x08, 0x82, 0x27,",
			"0xF2, 1, 0x00,",
			"0x26, 1, 0x01,",
			"0xE0, 15, 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00,",
			"0xE1, 15, 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F,",
			"0x11, 0,",
			"0x29, 0,",
			"kDelayMS, 0"
		]
	}
}

SPIの設定

definesオブジェクトにはspi_port、およびDCCSのピン番号を含める必要があります。RSTピンが提供されている場合、コンストラクタが呼び出されたときにデバイスがリセットされます。cs_portdc_port、またはrst_portプロパティが提供されていない場合、それらはデフォルトでNULLになります。

"defines": {
	"ili9341": {
		/* other properties here */
		"cs_pin": 4,
		"dc_pin": 2,
		"rst_pin": 0,
		"spi_port": "#HSPI"
	}
}

hz プロパティが存在する場合、SPIバスの速度を指定します。デフォルト値は40,000,000 Hzで、これはILI9341がサポートする最大SPI速度に近い値です。

非同期

ILI9341ドライバは非同期SPIトランザクションを実装しており、スループットを最適化し、送信中に必要なCPU時間を最小限に抑えます。送信されるピクセルを保存するために追加のRAMを必要としないように、ILI9341ドライバはスクリプトによって提供されるバッファから直接送信します。これは、ILI9341の send 呼び出しで提供されるバッファが、次の sendcontinue または end の呼び出しが戻るまで変更されないままである必要があることを意味します。

PocoまたはPiuを使用してILI9341の非同期操作を有効にするには、レンダーバッファ内のピクセル数が2本のフルスキャンライン以上である必要があります。これはデフォルトなので、スクリプトはILI9341コンストラクタを直接呼び出す場合にのみこれを考慮する必要があります。レンダーバッファ内のピクセル数を設定するには、ILI9341コンストラクタに渡される辞書の pixels プロパティにピクセル数を設定します。

コマンド API

ILI9341ドライバは、command メソッドを使用してスクリプトがディスプレイコントローラに直接コマンドを発行できるように、PixelsOutインターフェイスを拡張します。データ引数なしでコマンドを送信するには:

// 反転オン
screen.command(0x21);

データ引数を持つコマンドを送信するには、引数を ArrayBuffer に入れます:

// 90度回転
screen.command(0x36, Uint8Array.of(0x60).buffer);