Howto

Armadillo-IoT ゲートウェイ G4 で SPI バスを使用する方法

この Howto では、Armadillo-IoT G4 を使用し、様々な電圧レベルの SPI デバイスと接続する方法を紹介します。
特定の SPI デバイスに関してはこの HowTo では触れません。
また、Armadillo-IoT G4 がマスターデバイスとなり、 1 つの SPI バスあたり 1 つのスレーブデバイスと通信することを想定しています。

Armadillo-IoT G4 の SPI バス仕様

Armadillo-IoT G4 の CON11 には以下の 2 つの SPI バスがあります。
信号レベルはすべて 1.8V となっています。

ECSPI1

CON11 ピン番号 信号名 SPI の信号名
6 ECSPI1_MISO MISO
8 ECSPI1_MOSI MOSI
10 ECSPI1_SCLK SCLK
12 ECSPI1_SS0 SS0

ECSPI2

CON11 ピン番号 信号名 SPI の信号名
9 ECSPI2_MISO MISO
11 ECSPI2_MOSI MOSI
13 ECSPI2_SCLK SCLK
15 ECSPI2_SS0 SS0

片方のバスを使用する場合、 Base OS 上でのデバイスは /dev/spidev0.0 になります。
両方のバスを使用する場合、デバイスはそれぞれ /dev/spidev0.0, /dev/spidev1.0 になります。

必要な回路

スレーブデバイスに応じてレベル変換回路と電源回路が必要になります。

レベル変換回路

Armadillo-IoT G4 の 信号レベルは 1.8V なので、 1.8V 以外のデバイスと通信するためにレベル変換回路が必要です。
使用可能と思われるレベル変換モジュールの例を以下に示します。

  • adafruit TXB0104 Bi-Directional Level Shifter

この HowTo では、adafruit TXB0104 Bi-Directional Level Shifter を使用しました。
また、製品マニュアル内「14.4.6. 回路設計」で紹介されているように、LSF0204RUTR などの IC を使用してもよいでしょう。

電源回路

CON11 に出ている電源は 1.8V と 5V なので、 3.3V デバイスなどを使用する場合は電源回路も必要です。
3端子レギュレータなどを使用してください。
この HowTo では、LT1117 互換 IC を使用しました。

接続方法

5V デバイスを使用する場合の接続

レベル変換回路が必要です。

CON11 ピン番号 信号名
30 VDD_1V8
32 VDD_5V
34 GND

3.3V デバイスを使用する場合の接続

電源回路・レベル変換回路が必要です。

CON11 ピン番号 信号名
30 VDD_1V8
32 VDD_5V
34 GND

1.8V デバイスを使用する場合の接続

そのまま接続するだけで使用できます。

CON11 ピン番号 信号名
30 VDD_1V8
34 GND

Device Tree のカスタマイズ

製品マニュアル内「9.9.3. Device Tree をカスタマイズ」の方法で ECSPI バスを割り当て、生成された DTB を Armadillo-IoT G4 に書き込んでください。

コンテナの作成・ログイン

コンテナをイメージをダウンロード・起動します。
/dev/spidev0.0 を使用する場合の例です。

[armadillo ~]# podman run -it --rm --device=/dev/spidev0.0 docker.io/alpine /bin/sh

また、 --device=/dev/spidev1.0:/dev/spidev0.0 とすると /dev/spidev1.0 をコンテナ内で /dev/spidev0.0 として扱えます。

確認

準備

spi-configspi-pipeを使用するため、 SPI Tools をインストールします。

[container /]# apk update && apk upgrade
(省略)
OK: 5 MiB in 14 packages
[container /]# apk add spi-tools
(1/1) Installing spi-tools (1.0.0-r0)
Executing busybox-1.34.1-r5.trigger
OK: 5 MiB in 15 packages

設定表示

spi-config で確認できます。 モードと周波数がスレーブデバイスの仕様と合っているか確認してください。

[container /]# spi-config -d /dev/spidev0.0 --query
/dev/spidev0.0: mode=0, lsb=0, bits=8, speed=5000000, spiready=0

モードはタイミングチャートを参考にしてください。

設定変更

スレーブデバイスの仕様と合致していない場合、タイミングは -m オプションで変更します。

[container /]# spi-config -d /dev/spidev0.0 -m 3

SCLK 周波数は at-dtweb で設定した値が使用されます。
後述しますが、一時的に変更することもできます。

疎通確認

spi-pipe を実行すると、スレーブデバイスとの通信を確認できます。
以下の例は SPI4 (/dev/SPI-3) を使用し、 0x06,0x00,0x55 の 3 バイトのデータを送信します。
SPIでは送受信を同時に行うため、受信データ( 1 回目は 0x02,0x0f,0xff )も 3 バイトとなります。
-b 3 は 3 バイト送受信するごとに SS0 をリリースする設定です。

[container /]# printf '\x06\x00\x55' | spi-pipe -b 3 -d /dev/spidev0.0 | hexdump -C
00000000  02 0f ff                                          |...|
00000003
[container /]# printf '\x06\x00\x55' | spi-pipe -b 3 -d /dev/spidev0.0 | hexdump -C
00000000  ff e0 00                                          |...|
00000003

正常通信の確認方法はスレーブデバイスによって異なりますが、デバイス ID などの固定値のレジスタを読み、値を確認するとよいでしょう。

spi-pipe-s 1000000 をつけると、コマンド実行中の SCLK 周波数を一時的に変更できます。