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

#0.初めに
RPiは4から始めたにわかなので、初心者向けの覚書です。
今回は、SPIやI2Cでなるべくたくさんのセンサー君たちから情報を集めたいというニーズから、複数のSPIやI2Cを利用しようとしたところ、追加されたBusの使い方が良くわからず悩んだ結果をまとめています。
特にSPIは公式ドキュメントやREADMEには書かれていない（見つけられていない？）使用制限もあるのでちょいハマりしました。
超初心者向け内容ですので[SPI有効化の際の縛り](#2spi) のみ抑えていただければ良いかと思います。

#1.I2C
RPi4Bでは/boot/overlays/READMEによるとI2C1,3,4,5,6の5本のBusを利用できます。
こちらの[サイト](https://www.denshi.club/pc/raspi/raspberry-pi-os-1-i2c.html)でも言及されていますが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
参考にした公式ドキュメントは[こちら](https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md)です。
素直な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 <overlay>
※使えるオーバーレイは/boot/overlaysを参照。

###3-5.ロードされたオーバーレイのリスト表示
dtoverlay -l

###3-6.ロードしたオーバーレイを指定して削除する
sudo dtoverlay -r [<overlay>]
<overlay>は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できない問題があるらしいので](https://www2.denshi.numazu-ct.ac.jp/mirsdoc2/mirsmg4d/syst/num0012a/index.html)、実際の通信を行う際には使用するPINによっては外部でpull upが必要になるっぽいです。まだ動作確認できていないので確認でき次第アップ予定です。