Jetson NanoとSTM32でSPI通信にトライしてみました。
STM32F401REを使用し、Nucleo F401REボードを使って動作確認を行いました。
デバイスの準備
Jetson NanoのSPI通信を有効にする
Jetson Nanoは初期設定ではGPIOのSPIは無効化されているため、有効化する必要があります。
SPI通信を有効化する方法については、下記のページにまとめてあります。
STM Cube IDEのインストール
こちらの公式ページからCube IDEをダウンロードしてインストールします。
https://www.st.com/ja/development-tools/stm32cubeide.html
ダウンロードしたインストーラを起動すれば、インストールが開始されます。
ディレクトリの設定などは特にこだわりがなければデフォルトのまま進めてしまって構いません。
SPI通信のテスト
Jetson Nanoをマスター、STM32をスレーブとして通信のテストを行います。
Jetson Nano側
まずは、Jetson Nano側のコードを説明します。
SPI通信を使うため、spidevをインポートし、SPI通信の設定を行います。
今回の設定では、spi0を使い、最大周波数は125kHz, SPIの通信モードは0に設定します。
この設定はスレーブに合わせて設定します。今回のSTM32では上記の設定で通信することが確認できました。周波数はクロックの設定で変わりますので、うまく通信できない場合は周波数を変えてみてください。
import spidev #SPI open and setting spi = spidev.SpiDev() spi.open(0, 0) # Settings (for example) spi.max_speed_hz = 125000 spi.mode = 0b00
SPI通信の設定は上記の通りで、通信をする部分のコードは次の通りです。
ここでは、2バイトのデータを送って、2バイトのデータを受け取る例になります。
resp = spi.xfer2([0x31, 0x32]) print(resp)
spidevのxfer2を使ってデータを送り、返ってきたデータをrespに保存しています。
これで、Jetson Nano側のプログラムは終了です。
STM32側
続いてSTM32側の設定、コードを説明します。
まずはcube IDEでSPI通信を有効化します。
赤線で囲ったPA4~PA7がSPI通信で使うピンで、それぞれSPI1_NSS, SPI1_CLK, SPI1_MISO, SPI1_MOSIと設定します。
今回はSTM32はスレーブとして使うので、モードはFull Duplex Slaveにし、Hardware NSS Input Signalを選択します。
コードは下記のとおりです。
//===SPI通信===// sp = HAL_SPI_TransmitReceive(&hspi1, (uint8_t*)spitxbuf, (uint8_t*)spirxbuf , 2, 100); //SPI通信 if (sp == HAL_OK){ //SPI通信OKの場合, デバッグ用 HAL_UART_Transmit(&huart2, spirxbuf, 2, 10); printf("\r\n"); }
あらかじめ送信バッファと受信バッファを定義しておき、HAL関数でSPI通信の受信と送信を同時に行います。
通信できたかどうかを確認するため、SPI通信が行えた時には受信した内容をUART通信でPCへと送っています。
まとめ
Jetson NanoとSTM32を使ってSPI通信を行う例を紹介しました。
SPI通信を有効化は、JetsoneはJetson-IOを使って、STM32はcubeIDEを使って簡単にできます。
Jetsonはspidevによって、STM32はHAL_SPI関数で数行のコードを書くだけでSPI通信を行うことができるようになります。