LoginSignup
10
3

More than 3 years have passed since last update.

Raspberry Pi 4BでI2C、SPIを使用する際の覚書

Last updated at Posted at 2021-01-20

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が必要になるっぽいです。まだ動作確認できていないので確認でき次第アップ予定です。

10
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
3