Raspberry PiでSPI1の系統を追加で有効化して設定する方法調べたのでまとめ

複数系統のSPIを利用したい状況になったので調べました。

GPIOピンマップ

参照するGPIOのピンのマップですがWEB上に色々ありますが、今の所ここが使いやすいです。

pinout.xyz

SPI1有効化の設定

/boot/config.txtdtoverlay=spi1-1cs と設定して、再起動を行います。

dtoverlayは以下のように並列で設定値を記載可能です。

# Uncomment this to enable the lirc-rpi module
#dtoverlay=lirc-rpi
dtoverlay=dwc2
dtoverlay=spi1-1cs,cs0_pin=16
dtoverlay=spi2-1cs

※この際にBlueToothが有効化されている場合はバッティングするので、以下の手順で無効化します。

https://qiita.com/no_clock/items/ee13a72c86348209e7ca#%E6%89%8B%E9%A0%862-%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%8Bbluetooth%E3%82%92%E7%84%A1%E5%8A%B9%E5%8C%96

SPI1有効化確認

起動後に /dev/spidev* のデバイスを確認することができます。

(デフォルト)SPI1無効化時

$ ls /dev/spidev*
/dev/spidev0.0  /dev/spidev0.1

SPIの色々な設定

dtoverlay=spi1-1cs を 設定すると /dev/spidev1.0 が追加されます。この場合は冒頭の図の通り物理番号12番(BCM番号18番)のピンがCE0となります。

$ ls /dev/spidev*
/dev/spidev0.0  /dev/spidev0.1  /dev/spidev1.0

dtoverlay=spi1-3cs を 設定すると /dev/spidev1.0 から/dev/spidev1.2までが追加されます。

$ ls /dev/spi*
/dev/spidev0.0  /dev/spidev0.1  /dev/spidev1.0  /dev/spidev1.1  /dev/spidev1.2

例えば、以下のように設定すると、SPI2も有効化されます。(cs0_pinは後述)

dtoverlay=spi1-1cs,cs0_pin=16
dtoverlay=spi2-1cs

結果はこのようになります。

$ ls /dev/spidev*
/dev/spidev0.0  /dev/spidev0.1  /dev/spidev1.0  /dev/spidev2.0

CEにアサインされているピンを変更したい

dtoverlay=spi1-1cs,<param>=<val> (例:dtoverlay=spi1-1cs,cs0_pin=16) のようなパラメータ指定で、CEのピン番号を指定することができます。この際のピン番号はBCMの方の番号になるので注意です。(冒頭の図に記載されています)

以下の場合ならBCM番号16、物理番号36をSPIのCE#0として利用できます。

# Uncomment this to enable the lirc-rpi module
#dtoverlay=lirc-rpi
dtoverlay=dwc2
dtoverlay=spi1-1cs,cs0_pin=16

詳しくはREADMEにも書いてあります

詳しくはREADMEにも書いてあります。SPIの系統毎のデフォルトのピン番号(BCM)も記載されています。

$ cat /boot/overlays/README

Name:   spi1-3cs                                                                                                                            
Info:   Enables spi1 with three chip select (CS) lines and associated spidev                                                                
        dev nodes. The gpio pin numbers for the CS lines and spidev device node                                                             
        creation are configurable.                                                                                                          
        N.B.: spi1 is only accessible on devices with a 40pin header, eg:                                                                   
              A+, B+, Zero and PI2 B; as well as the Compute Module.                                                                        
Load:   dtoverlay=spi1-3cs,<param>=<val>                                                                                                    
Params: cs0_pin                 GPIO pin for CS0 (default 18 - BCM SPI1_CE0).                                                               
        cs1_pin                 GPIO pin for CS1 (default 17 - BCM SPI1_CE1).                                                               
        cs2_pin                 GPIO pin for CS2 (default 16 - BCM SPI1_CE2).                                                               
        cs0_spidev              Set to 'disabled' to stop the creation of a
                                userspace device node /dev/spidev1.0 (default
                                is 'okay' or enabled).
        cs1_spidev              Set to 'disabled' to stop the creation of a
                                userspace device node /dev/spidev1.1 (default
                                is 'okay' or enabled).
        cs2_spidev              Set to 'disabled' to stop the creation of a
                                userspace device node /dev/spidev1.2 (default
                                is 'okay' or enabled).

py-spidevで使うなら

以下のように使います。

import spidev

bus = "SPIの系統の番号0〜2"
device = "CEの番号0〜2"

spi = spidev.SpiDev()
spi.open(bus, device)

GitHub - doceme/py-spidev

参考URL

raspbian - How to enable SPI1 and SPI0 at the same time? - Raspberry Pi Stack Exchange

pinout.xyz