Posted at

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

More than 1 year has passed since last update.

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+


参考資料