XIAO RP2040のI2C悪戦苦闘の記

記事
IT・テクノロジー
表記Seeed XIAO RP2040(以下XIAO2040と表記)のI2C Master - Slave通信がうまく動かずに苦労しました。Master-Slaveが駄目というよりも、Wire1が駄目です。

テストには「TalkingToMyself」を使っています。マイコン1台で2組のI2Cを使い片方をマスター他方をスレーブとして通信するやつです。ボード設定はPhilhower版Arduinoを使っています。

まだ完全に切り分けができていないのですが、ボード設定としてSeeed XIAO RP2040を使うとうまくいきません。

以下、とりあえず動かす方法です。XIAO2040固有の機能は使えなくなるかもしれませんが、ボードとしてRaspberry Pi Picoを指定して、以下のピン番号に置き換えて使用してください。たとえば、I2C0がアサインされたGPIO0, GPIO1を使うならば、D6 = 0u, D7 = 1uと記載されているので、Wire.setSDA(0); Wire.setSCL(1);と記述し実際の配線はD6とD7を使います。

スクリーンショット 2022-07-13 22.50.52.png

なんでこんなややこしいことをしてるんでしょうね。実際、XIAO2040を選んで Serial.println(D6);を実行すると0が出力されます。つまり、他のArduinoのつもりでdigitalWrite(6)って書いても駄目でLチカですらうまく動かないんですよね……。

もう一つ、WireにはI2C0、Wire1にはI2C1に属するGPIOピンを指定してください。

PR2040のI2Cは、I2C0とI2C1の2つのグループがあります。Pi Picoなどのpinoutを見るとI2C0で使えるピンとI2C1で使えるピンとにわかれています。WireにI2C0をアサインするとWire1にはI2C0をアサインできません。アサインするとがっつりフリーズしてシリアル見えないし書き込みもできなくなります(BOOTSEL押しながらリセット押し離し)。

ついでに、SDAにSCLをアサインしても同様にフリーズします(ハマりました)。

そんなわけで、Arduinoのボード設定としてSeeed XIAO PR2040を選んだ場合に二組目のI2C、Wire1を使う方法はまだわかっていないのですが、とりあえずXIAO RP2040でもRaspberry Pi Picoをボードとして選んで、GPIO番号をアサインしなおせば対応できます。

そのうち時間ができたら上記問題を追いかけてみたいと思います。でも、現在ココナラ案件1ヶ月待ち状態なので、いつになることやら……。

ご拝読ありがとうございました! 

マイコンに関する技術相談、ガジェットを作りたい方のご相談と実際の製作(試作から量産まで)、はんだ付けなどお請けしておりますので、お気軽にご相談ください(CM
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す