RasPi 3B+ で最新の spidev_test を使う

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
```
![OS_version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/22e3c19a-a9d6-e69c-c8a4-679d12eaf28e.png)


GUI から、設定 - Raspberry Pi の設定 を開き、インタフェース - SPI を有効にして再起動します。
また、MOSI ⇒ MISO ループバック用のショートピンを、40pin コネクタの 19-21 ピン間に接続しておきます。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/3ea991d5-7587-7ec5-5770-4b2626050abb.jpeg)


#最新版の 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

```～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 バス上の波形は下記のようになっています。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/eeb7c592-e431-0f2d-d24e-b083d1cbad38.png)



##任意のキャラクタを出力したいとき

```
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 バスで接続した外部デバイスと、いろいろなやり取りができます。