ESP8266 (気圧計で使用したユニバーサル基板: I2Cを4.7kでプルアップ)
SDモジュール: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
http://qiita.com/7of9/items/0b17a601e464e67494af
の続き。
code v0.12
以下が主な変更
- I2Cの複数行応答の読取り変更
- SDのバージョン確認コマンドにてACKをチェックするように変更
- SDの空き容量を確認するコマンドを実装
v2.0.0
init SD: OK
rcvd:!00
2:22,$000000006E170000
!00
SD free space:
$000000006E170000
途中にデバッグ用の出力(2:22...)があるが、バージョン(v2.0.0)と空き容量($000000006E170000)が読取りできた。
I2C > 複数行の応答読取りのハマリポイント
空き容量の確認コマンドの応答は以下のようになっている。
$000000006E170000<0x0A>
!00<0x0A><0x00>
こういう場合に各行をどう読取るか?
試した方法1 > 0x0Aまで読取る
ターミネータが0x0Aなので、0x0Aまで読取る処理にした。
自分の実装が悪かったのか、MSC-MOD20のI2C通信に問題があったのか不明だが、通信が失敗するようになった。
未確認ではあるが、<0x0A><0x00>で終わる場合は、きちんと<0x00>を読込まないとその後の通信がおかしくなるようだ。
一方で、上記の複数行の例にあるように<0x0A>の後のコードは<0x00>とは限らない。これを考慮した処理は複雑になりそうなため、0x0Aまでの読取りという方針はやめた。
試した方法2 > 複数行を読取ってからsplit
I2C通信をした時は、とにかく<0x00>まで読取り、その後に読取った文字列を<0x0A>区切りで分割することにした。
こちらの方は問題なく動作し、今のバージョンで使用している。