Jetson NanoでSPI通信をしたいと思ったのですが、どうやら初期状態ではSPIは無効になっているとのこと。そこで、SPIを有効にする方法を調べてみました。
[2021.4追記]
Jetpack 4.3からJetson-IOというGPIOの設定を行うツールが追加されました。これを使うのが現在最も簡単かつ確実な方法になります。
特にこだわりがなければJetpack 4.3をインストールするのが良いです。
Linux PCでJetson Nanoの設定を書き換える
まず、見つけたのはこちらのページ。
Jetson NanoのSPIを有効にする – RT Robot Shop Blog - www.rt-shop.jp |
Jetsonのデバイスツリーを書き換える方法のようです。前提条件として、Jetson NanoにはL4T(Linux for Tegra) R32.1がインストールしてあり、起動できるようにしておくことが必要です。
あとはこのページに書いてある通りに進めればいいのですが、こちらで紹介されているやり方では、Jetson Nanoとは別にLinux PCが必要になります。
Linux PCをお持ちの方はこちらの方法で試してみてください。
上記のページで作者の方も述べていますが、あくまで非公式のやり方なので、自己責任でお願いします。
Jetson Nano単体で設定を書き換える
次に見つけたのは、こちらのページ。
So, I’ve spent the last week trying to piece together information on getting SPI to work on the Nano DeveloperKit and finally got it working yesterday. To save others some pain, I’ve documented the steps and created both patch and binary files. This only applies to the tegra210-p3448-0000-p3449-0000-a02 but I’m sure it can be adapted to other boards. Just FYI… My first mistake was using the pinmux "helper" spreadsheets. Not only do you have to use a real Excel to get the macros... Updated instructions for SPI on Nano DevelopmentKit with L4T 32.2.1 - NVIDIA Developer Forums |
こちらは、上で紹介した方法を改良したやり方になります。筆者が書いているように、Jetson NanoだけあればSPIを有効にできる方法です。
詳細なやり方は、こちらに書かれているのでその通りにやればSPI通信を有効かできます。しかし、英語なので日本語に訳したメモをここに残しておきます。
1.最新版のtarファイルをこちらからダウンロードして、Jetson Nanoに保存します。この記事を書いた時点では、flash-dtb-update-2019-12-09.tar.gzが最新です。
2.ダウンロードしたtarファイルを解凍します。
3.Jetson Nanoのターミナルを開き、解凍したディレクトリに移動して、
sudo ./flashme.sh /dev/mmcblk0
を実行します。
4.Jetson Nanoを再起動すると、spidev0.0が有効になっています。
有効になっているかどうか確認するには、
ls /dev/spi*
を実行してください。有効化されていれば、dev/spidev0.0と返ってきます。
Jetson-IOを使う方法
JetPack 4.3で追加された Jetson-IO tool を使用してSPI通信を有効にします。
Raspberry PiのRaspberry Pi Configと同じように設定できるようになりました。
Jetson NanoのGPIOの設定を一括でできるツールで、非常に便利です。
なぜ、Raspberry Piのように最初から実装してくれなかったのか・・・
Jetson-IOを使う準備
まずはJetson-IOを使う準備をします。
$ sudo find /opt/nvidia/jetson-io/ -mindepth 1 -maxdepth 1 -type d -exec touch {}/__init__.py \;
Jetson Nano以外は上のコマンドだけでよいですが、Jetson Nanoだけは次のコマンドでディレクトリを作ります。
$ sudo mkdir /boot/dtb $ sudo cp -v /boot/tegra210-p3448-0000-p3449-0000-[ab]0[02].dtb /boot/dtb/
これで準備は完了です。
Jetson-IOの起動
では、いよいよJetson-IOを起動します。
ここで、一つ注意事項があります。ターミナルウィンドウのサイズが小さいと、Jetson-IOのメニュー表示が途中で見切れてしまいます。
ターミナルウィンドウは縦に長くしてから実行することをお勧めします。
Jetson-IOは次のコマンドで起動します。
$ sudo /opt/nvidia/jetson-io/jetson-io.py
実行すると、下のような画面になります。
”Configure 40-pin expansion header”を選択して、GPIOの設定画面に移行します。
有効にしたい機能にカーソルを合わせ、チェックを付けます。
チェックを入れたら”Back”で先ほどの画面に戻り、”Exit”でJetson-IOを終了します。
その後、再起動すれば、SPI通信が有効になります。
SPI通信のループバックテスト
SPIを有効化することが出来たので、SPI通信のテストをしましょう。
まずは、pythonのSPI通信モジュール、py-spidevをインストールします。
git clone git://github.com/doceme/py-spidev cd py-spidev sudo python setup.py install
次にループバックテストをします。Jetson NanoのSPI通信に関するピンは次の表のようになっています。
名称 | ピン番号 |
SPI_MOSI | 19 |
SPI_MISO | 21 |
SPI1_SCK | 23 |
SPI1_CS0 | 24 |
SPI1_CS1 | 26 |
ループバックテストの時には、MOSIとMISOをつなぐ、すなわちピン19と21をつなぎます。
ループバックテストのプログラムはこちらで紹介されているものを使います。
#!/usr/bin/env python # loopback test script # connect MOSI and MISO import spidev import time spi = spidev.SpiDev() spi.open(0, 0) def BytesToHex(Bytes): return ''.join(["0x%02X " % x for x in Bytes]).strip() try: while True: resp = spi.xfer2([0x01, 0x02]) print BytesToHex(resp) time.sleep(1) except KeyboardInterrupt: spi.close()
このプログラムをJetson Nano上で実行すると、1秒おきに”0x01 0x02″と表示されます。
以上が、Jetson NanoでSPI通信を有効にするやり方と、ループバックテストで確認するやり方の紹介になります。