0.初めに
RPiは4から始めたにわかなので、初心者向けの覚書です。
今回は、SPIやI2Cでなるべくたくさんのセンサー君たちから情報を集めたいというニーズから、複数のSPIやI2Cを利用しようとしたところ、追加されたBusの使い方が良くわからず悩んだ結果をまとめています。
特にSPIは公式ドキュメントやREADMEには書かれていない(見つけられていない?)使用制限もあるのでちょいハマりしました。
超初心者向け内容ですのでSPI有効化の際の縛り のみ抑えていただければ良いかと思います。
1.I2C
RPi4Bでは/boot/overlays/READMEによるとI2C1,3,4,5,6の5本のBusを利用できます。
こちらのサイトでも言及されていますがI2C0というBusもありますが、使用するGPIOに競合する機能があるので使用を避けた方が無難な様です。
I2Cの有効化
I2Cを有効化する方法は(私の知る限り)次の4つがあります。
1-1.applications menuから有効化する
applications menuから有効化する際には、
「applications menu」>「設定」>「Raspberry Piの設定」>「インターフェイス」タブ
を開きI2Cのラジオボタンを「有効」にして「OK」を選択します。
RPiをリブートすれば有効化されます。
1-2.raspi-configから有効化
LXterminalを開いて、
sudo raspi-config
でメニューが立ち上がりますので、
「3.Interface Options」>「P5 I2C」> 「はい」 > 「了解」 > 「Finish」
を選択します。
RPiをリブートすれば有効化されます。
1-3.config.txtを変更する
/boot/config.txtを次の行の先頭の#を消して保存しリブートするとI2Cが有効化されます。
# dtparam=i2c_arm=on
上のメニューを実行した際も、同様の操作がされています。
dtparamを変更した際は、I2C1のBusが有効化されます。
また、dtparamはコメントアウトしたままで、dtoverlayを行うと任意のBusを有効化できます。
任意のBusを有効化する際には、/config.txtに次の行を加えます。
dtoverlay=i2c1
上の例ではBus#1を有効化していますが、最後の数字を1,3,4,5,6に変化させると、任意のBusが有効化されます。
5本とも有効化させることもできます。
また、SDAやSCLのピン割り当てを変更することもできます。
例えばBus#3はデフォルトでSDAにGPIO4、SCLにGPIO5が割り当てられていますが、それぞれGPIO2、3に変更できます。変更先のGPIOピンは決まっていますので、/boot/overlays/READMEを参照してください。
変更するにはconfig.txtの定義を次の様にします。
dtoverlay=i2c3,pins_2_3
1-4terminalから有効化する
LXterminalを開いて以下のコマンドで有効化します。
sudo dtoverlay /boot/overlays/i2c3.dtbo
これはBus#3を有効化する際ですが、任意のBusを選択可能です。
また使用するピンを変更する際には次の通りパラメータを追加します。
sudo dtovdrlay /boot/overlays/i2c3.dtbo pins_2_3
2.SPI
参考にした公式ドキュメントはこちらです。
素直なI2CにくらべてSPIは少々癖があって苦労しました。
SPIは#0,1,3,4,5,6の6本のBusが使用できます。
公式には説明が見つけられませんでしたが、SPI有効化の際には以下の縛りが発生するようです。
SPI有効化の際の縛り
①同時に有効化できるBusは4本まで
②Bus #0,1は任意に有効化/無効化が可能
③Bus #3,4,5,6はどのBusを指定してもBus #3→4→5→6の順に有効化される。
④5番目以降にロードしたBusは有効化されないが、1~4番目にロードしたBusを消去した時点で有効化される。
SPIの有効化
SPIの有効化もI2Cとほぼ同じです。
2-1.application menuから有効化する
I2Cと同様なのでで割愛
2-2.raspi-configから有効化
こちらもI2Cと同様なので割愛
2-3.config.txtを変更する
/boot/config.txtを次の行の先頭の#を消して保存しリブートするとSPIが有効化されます。
# dtparam=spi=on
上のメニューを実行した際も、同様の操作がされています。
dtparamを変更した際は、spi0のBusが有効化されます。
(正確にはspi0-2csと同じ)
また、dtparamはコメントアウトしたままで、dtoverlayを行うと任意のBusを有効化できます。
任意のBusを有効化する際には、/config.txtに次の行を加えます。
ただし、先にも述べた通り、Bus#3以降を指定した場合、指定したBusによらず#3から順に最大4本まで有効化されます。
dtoverlay=spi0-2cs
spi0の"0"はBusの番号を指示しています。
後半の2CSの部分はSPI通信を使用する際にそのBusにぶら下げるデバイスの数により変更します。
Bus #0,3,4,5,6は最大2台のデバイスを制御できますので、1台の場合には"1cs"、2台の場合は"2cs"とします。
Bus #1は3台接続可能ですので1cs~3csが選択できます。
また、使用するデバイスを指定する信号にCE0~CE2というピンを割り当てますがこのピンを変更することも可能です。
dtoverlay=spi0-2cs,cs0_pin=13 cs1_pin=14
この例ではBus #0のSPIを有効化し、CE0,1ピンをそれぞれGPIO13,14に変更しています。(デフォルトではGPIO8,7)
こちらのデフォルトピン設定や使えるBusの説明も/boot/overlays/READMEを参照して下さい。
2-4.terminalから有効化する
LXterminalを開いて以下のコマンドで有効化します。
sudo dtoverlay /boot/overlays/spi3-2cs.dtbo
また使用するピンを変更する際には次の通りパラメータを追加します。
sudo dtovdrlay /boot/overlays/spi3-2cs.dtbo cs0_pin=12 cs1_pin=13
3.使うコマンドとかファイルまとめ
3-1.application menuで有効化
application menu>設定>Raspberry Piの設定>インターフェイス
SPI及びI2Cの有効にチェック
3-2.raspi-config
LXterminalを開いて
sudo raspi-config
3-3.設定ファイル
/boot/config.txt
3-4.手動でオーバーレイをロードする
sudo dtoverlay
※使えるオーバーレイは/boot/overlaysを参照。
3-5.ロードされたオーバーレイのリスト表示
dtoverlay -l
3-6.ロードしたオーバーレイを指定して削除する
sudo dtoverlay -r []
はdtoverlay -lのリスト表記に従う
3-7.ロードしたオーバーレイをすべて削除する
sudo dtoverlay -R
3-8.有効化されたデバイスの確認
ls /dev
「spidev3.0」、「i2c1」等
3-9.オーバーレイ可能なモジュールたち
/boot/overlays
3-10.オーバーレイのマニュアル
/boot/overlays/README
4.pull upについて
RPi4のGPIOは一部しかpull upできない問題があるらしいので、実際の通信を行う際には使用するPINによっては外部でpull upが必要になるっぽいです。まだ動作確認できていないので確認でき次第アップ予定です。