LoginSignup
0
0

More than 5 years have passed since last update.

MSC-MOD20 > SDモジュール ソフト > v0.9 to v0.11 > I2C通信のタイムアウト追加 / バージョン取得とSD初期化で確認

Last updated at Posted at 2016-10-01
動作確認
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.11 @ github

以下が主な変更

  • 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を挿入してない時

qiita.jpg

備考

早くMSC-MOD20を終わらせてGPUの性能を徹底的に追及しながらFPGAをしたい。。。

eplased_msec はelapsed_msecのタイポ。。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0