ESP32のGPIOのバグ

ESP32でパラレル接続のTFT LCDに表示を行おうと、既存のライブラリを参考にプログラムを書き、大体動くようになったのだが、なんか変。変な点が描画される。(右上の写真参照)

怪しいところはたくさんある。自分のコードも怪しいし、LCDは使用実績はあるものの、結構古いものなので怪しいし、esp32-arduinoもesp-idfも日々更新されていて怪しい。電源ラインも怪しい。オシロスコープを駆使し、しつこく調べると WRパルスが出ているタイミングでCSがHighになっている状況を発見。WR信号もCS信号もGPIOで操作している。これは、プログラムのミスではありえない。

この現象が、ちょうど1mS毎、割り込み処理後に起こっているように見えるので、割り込み処理にバグか。ちなみに、自分では割り込みを使っていない。システムの割り込み処理のソースコードを探すが、見つけ出すことができない。

どうしようか、途方にくれるが、問題のタイミング以外でもCS信号がプログラム通り変化しないことに気が付き、いろいろ試すとタイミングをずらしたり、GPIOのレジスタに2度書きしたりすることで、プログラム通りに動くこともあることがわかって来た。

ここでやっと、ESP32のエラッタを見る。なんか3.3. When the CPU accesses peripherals and writes one address repeatedly, random data loss occursというのが該当しそうだ。回避策を試すと、問題は解消した。詳しくはQiitaの方に書いた。

正常動作したLCDの表示

このバグ、GPIOを操作していると、ランダムにデータの欠落、つまり変化させたはずが変化しないというバグ。発生のタイミングがランダムなのがいやらしい。またエラッタに引っかかってしまった。新しいチップを使う際は最初に熟読すべきだ。

Leave a Reply

メールアドレスが公開されることはありません。