この Howto では、Armadillo-IoT G4 を使用し、様々な電圧レベルの SPI デバイスと接続する方法を紹介します。
特定の SPI デバイスに関してはこの HowTo では触れません。
また、Armadillo-IoT G4 がマスターデバイスとなり、 1 つの SPI バスあたり 1 つのスレーブデバイスと通信することを想定しています。
本HowtoはArmadillo-IoT G4をベースにした内容になっていますが、Armadillo-X2でも動作確認しています。 Armadillo-X2はArmadillo-IoT G4の機能を一部減らして小型にした製品で、基本的には同じソフトウェアで動作します。 また、拡張インターフェース(CON11)の仕様も同じですので、CON11用に作った拡張ボードは両方の製品で動作します。
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端子レギュレータなどを使用してください。
Armadillo-X2の場合は、CON16の3.3Vを利用することが可能です。
この 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-config
やspi-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 周波数を一時的に変更できます。