経緯
宝箱(ガラクタ箱かな)を漁ったら動作不詳のILI9341が出て来た。
3V動作だという事で、手持ちのRP2040に接続。
ソフトSPIでは簡単に動作したが、動作がとろい。
ハードSPIにしたら、う…動かない。
◆◆◆ 何でだよー ◆◆◆
GDBまで持ち出して原因究明作業。
動いたが、原因はあらぬところに。
界隈では常識なのかも知れないが、同じ罠に掛らないように書いとく。
不動作の原因
不動作の原因は、Adafruit_ILI9341ライブラリに有った。
下記にライブラリの一部を掲載するが、
SPIClassを指定した場合、csとdcの位置が通常と逆転する。
※Sampleには注意は書かれていない…。
※他のライブラリでは逆転なんかして無いし。
/**************************************************************************/
Adafruit_ILI9341::Adafruit_ILI9341(int8_t cs, int8_t dc, int8_t mosi,
int8_t sclk, int8_t rst, int8_t miso)
: Adafruit_SPITFT(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT, cs, dc, mosi, sclk,
rst, miso) {}
/**************************************************************************/
Adafruit_ILI9341::Adafruit_ILI9341(SPIClass *spiClass, int8_t dc, int8_t cs,
int8_t rst)
: Adafruit_SPITFT(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT, spiClass, cs, dc,
rst) {}
#endif // end !ESP8266
/**************************************************************************/
※GDBでトレースして、初めて罠に気が付いた。
別にAdafruitが悪いわけでは無く、不用意に使った方が悪いのだろうが…。
グーグルさんはあるあるの話だと言うが、判ってんなら先に教えて呉れよ…。
動作確認した接続
ターゲットハードはRP2040-ZERO基板(の多分バチモノ)。
配線は下記の通り
※GND及びVCC(3.3V)とLED(3.3V)も当然接続要だよ。
ピン配置の変更は比較的自由だが、MOSIとSCKは制約が有りそう。
※Adafruit_ILI9341のexampleの定義部を下記の例の様に書けば動く。
tft.begin()で動作周波数無指定で24MHz動作、かなり早い。
※此処に30M(30000000)を指定すると、もう少し早くなる。
下記の//HARD行をコメにし、//SOFT行を生かせばSOFTSPI動作となる。
※速度が800KHz程度と下がり凄く遅く感じる。
#define TFT_CS 26 // CS
#define TFT_RST 28 // Reset
#define TFT_DC 29 // D/C
#define TFT_MOSI 15 // SDI(MOSI)
#define TFT_SCK 14 // SCK
// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// If using the breakout, change pins as desired
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
Adafruit_ILI9341 tft = Adafruit_ILI9341( &SPI1, TFT_DC, TFT_CS, TFT_RST); // HARD
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCK, TFT_RST, -1); // SOFT
GDB接続の方法
原因究明の為にデバッグ環境を構築する。
デバッグにはdebugprobeuなるハードが必要となる。
※デバッグ対象とdebugprobeuの2つのrp2040が必要。
ボートを2つ持つESP32なら、一台二役が出来たが。
※debugprobeuは市販もされている。(秋〇など)
rp2040-zeroをdebugprobeuに、rp2040-picoをデバッグ対象とする。
※rp2040-zeroはデバッグ端子を出していないから。
※zeroとpicoは同じcpuチップが乗っているから。
rp2040-zeroにdebugprobe_on_pico.uf2を入れればdebugprobeに化ける。
※デバイスマネージャーで、ユニバーサルシリアルバスデバイスにCMSIS-DAPがいたなら成功
※rp2040-zero専用のuf2も有るが、コンパイルを試みたが失敗した。
デバッグ接続は下記となる。
zero pico
2 SWCLK
3 SWDIO
GDBデバッグの簡単な説明
配線を行いコンパイル(アイコン左のレ)を行えば準備完了。
止めたい部分にブレークポイントを設定しておく。
※行番号表示の左側をクリックして、赤丸を表示させる。
デバッグ(アイコン右の虫)を押すとデバッグスタート。
左上にデバッグ用アイコン類が表示される。
そして、ブレークポイントで停止する。
※行の背景が薄くグレーになっている。
後は、続行、ステップオーバー/イン/アウトを駆使して、確認したい位置まで持って行く。
その場で変数の値が見たい場合は、ウォッチ式を選択し+を押し、変数名を書込む。
※変数をなぞっても表示はされない様だ。
最初からやり直したい場合は、停止(□)を押した後にデバッグの開始(横三角)を押す。
※デバッグの開始を2回押すとエラーになるぞ。
ソフトライブラリはデバッグ可能だが、ボードライブラリが不可なのは仕様のようだ。
※やり方は有る様だが、面倒くさそう。
感想
GDBを使う場合はVSCodeなんかを使うのが定番なんだろうけど、
細かい設定が今一判らん部分もあり、普段はArduinoを使って居る。
上手く動けば従来(Arduino)環境で、お手軽にデバッグが出来てしまう。
自分の書いた部分は無くてもどうにかなるが、其れ以外は有ると凄く便利。
之でコンパイルが早けりゃ、言う事ないんだけど。
なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。

