いろいろ試す59

●STM32L1とSTM8シリーズがNRNDになってしまった…

ほら言わんこっちゃない…温めすぎて腐ってしまいました…orz
STM8シリーズはもう少し進めたかったのですがSTM32C0が登場して
既存の8ビットはエコシステムから排除され駆逐される勢いとなって
しまいましたね…STM32L1のほうはSTM32L0,STM32U5とかが登場した
のでお役御免となった感じでしょうか…
今のラインナップを鑑みるにねむいさんが使ってきたSTM32F2やF4,
L4,L5とかも次のNRND候補になっちゃいそうですね…
まぁこれも時代の流れということで…とにも書くにもSTM8Lに関しては
最後っ屁で一件記事書いてクローズとさせてもらおうとおもいます…!


●STM32F4のHALじゃなくてSPLがアップデートしていたが…

2022年にHALライブラリじゃなくて古のStandardPeripheralLibraryが
アップデートしていたようです
…内容は…


余計なことするな〜〜!
GPIOのレジスタ周りは致命的だったのでここだけ元に戻してアップデート
いたしました…


●ILI9341をシリアル接続で動かした際にDeviceIDを読み出す方法
10年前に一度記事を書きましたが10年の時を超えて皆忘れてしまってる
ようなので改めて詳しく解説しようと思います。

ILI9340,ILI9341,ILI9342のILITEK製のTFT-LCDコントローラはDeviceID
をそれぞれ持っておりそれらの読み出しコマンドは"0xD3"を使用します。


尤もi8080などのパラレルなデータバスの読出しはデータシートの
通りに従えば期待していたDeviceID(ILI9341なら0x9341)を読み出す
ことができます。しかし、SPI(以下シリアル)バス接続の場合は何故か
この通りにやっても絶対に読み出すことはできません。

これについては10年以上前から様々なコミュニティで話題が上がって
おりますがシリアル接続では独特の手順をもってしないと読みだす
ことができません。

ILI934x系のコントローラはシリアル接続でレジスタの値を読み出す
ためにはデータシート未記載の"undocumented"なレジスタにアクセス
する必要があります。それがRegisterReadIndex(0xD9)です!

使い方は以下の通りです。ReadID4コマンド(0xD3)を実行してシリアル
接続でDeviceIDを読み出す手順です。

/**************************************************************************/
/*!
Read ID ILI934x.
*/
/**************************************************************************/
static uint16_t ILI934x_rd_id(uint8_t cmd)
{
uint16_t val;
uint16_t temp;

ILI934x_wr_cmd(0xD9); /* SPI Register Read Command */
ILI934x_wr_dat(0x10); /* Read Mode Enable,1st Byte */
temp = ILI934x_rd_cmd(cmd); /* Dummy Read */

ILI934x_wr_cmd(0xD9); /* SPI Register Read Command */
ILI934x_wr_dat(0x11); /* Read Mode Enable,2nd Byte */
temp = ILI934x_rd_cmd(cmd); /* Dummy Read */

ILI934x_wr_cmd(0xD9); /* SPI Register Read Command */
ILI934x_wr_dat(0x12); /* Read Mode Enable,3rd Byte */
temp = ILI934x_rd_cmd(cmd); /* Upper Read */

ILI934x_wr_cmd(0xD9); /* SPI Register Read Command */
ILI934x_wr_dat(0x13); /* Read Mode Enable,4th Byte */
val = ILI934x_rd_cmd(cmd); /* Lower Read */

val &= 0x00FF;
val |= (uint16_t)temp<<8;

return val;
}
☝こんな感じでインデックスを一つずつ指定して読みだしていきます。
 このようなかんじでシリアル接続でもDeviceIDを読みだせます。


なんでデータシート未記載なんだYO!とお思いの方もいらっしゃる
でしょうが、実は近年にリニューアルされたデータシートにはちゃんと
記載されてやがったりします。これはILI9342"C"のデータシートです。
もちろんILI9342無印では記述がありませんでした。


