0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RP2040のSPIにILI9341を繋ぎGDBでのデバッグとSPIの罠

0
Posted at

経緯

 宝箱(ガラクタ箱かな)を漁ったら動作不詳の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

  表示結果とデバッグ接続
disp.jpg

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デバッグの簡単な説明

 配線を行いコンパイル(アイコン左のレ)を行えば準備完了。
 止めたい部分にブレークポイントを設定しておく。
  ※行番号表示の左側をクリックして、赤丸を表示させる。
 デバッグ(アイコン右の虫)を押すとデバッグスタート。

gdb_ctrl.jpg

 左上にデバッグ用アイコン類が表示される。
 そして、ブレークポイントで停止する。
  ※行の背景が薄くグレーになっている。
 後は、続行、ステップオーバー/イン/アウトを駆使して、確認したい位置まで持って行く。
 その場で変数の値が見たい場合は、ウォッチ式を選択し+を押し、変数名を書込む。
  ※変数をなぞっても表示はされない様だ。
 最初からやり直したい場合は、停止(□)を押した後にデバッグの開始(横三角)を押す。
  ※デバッグの開始を2回押すとエラーになるぞ。
ソフトライブラリはデバッグ可能だが、ボードライブラリが不可なのは仕様のようだ。
  ※やり方は有る様だが、面倒くさそう。

感想

 GDBを使う場合はVSCodeなんかを使うのが定番なんだろうけど、
 細かい設定が今一判らん部分もあり、普段はArduinoを使って居る。
 上手く動けば従来(Arduino)環境で、お手軽にデバッグが出来てしまう。
 自分の書いた部分は無くてもどうにかなるが、其れ以外は有ると凄く便利。
 之でコンパイルが早けりゃ、言う事ないんだけど。
 なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?