FlashAirの共有メモリにArduinoからアクセスするライブラリ&サンプル(FlashAirSharedMem)

突然無性に、SDカードライブラリに頼らず、FlashAirの共有メモリにアクセスしたくなったので。

以前貼っていたコードはこちらに移動しました
共有メモリって何?という方は、こちらを御覧ください。

最初はこのページにベタッとコード公開していましたが、使いづらそうなのでライブラリ化しました。
ページ最下部のzipファイルを、Arduino IDEにインストールしてお使いください。

ピンヘッダを取り付けてSDカードシールド化したAirioと、Arduino Uno、FlashAir(W-03)の組み合わせで動作確認していますが、
シンプルなプログラムなので、ハードウェアCSピンの出力設定さえ書き換えれば、どのArduinoでも動くと思います。

ライブラリは、以下のシンプルな関数のみで構成されています。

int8_t SharedMemInit(int _cs);
 SDカード(FlashAir)を初期化し、コマンド発行できる状態にします。
 0で正常終了、負の値で異常終了(初期化失敗)

int8_t SharedMemWriteSimple(uint16_t adr, uint8_t data);
 FlashAirの共有メモリに1バイト書き込みます。アドレスは0x000~0x1FFまでの範囲内です。
 0で正常終了、負の値で異常終了。

int16_t SharedMemReadSimple(uint16_t adr);
 FlashAirの共有メモリから1バイト読み込みます。アドレスは0x000~0x1FFまでの範囲内です。
 0~255の値で正常終了(読みだしたデータ)、負の値で異常終了。

int8_t SharedMemWrite(uint16_t adr, uint16_t len, uint8_t buf[]);
 FlashAirの共有メモリに指定のバイト数、バッファから書き込みます。
 アドレスは0x000~0x1FFまでの範囲内、長さは1~アドレス+長さが512を超えない範囲内です。
 0で正常終了、負の値で異常終了。

int8_t SharedMemRead(uint16_t adr, uint16_t len, uint8_t buf[]);
 FlashAirの共有メモリに指定のバイト数、バッファへ読みだします。
 アドレスは0x000~0x1FFまでの範囲内、長さは1~アドレス+長さが512を超えない範囲内です。
 0で正常終了、負の値で異常終了。

iSDIOの仕様上、常に512バイトの転送が発生します。1回の送信あるいは受信に2.5msほど掛かります。
そのため、1バイトの送信よりも、複数バイト一気に送信したほうが通信効率は良くなります。

v0.2より、ソフトSPIを実装しました。ライブラリ内のピン等を修正すれば、SPIが使えない環境でもソフトでエミュレートします。
ソフトSPIにおいては速度のことを全く考えずに実装しているため、一回の読み書きに80msほど掛かります。
必要な場合は各自でチューンアップしてください。

ライブラリにはサンプルが同梱されていますので、そちらもご確認ください。
通信時間の測定は、サンプル内のFlashAirSharedMem.inoより行うことが出来ます。

注意: エラーハンドリングは手抜きをしており、タイムアウトも実装していないため、
 特に、通信中にSDカードを引っこ抜かれたりした場合には、無限ループにハマります。ご注意ください。

更新履歴
v0.1 初公開
v0.2 ソフトSPIを実装。defineで切り替えられるように。
    また、初期化が1回失敗しても2回目以降に成功する場合があるので、繰り返すようにサンプルを修正。

右下のをクリックしてダウンロード [ Click right side  icon to download.]
ċ
FlashAirSharedMem.zip
(7k)
GPS_NMEA _JP,
2016/09/12 6:15
Comments