sakura.ioを用いたIoTサイコンを作るシリーズ第4弾です。
今回はSTM32とさくらの通信モジュールの通信方法について説明します。

通信インターフェース

さくらの通信モジュールでは通信方式としてI2CとSPIのどちらかを選択できます。
今回はI2Cを使用します。

コマンド体型

I2C、SPI共にコマンド体型は以下のようになっています。

  • 要求シンタックス
要求種別 引数データ長 引数データ パリティ
Q N A(0) A(1) A(N-1) P

 

  • 応答シンタックス
実行結果 応答データ長 応答データ パリティ
S M D(0) D(1) D(N-1) P

このように、送信データ・応答データ共に可変長な仕様となっています。

公式Arduinoライブラリの構造

ArduinoライブラリはC++で記載されています。

SakuraIOという基底クラスから派生したSakuraIO_I2C・SakuraIO_SPIの2種類のクラスが存在し、この2つを選択することによって通信インターフェースを気にせずに実装できるように設計されています。

通信インターフェースに依存する内容はSakuraIO::executeCommandメソッドに集約されており、このメソッドを移植することによってArduino以外でもライブラリの再利用が可能となっています。

実際には、I2C・SPIクラスそれぞれで以下のメソッドがオーバーライドされることで各インターフェースでの通信を実現しています。

  • void SakuraIO::begin();
  • void SakuraIO::end();
  • void SakuraIO::sendByte(uint8_t data);
  • uint8_t SakuraIO::startReceive(uint8_t length);

しかし、STM32のHALにあるI2Cライブラリでは1バイトずつを送受信する機能がないため、今回はexecuteCommandメソッド全体を移植する形で実装します。
(将来的にはLL APIを使用してレジスタレベルでなんとかしようと思います)

executeCommandメソッドの移植

ということで、今回実装したexecuteCommandメソッドです。
やっつけ仕事なので以下の制約があります

  • SAKURAIO_BUFFERSIZEで指定したバッファサイズ分、毎回必ず受信する。
  • SAKURAIO_BUFFERSIZEで指定したバイト数以上のデータが返ってきたら正常に処理できない。

これらの制約により、データの一括送信・ファイル送受信などの機能には対応できていません。
そのあたりをちゃんとしたいならNucleoをmbedライブラリ・LL APIの使用、あるいはソフトウェアI2Cでの実装をおすすめします。

LL APIできちんと実装できたらまた更新します。

次回はSTM32L0の省電力周りの話を書こうと思います。

カテゴリー: 組み込み関連

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です