40ピンあるRaspberry Pi(Model A+/B+/2B/3B/Zero/Zero W)は,SPIが2系統備わっています.GPIO16/19/20/21が2系統目のSPI1です.
RPi Low-level peripherals - eLinux.org
ただし,単にSPIを有効にしただけでは,下記の通りSPI1は使えません.
>>> import spidev
>>> spi = spidev.SpiDev()
>>> spi.open(1,2) # SPI1,CE#2を使おうとする
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory
$ ls /dev/spi*
/dev/spidev0.0 /dev/spidev0.1
(spidev1.*がない...)
設定ファイルを書き換えると有効化できるのですが,バージョンによっては起動がめちゃくちゃ遅くなることがあるため,回避策も一緒に設定しておかないと悲しいことになります.
手順1. SPI1の有効化
SPI1を有効にするには, /boot/config.txt
に下記を追加します.
dtoverlay=spi1-3cs
ただし,そのまま再起動してはいけません.
手順2. シリアルコンソールかBluetoothを無効化
SPI1,シリアルコンソール(UART),Bluetoothでリソースが競合するようです.無効化はどちらかで構いません.
シリアルコンソールを無効化
/boot/cmdline.txt
の console=ttyAMA0,115200
(またはconsole=serial0,115200
) を削除します.
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait fbcon=map:10 fbcon=font:ProFont6x11 logo.nologo
Bluetoothを無効化 (Raspberry Pi 3 Model B/Zero Wのみ)
/boot/config.txt
に下記を追加します.
dtoverlay=pi3-disable-bt
手順3. 再起動してSPI1を使う
これで設定は完了です.再起動すると,SPI1が使用可能になっているはずです.
$ ls /dev/spi*
/dev/spidev0.0 /dev/spidev0.1 /dev/spidev1.0 /dev/spidev1.1 /dev/spidev1.2
>>> import spidev
>>> spi = spidev.SpiDev()
>>> spi.open(1,2) # エラーにならない
>>>
もしも起動が遅くなってしまった場合…
私の場合は30分経っても起動が終わらず,SSHも繋がりませんでした.
この場合,Raspberry Pi以外のデバイスで,microSDカードの内容を書き換えます.
- 諦めて電源を切りましょう(データがぶっ壊れないことを祈りながら).
- カードリーダ,スマートフォン,カメラなどで,どうにかmicroSDカードを読み書きできる環境を整えます.
- cmdline.txtやconfig.txtを編集しましょう./boot領域はFATなので,Windowsからも見えます.
検証環境
- Raspberry Pi 3 Model B / Raspbian Jessie (8.0) / Linux kernel 4.4.50-v7+