RaspberryPi

Raspberry PiでSPI1/CE#2を使う(+起動が遅くなる問題を回避する)

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
300px-Pi-GPIO-header.png

ただし,単に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.txtconsole=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カードの内容を書き換えます.

  1. 諦めて電源を切りましょう(データがぶっ壊れないことを祈りながら).
  2. カードリーダ,スマートフォン,カメラなどで,どうにかmicroSDカードを読み書きできる環境を整えます.
  3. cmdline.txtやconfig.txtを編集しましょう./boot領域はFATなので,Windowsからも見えます.

検証環境

  • Raspberry Pi 3 Model B / Raspbian Jessie (8.0) / Linux kernel 4.4.50-v7+

参考資料