PIOのI2Cについて例題を確認したいと思います。
PIOのI2Cの例題は、I2Cバスをスキャンして、接続されているデバイスを確認することができます。
I2Cのスキャンに対して該当するデバイスのアドレスが返ってきます。
今回は、以前から使用しているキャラクタLCDの「KKHMF DC 5V 1602 LCD ディスプレイモジュール 16×2キャラクタ LCDブルーブラックライト」と「EasyWordMall 1602 LCD ブラック IIC/I2C/TWI/SPI シリアル インタフェース ボード モジュール」(ともにamazonです)を使用します。
キャラクターLCDは今回5Vのものを使用するので「I2Cバス用双方向電圧レベル変換モジュルAE-FXMA2102(秋月電子)」で3.3Vから5Vにレベル変換しています。
ターゲット用PicoにはOpenOCD用Picoを接続し、I2Cデバイスとして前述のキャラクターLCDを接続します。
pico-examplesのbuild/pio/i2cの移動してmakeします。
$ cd ${PICO_SDK_PATH}/../pico-examples
$ cd build/pio/i2c
$ make
OpenOCD(SWD経由)で書き込みデバックするので、OpenOCD用picoをターゲット用picoに接続し、RaspberryPiにUSBで接続しておきます。
端末を1つ開き、OpenOCDを起動します。
$ cd ${PICO_SDK_PATH}/../openocd
$ src/openocd -f interface/picoprobe.cfg -f target/rp2040.cfg -s tcl
「Info : Listening on port 3333 for gdb connections」が最後に表示されたら端末を最小化しておきます。
シリアル通信用のminicomを新規の端末で開きます。
minicomがインストールされていない場合は「$ sudo apt-get install minicom」でインストールします。
$ minicom -b 115200 -o -D /dev/ttyACM0
minicomの端末は開いたままにします。
gdbのための端末を開きます。端末は開いたままにします。
$ cd ${PICO_SDK_PATH}/../pico-examples
$ cd build/pio/i2c
$ gdb-multiarch pio_i2c_bus_scan.elf
gdbで最初にOpenOCDに接続します。
(gdb) target remote localhost:3333
実行ファイルを読み込みます。
(gdb) load
picoをリセットし、実行します。
(gdb) monitor reset init
(gdb) c
minicomの端末に下記のような表示が出ればOKです
PIO I2C Bus Scan
0 1 2 3 4 5 6 7 8 9 A B C D E F
00 . . . . . . . . . . . . . . . .
10 . . . . . . . . . . . . . . . .
20 . . . . . . . @ . . . . . . . .
30 . . . . . . . . . . . . . . . .
40 . . . . . . . . . . . . . . . .
50 . . . . . . . . . . . . . . . .
60 . . . . . . . . . . . . . . . .
70 . . . . . . . . . . . . . . . .
Done.
I2CバスのキャラクターLCDのスキャン結果は「0x27」となりました。
次回は実際にキャラクタLCDに表示をさせたいと思います。