動作確認
ESP8266 (気圧計で使用したユニバーサル基板: I2Cを4.7kでプルアップ)
SDモジュール: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
Analog Discovery 2 (以下AD2)
http://qiita.com/7of9/items/cf075be6433178952eb6
の続き。
上記は2016年8月1日。二カ月も飛んでしまった。。。
その二ケ月の間にやったのは、Processing入門、R入門、WRF入門、MOSFET入門、あとなんか入門した気もするが、記憶力が良くないので、忘れた。
二ケ月ぶりでほとんど忘れていたが、大丈夫。Qiitaの記事があるから15分で支度ができた。
前置き終わり。
code
code v0.11
以下が主な変更
- v0.9
- SD initの初期化時間を見ていた
- microSDを挿入していない時は3.3秒のタイムアウトが必要と分かった
- v0.10
- これまでのI2Cの処理ではタイムアウト時間の長い処理(3.3秒とか)を
- きちんと扱えてなかったため、delayとタイムアウトを入れた
- 具体的にはI2Cの応答待ちの時、応答なし(0x00)を受信した時にdelay時間待ち(例: 10msec)を行う
- それを繰返す。繰返すうちにタイムアウト時間(例:1000msec)経過時に繰返しから抜けるようにした
- コードは後述
- v0.11
- v0.11で入れたI2C通信を実際に使ってみた
- バージョン取得とSD初期化処理で動作を確認した
I2Cのdelayとtimeout追加
esp8266_160730_MSDMOD20lib.inoに記載のI2C応答読取り処理の変更を以下に示す。
変更前.ino
bool readReply(int maxlen, char *dstPtr){
char code;
bool rcvd = false;
if (dstPtr == NULL) {
return false;
}
for(int loop = 0; loop < maxlen; loop++) {
code = i2c_readCode(DEVICE_ADDRESS);
if (isData(code)) {
*dstPtr = code;
dstPtr++;
rcvd = true;
} else {
return rcvd;
}
}
return true;
}
変更後.ino
bool readReply_delayAndTimeout(int delay_msec, int timeout_msec, char *dstPtr) {
char code;
bool rcvd = false;
int eplased_msec = 0; // maximum: 32767
if (dstPtr == NULL) {
return false;
}
while(1) { // TODO: 0m > limit with maxloop
if (eplased_msec > timeout_msec) {
return false;
}
code = i2c_readCode(DEVICE_ADDRESS);
if (isData(code)) {
*dstPtr = code;
dstPtr++;
rcvd = true;
eplased_msec += 1; // TODO: 0m > correct time measurement
} else {
if (rcvd) {
return true;
}
i2c_delay(delay_msec);
eplased_msec += delay_msec;
}
}
return rcvd;
}
- i2c_readCode()失敗時にdelay_msec秒待つ
- i2c_delay()はesp8266_160730_i2cWrapper.inoにて定義
- ESP8266以外のRTOS使用環境への移植を考慮
- i2c_delay(10)で10msecのdelay
- eplased_msec が指定のtimeout_msecを超えた時にタイムアウトと判断する
- i2c_readCode()成功時のeplased_msec 増分はまじめに実装してない
- Arduinoの時間計測処理を勉強すればいいだろうが、とりあえず保留
実行例
SDを挿入している時
結果
GHI Electronics, LLC
----------------------
ALFAT SoC Processor
!00
v2.0.0
!00
init SD: OK
rcvd:!00
v2.0.0
!00
init SD: OK
rcvd:!00
バージョン(v2.0.0)表示とSD初期化ともに成功。
SDを挿入してない時
結果
GHI Electronics, LLC
----------------------
ALFAT SoC Processor
!00
v2.0.0
!00
init SD: NG
rcvd:!11
v2.0.0
!00
init SD: NG
rcvd:!11
v2.0.0
!00
init SD: NG
rcvd:!11
v2.0.0
!00
きちんとSD初期化がエラーになっている。
エラーコード | エラーの内容 |
---|---|
00 | エラーなし(ACK) |
11 | 初期化に失敗しました |
SDカードのCD信号がH又はフローティングしている |
写真
SDを挿入してない時
備考
早くMSC-MOD20を終わらせてGPUの性能を徹底的に追及しながらFPGAをしたい。。。
eplased_msec はelapsed_msecのタイポ。。。