また、同様のアクセス方法としてはILI9486Lも同機能のコマンドが存在
しております。てか"DGAMCTRL (Digital Gamma Control 2)"とかなってて
でたらめでめっちゃ適当ですね…


さらに今年判明した衝撃の事実ですが128x128サイズを主にサポートする
ILI9163系のコントローラも0xD9を実行すると不可能だと思われていた
シリアル接続のDeviceIDを読み出し可能なことを確認しました!!
ソースコードに上記のように反映しております!

という感じで定期的に持ち上がるILI934x系のネタですがシリアル接続で
この液晶を使うシーンが極めて多いので情報としてしっかり残して
おこうと思います!
最も昨今はST7789Vx一族にだいぶ押されておりますがー!

これらの成果物は主におきぱにあるSTM32F4のFatFs移植作例に収蔵
されております。プロジェクトの下記ドライバを参照してください。
./lib/display/drivers/src/ili934x.c(ILI9342を除く)
./lib/display/drivers/src/ili9342.c
./lib/display/drivers/src/ili9481.c
./lib/display/drivers/src/ili9163x.c

●新液晶モジュール続々登場!
液晶モジュールつながりでもう一件です。


超久しぶりですがこの前ST7789V2にも対応したついでに新たに買った
中華TFT液晶モジュールをいくつか紹介させていただきます。


こちらはなななんと5inchで540x960pixelでi8080データバス対応という
今までで最大サイズの液晶モジュールです!!!!!
コントローラはNT35516という品種です。
480x854が今までの最大サイズだったので大進化ですね〜


で、動かそうとすると結構癖があった…
データバスが外来ノイズに弱くてすぐ崩れるのでねむいさんのいつもの
に合わせるのに結構苦労しましたがなんとか安定動作できるように
なりました。それにしても540x960は広すぎる…


ついに(叢雲のコスプレをした)いないさんの全身が見切れせずに
表現できるように!!やった!!

とはいえ静電性タッチパネルが装着されたモデルがまだAliexpressに
登場してないのでメインで使用する段階ではないです…

やっぱしILI9806Gなこいつが一番使いやすいですね…!



お次はHX8363Bをコントローラに持つ3.97inch,480x800な現在では
定番サイズの液晶です。こちらもタッチパネルなしです。
ていうかなんなんだ真ん中のシールは。

このコントローラはちょっと癖があって8/16bitのインターフェース
を決定する設定は外部に出るピンではなくレジスタに入れる値で決定
します。これ10年以上前に使用したS1D19122に似てますね〜


動かしたところです。
まぁ可もなく不可もなくといったところですね〜

やっぱしILI9806Gなこいつが一番使いや(r



こちらはR61408が使用された3.97inch,480x800のものです。
FT5216の容量性タッチパネルコントローラがついたタッチパネル
つきになっております☆


最近に販売されている中華液晶の下駄基板はパタンでお絵描きしたりが
なくなって殺風景なのでちょっと寂しいですね…一応RGB/8bit/16bit
そしてI2Cまで使用可能です。R61408のシールは私が貼りました。


動かしたところ。
かなり発色が良いですね〜

でもやっぱしILI9806Gなこい(ry




んでもって10年くらいまえのりべんぢですがNT35510のまともな奴が
手に入りましたので動かしてみました。
サイズは定番の3.97inch,480x800です。


こちらも発色がなかなかでした…以前はまともに表示できなかったので
10年越しにりべんぢできたかんじですね…!



最後にRM68180が使用された3.97inch,480x800のモジュールです。
FPCコネクタ接続でインターフェースは8bitという速度的に苦しい
ものですがはてさて


かなり苦労しましたが何とか表示できるようになりました。
RM68120のコードとほぼ同じなのでrm68120.cと同居しました。




というわけで最近久しぶりに入手したTFT液晶モジュールを一気に
紹介しましたが現時点では使いやすさ、安定性、表示領域の面を
鑑みるとILI9806Gなこいつが鉄板と言わざるを得ませんね。

NT35516のやつがもうちょっと頑張ってくれたらよいのですが、
これから先も当分の間はILI9806G使ったやつのお世話になりそうです。

Go to top of page