spidev_test は、RasPi から SPI 入出力を行うとき最初に使うツールです。
公式で紹介されているのは古いバージョンのため、最新版を使ってみます。
最新版では、いろいろと機能が追加されていて、便利になっています。
公式ページの解説
https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md
リンクされているソース
https://raw.githubusercontent.com/raspberrypi/linux/rpi-3.10.y/Documentation/spi/spidev_test.c
使用OS
執筆時点の最新版で試します。
Raspberry Pi OS with desktop and recommended software
Release date: January 11th 2021
Kernel version: 5.4
Size: 2,863MB
GUI から、設定 - Raspberry Pi の設定 を開き、インタフェース - SPI を有効にして再起動します。
また、MOSI ⇒ MISO ループバック用のショートピンを、40pin コネクタの 19-21 ピン間に接続しておきます。
最新版の spidev_test
https://github.com/torvalds/linux/blob/master/tools/spi/spidev_test.c
にあります。
wget https://raw.githubusercontent.com/torvalds/linux/master/tools/spi/spidev_test.c
でとってきて、
gcc -o spidev_test spidev_test.c
でコンパイルしますが、SPI_TX_OCTAL, SPI_RX_OCTAL が宣言されてないため、エラーが出ます。
ライブラリへの宣言文追加
/usr/include/linux/spi/spidev.h
に、不足している宣言文 2行を追加します。
sudo nano /usr/include/linux/spi/spidev.h
# define SPI_TX_DUAL 0x100
# define SPI_TX_QUAD 0x200
# define SPI_RX_DUAL 0x400
# define SPI_RX_QUAD 0x800
# define SPI_TX_OCTAL 0x2000 // 追加 1
# define SPI_RX_OCTAL 0x4000 // 追加 2
これでコンパイルが正常に通るようになります。
gcc -o spidev_test spidev_test.c
動作確認
実行してみます。
pi@raspberrypi:~$ ./spidev_test -D /dev/spidev0.0 -v
spi mode: 0x4
bits per word: 8
max speed: 500000 Hz (500 kHz)
TX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D |......@.........................|
RX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D |......@.........................|
このとき、40pin バス上の波形は下記のようになっています。
任意のキャラクタを出力したいとき
pi@raspberrypi:~$ ./spidev_test -D /dev/spidev0.0 -p "DEADBEEF" -v
spi mode: 0x4
bits per word: 8
max speed: 500000 Hz (500 kHz)
TX | 44 45 41 44 42 45 45 46 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ |DEADBEEF|
RX | 44 45 41 44 42 45 45 46 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ |DEADBEEF|
任意のバイナリデータを出力したいとき
pi@raspberrypi:~$ ./spidev_test -D /dev/spidev0.0 -p "\xde\xad\xbe\xef" -v
spi mode: 0x4
bits per word: 8
max speed: 500000 Hz (500 kHz)
TX | DE AD BE EF __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ |....|
RX | DE AD BE EF __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ |....|
※echo -ne "\x01\x02\x03" > /dev/spidev0.0 だと、100MHz での SPI 出力になってしまいます。
動かないデバイスも多いと思います。
ファイルを出力したいとき
(num.bin は適当に作ったもの)
pi@raspberrypi:~$ ./spidev_test -D /dev/spidev0.0 -i num.bin -v
spi mode: 0x4
bits per word: 8
max speed: 500000 Hz (500 kHz)
TX | 30 31 32 33 34 35 36 37 38 39 0A 61 62 63 64 65 66 67 68 69 6A 0A 0A __ __ __ __ __ __ __ __ __ |0123456789.abcdefghij..|
RX | 30 31 32 33 34 35 36 37 38 39 0A 61 62 63 64 65 66 67 68 69 6A 0A 0A __ __ __ __ __ __ __ __ __ |0123456789.abcdefghij..|
入力データをファイルに保存
ループバック接続しているので、出力した num.bin がループバックされて num2.bin が生成され、同内容のファイルができます。
pi@raspberrypi:~$ ./spidev_test -D /dev/spidev0.0 -i num.bin -o num2.bin -v
spi mode: 0x4
bits per word: 8
max speed: 500000 Hz (500 kHz)
TX | 30 31 32 33 34 35 36 37 38 39 0A 61 62 63 64 65 66 67 68 69 6A 0A 0A __ __ __ __ __ __ __ __ __ |0123456789.abcdefghij..|
RX | 30 31 32 33 34 35 36 37 38 39 0A 61 62 63 64 65 66 67 68 69 6A 0A 0A __ __ __ __ __ __ __ __ __ |0123456789.abcdefghij..|
バッファサイズの拡大
入出力データの最大サイズは、デフォルトでは 4096 バイトになっています。
もっと大きいデータを出力するには、バッファサイズを変更します。
現在の最大転送サイズを確認
cat /sys/module/spidev/parameters/bufsiz
→ 4096 になっています
拡大するには、/boot/cmdline.txt に下記変数を追加します。
spidev.bufsiz= (サイズ数値)
拡大可能なサイズ
4096: OK (デフォルト)
16384: OK
65536: OK
1048576: OK (1MB)
4194304: OK (4MB) ⇒ 最大値 (これ以上を設定しても拡大しない)
pi@raspberrypi:~$ sudo nano /boot/cmdline.txt
(末尾に spidev.bufsiz=4194304 を追加)
pi@raspberrypi:~$ cat /boot/cmdline.txt
console=serial0,115200 console=tty1 root=PARTUUID=e08db83a-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles spidev.bufsiz=4194304
これで、SPI バスで接続した外部デバイスと、いろいろなやり取りができます。