LoginSignup
0
0

More than 3 years have passed since last update.

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

Posted at

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

GUI から、設定 - Raspberry Pi の設定 を開き、インタフェース - SPI を有効にして再起動します。
また、MOSI ⇒ MISO ループバック用のショートピンを、40pin コネクタの 19-21 ピン間に接続しておきます。
1.jpg

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

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0