前回はUARTでした。今回はI2Cです。今回も前回と同じようなことを書きます。RP2040でもRP2350でも搭載しているユニット数は2個。前回同様に微妙な相違です。その差は前回よりも小さいです。前回はまだRP2040で使えなかった端子がRP2350では使えるとか御利益があったですが、今回はフツーにしてたら何もない?
※Pico関係投稿一覧は こちら 『Pico三昧』は一覧の末尾付近にひっそりと。
※Raspberry Pi Pico、Raspberry Pi Pico2のデータシートは、以下からダウンロードできます。
搭載しているユニット数は2個だが。
前回のUARTも今回のI2Cも、RP2040、RP2350ともに搭載している「ハードウエア」ユニット数は2です。しかしRP2040、RP2350ともにユニークなIO回路、PIO(Programmable IO)を搭載してます。コイツらのステートマシンをプログラムすればI2Cなどお手の物ではないかと思われます。つまり足りなかったら「作れる」というこってす。
IPはSynopsys製
Synopsys社といえば、論理合成ツールを代表に業界をリードしつづけてきたEDAツールベンダーです。ほとんどの半導体会社が何等かの形でお世話になっているのではないかと。製品も立派だが、お値段も立派だ?知らんけど。
さて、RP2040とRP2350ともにI2C回路は、Synopsys Design Wareというシリーズ?のIPが採用されてるようです。Design Wareといえば、IPライブラリ・ビジネスの老舗的存在。泣く子も黙る?
さてRP2040とRP2350で採用されているバージョンは以下のようです。
-
- RP2040、DW_apb_i2c (v2.01)
- RP2350、DW_apb_i2c (v2.03a)
微妙にバージョンは違ってます。しかし、I2Cのレジスタ値を制御するために使われる、SDKの I2C.h ヘッダをみると共通のヘッダ一本。とくにチップによって切り替えているような記述も見当たりません。微妙なバージョンの違いで特にどうこうする必要はないのではないかと思います(個人の感想です。)
Pico関係の過去回でI2Cを使ってみていたものは以下の2回です。
MicroPython的午睡(17) ラズパイPico、I2CでシリアルEEPROM接続
鳥なき里のマイコン屋(138) ラズパイPico、外付けDAC、MCP4725接続
僅かな差異は2点
以下の2点の差異は存在しますが、まず気になることはないのではないかと。
メモリ・マップされたアドレスの違い。
-
- RP2040、I2C0が 0x40044000、I2C1が 0x40048000
- RP2350、I2C0が 0x40090000、I2C1が 0x40098000
通常SDKを使ってI2C0_BASEみたいな呼びだし方をしている分には意識する必要のない差だと思います。アドレスをハードコードするような無作法をしているときには要注意。
GPIO bank 1でもI2Cが使えるRP2350。
GPIO でもbank 1 は、Pico/Pico2のボード端子にGPIOとして出ている端子ではなく、FlashインタフェースおよびUSB(RP2350のみGPIO設定あり)の専用端子として使われている端子どもです。それらの機能を「使わない」ときにGPIOに変更して使う機能が設定されているのです。RP2040ではGPIO bank1の使用時、単純なGPIOとしては使えますがI2Cの割り当てはできません。一方、RP2350ではI2Cの割り当てが可能。
RP2350をチップで購入して自前のボード作るならともかく、Pico/Pico2ボード使っている分にはゼッテー使わないような。。。