Home
ESP32 を SPI通信 の スレーブ で使用する
Ver.1.0 '20/05/07
All rights reserved JA3OOK 中村 利和
Arduino IDE環境での ESP32(ESP32-WROOM-32)を SPI通信の「スレーブ」として動作させる
場合のプログラムの要点を述べます。
Rabbit NoteさんがWeb(参考資料1)で1個のESP32をマスターとスレーブを兼ねて動作させる
プログラムを分かりやすい解説付きで公開されておられます。
ところが残念なことに、スレーブ動作だけさせる場合に「通信完了待ち」をどのよう行うかが
不明で、私は困ってしまいました。
いろいろ調べてようやく解決しましたので、それを書いておきます。
なお、Rabbit Noteさんは「受信データの最後の4バイトが受信できない場合がある」ことを
述べるのがWebの目的のようなので「スレーブ側の通信完了待ち」に触れられていないのは当然の
ことと推測します。
1.ESP32-WROOM-32 スレーブ側のプログラムの要点 (赤文字が要点)
通信完了待ちの方法は、
・spi_slave_get_trans_result関数を使って「通信完了待ち」を行う。
・その関数の第二パラメーター(下記のコード例では & を付けた spi_sl_trans) を
メインループのスコープ内に記述した spi_slave_transaction_t で定義しておく。
です。
次の図でメインループ内のプログラム構成を示します。
void loop()
{
Serial.println("[LOOP]");
// spiトランザクションの構造定義
spi_slave_transaction_t* spi_sl_trans;
// マスターへ送信するデータを準備
spi_slave_tx_buf = マスターへ送信するデータ;
// スレーブの送信準備
ESP_ERROR_CHECK(
spi_slave_queue_trans(HSPI_HOST, &spi_slave_trans, portMAX_DELAY));
// スレーブ通信完了待ち
spi_slave_get_trans_result(HSPI_HOST, &spi_sl_trans, portMAX_DELAY);
Serial.println("[送受完了]");
// チェック
受信データの処置を行う(受信したデータは spi_slave_rx_buf に入っている)
}
|
2.ソースプログラム
Rabbit Noteさんのプログラムを、上記の構成に改造した ESP32-WROOM-32 SPIスレーブ の
ソースプログラムです。
・zipファイル(スレーブ用ソースプログラムとマスター用ソースプログラム)
参考に、Arduino UNO SPIマスター のソースプログラムも同梱してあります。
動作確認環境
Arduino IDE 1.8.12 + esp32 by Espressif System バージョン 1.0.4
ESP32-DevKitC ESP32-WROOM-32 −−−SPI スレーブ
Arduino UNO −−−SPI マスタ
3.ハードウェア
このプログラムが動作するハードウェア回路図です。
Arduino UNOの出力ピン電圧が5V、ESP32の入力ピン最大定格が3.9V(3.6+0.3)なので、レベル
変換IC 74HC4050 を間に入れています。(参考資料6)
私は実験していませんが、ICの代わりに抵抗で代用することが可能なようです。しかし通信速度
を落とす必要があるかもしれません。(参考資料6の2ページ前)
ESP32出力ピンとUNO入力ピンの間は直結で大丈夫です。
今回のISP通信の実験ではUNOやESP32-WROOM-32へ外部から電源を供給する必要はありません。
USBからの電源でOKです。
[謝辞]
本ソフトの作成に特に役立った資料を最後に列挙しました。この他にも役立った記事が色々
ありました。各著者に感謝します。
[参考資料]
1 Rabbit Note ESP32 で SPI スレーブ通信するときの注意点
2 Espressif SPI Master Driver
3 Espressif SPI Slave Driver
4 Arduino Team 訳Takumi Funada Arduino 日本語リファレンス
5 Stupiddog ArduinoでSPI通信を行う方法
6 しなぷすのハード製作記 74HC4050を使う方法
直前の画面へは ブラウザの戻る をクリックしてください。Topに戻るにはHome