シリアル3兄弟「UART、I2C、SPI」の末尾を飾る?今回はSPIです。同期式全二重(半二重のMicrowireプロトコルにも対応)のSPIです。前2者よりも高速化容易。搭載ユニット数は2個、Arm社PrimeCellのIP搭載とRP2040とRP2350の差は無いように見えます。でもま、コマケー差はありーの。
※Pico関係投稿一覧は こちら 『Pico三昧』は一覧の末尾付近にひっそりと。
※Raspberry Pi Pico、Raspberry Pi Pico2のデータシートは、以下からダウンロードできます。
UART、I2C、SPI
呼吸をするようにシリアルポートを使い分けているお兄さんお姉さん方には不要ですが、ざっくりまとめとくとこんな感じっす。
-
- UART、非同期式(同期の為のクロック信号は存在しない、通信する装置の内部で最初のタイミング「スタート」から各自生成する必要がある。よってクロック信号の誤差によっては通信エラーが出るので、高速化は各自のクロックの品質による)。TX(送信)、RX(受信)独立な全二重通信可能。半二重も可。
- I2C、ホストとスレーブの区別あり。ホストが同期のためのクロックをスレーブに配る。一本のデータ線上に、通信先のスレーブアドレスとデータの両方を載せられるので、クロック線とデータ線のたった2本で多数のスレーブとの通信が可能。半二重通信の上、スレーブアドレスの通信などオーバヘッドもあるので高速化はしずらい。
- SPI、同期式。ホストとスレーブの区別あり。TXとRXが独立なので全二重通信可能。また複数スレーブを使用する場合にはチップセレクト信号による指定なのでI2Cのようなオーバヘッドはない(その代わり信号線数増大。)
Arm PrimeCell SPI (PL022)
PicoもPico2も、Arm社のPrimeCellというIPシリーズの中のIPを搭載しています。バージョンまで同じね。
Arm PrimeCell SPI (PL022) (Revision r1p4)
Arm社のドキュメントページが以下に。
https://developer.arm.com/documentation/ddi0194/latest
Pico系の過去回でSPIを実際に使ってみた回を探したら、1回しかなかったです。
MicroPython的午睡(18) ラズパイPico、SPIでシリアルSRAM接続
RP2040とRP2350のSPIの微妙な違い
さて本題のRP2040とRP2350の違いは以下です。
SPI | RP2040 | RP2350 |
---|---|---|
SPI0 base address | 0x4003C000 | 0x40080000 |
SPI1 base address | 0x40040000 | 0x40088000 |
Tristate control(TX) in slave mode | Software | Hardware(Software) |
まずは例によって、PicoのRP2040とPico2のRP2350ではメモリマップドアドレスのアドレスが異なります。お作法に則ってSDKで定義された文字列でアクセスしている分には問題にならん差です。ハードコードしている無法な輩?のみ影響ありっと。
今回のSPIでは、UARTやI2Cで微妙な差が見えていたGPIO端子の割り当てでは特段の差はありません(RP2350の80ピン対応を除く。)SPIに関してはPicoもPico2も端子の割り当ては同じっす。
唯一微妙にRP2350が改良されているのは以下の場合です。
-
- SPIをスレーブモードで使っている
- 複数スレーブを同じインタフェースに併設している
上記のような場合、SPIのTX端子を自分の通信時には駆動し、それ以外の時は他のスレーブのお邪魔にならないようにトライステート(ハイインピーダンス)にしておかねばなりません。RP2040ではソフトウエアでトライステートON/OFFの制御をせにゃならんようですが、RP2350では自分が出力イネーブルだと思うと勝手にONしてくれる(出力イネーブル切れればOFFになる筈)みたいです。勿論、ソフトで開け閉めしてもハードと矛盾しなければOKかと。確かに改良されとるけど、そういうケースを使いたい人だけね、御利益ありそうなのは。