Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

MSC-MOD20 > SDモジュール ソフト > v0.7 > SD_Init()まで > 1回目のSD_Init()が失敗する

More than 3 years have passed since last update.
動作確認
ESP8266 (気圧計で使用したユニバーサル基板: I2Cを4.7kでプルアップ)
SDモジュール: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
Analog Discovery 2 (以下AD2)

http://qiita.com/7of9/items/1a4ceb8d32ddff8a6070
の続き。

MSC-MOD20の癖を見つける。

code v0.7

v0.7 @ github

v0.2以降の主な変更

  • I2C処理を別ファイル化
    • 他のマイコン対応を考慮
  • MSC-MOD20関連の処理を別ファイル化
    • ソースのメンテ性を高める
  • SD_Init()を追加

メイン処理は以下となった。

esp8266_160730_MSC-MOD20p1.ino
#include <Wire.h>
#include "esp8266_160730_i2cWrapper.h"

/*
 * v0.7 2016 Jul. 30
 *   - MSCMOD20lib: add MSCMOD_InitSD()
 *   - MSCMOD20lib: add receiveAck()
 * v0.6 2016 Jul. 30
 *   - separate MSC-MOD20 functions to external file
 * v0.5 2016 Jul. 30
 *   - separate i2c setup/read/write to external file
 *   - rename readData() to readCode()
 *   - readData() takes adr param
 * v0.4 2016 Jul. 30
 *   - rename helloWorld() to checkWithAck()
 *   - add sendData()
 *   - rename readAck() to readReply()
 *   - readAck() returns bool type
 * v0.3 2016 Jul. 30
 *   - add readAck()
 *   - add isData()
 *   - readData() returns char type
 *   - add readBootBanner()
 * v0.2 2016 Jul. 30
 *   - fix bug > Device Address was not 7 bit 
 * v0.1 2016 Jul. 30
 *   - add readData()
 *   - add helloWorld()
 *   - add loop()
 *   - add setup()
 */

void setup() {
  Serial.begin(115200);
  Serial.println("");

  i2c_setup();
  char rcvstr[100] = { 0 };
  MSCMOD_ReadBootBanner(/*rcvmaxlen=*/100, rcvstr);
  if (strlen(rcvstr) > 0) {
    Serial.print(rcvstr);
  }
}

void loop() {  

  if (MSCMOD_InitSD(/* dstPtr=*/NULL)) {
    Serial.println("init SD: OK");
  } else {
    Serial.println("init SD: NG");    
  }

//  char rcvstr[5] = { 0 };
//  if (MSCMOD_CheckWithAck(rcvstr)) {
//    Serial.print(rcvstr);
//  } else {
//    Serial.println("ACK NG");
//  }

  delay(3000); // msec
}

結果

結果
 GHI Electronics, LLC 
----------------------
 ALFAT SoC Processor 
!00
init SD: NG
init SD: OK
init SD: OK
init SD: OK

Power on boot直後のSD Initが必ず失敗する。

癖なのか、仕様なのか。取説をもっと読む必要がある。

MSC-MOD20の起動時のメッセージ文字列があることで、Power on boot直後のSD Init()のI2C波形をとるのが難しい。
追加のI/Oピンを使ってrising edgeを発生させ、それをトリガしないといけないだろうか。

AD2で測定してみた

追加のI/Oピンを使ってrising edgeを発生させ、それをトリガしないといけないだろうか。

とりあえずやってみた。

Power on boot後、1回目の波形

コマンドに対する応答がない。

qiita.png

Power on boot後、2回目以降の波形

qiita.png

備考

取説上でこの旨の記載は見つかっていない。

Power on boot直後に別コマンド(<LF>)を送っても状況は変わらず。
上記の「1回目」と同じタイミングで<LF>を送信した時には応答がある。SD Initコマンド自体の癖かもしれない。

失敗の状況

(追記 2016/07/31)

回数について

  • setup()内で3回連続SD_Init()すると3回ともNGとなった
    • 1回目だけの問題ではないようだ
  • 上記に関して、3回の実施前に3秒の待ち、を入れた
    • 待ちを入れても3回ともNGとなった
    • Power on bootからの経過時間だけの問題でもないようだ

I2CBUSYピンを使うのがいいのかもしれない。

関連forum

(追記 2016/07/31)

以下においてもI2Cでの初期化処理(Iコマンド)にて応答がないという例がある。
https://www.ghielectronics.com/community/forum/topic?id=12544

serial interfaceでは問題なく、I2Cでは問題がある、というのもこちらの状況に似ている。

I2C BUSY信号について

(追記 2016/08/02)

I2C BUSY(ピン2)がHレベルの時にはMSC-MOD20にコマンドを送信してはいけない。

SD_Init()に関して、I2C BUSYが関係するか見てみた。

以下は失敗している時。I2C BUSYにはなっていない。

qiita.png

以下は成功している時。

qiita.png

I2C BUSYは関係ないようだ。

他のコマンド

(追記 2016/08/02)

Vコマンドをsetup()内で3回連続実行してもすべて成功した。

https://www.ghielectronics.com/community/forum/topic?id=12544

Does I2C work with V command? Repeated?

It worked.

とりあえずの対応

(追記 2016/08/02)

setup()内で以下のような処理とした。

Test_SDInit();
delay(200); // msec // not worked with 20, 50, 100 msec
Test_SDInit();
delay(200); // msec
Test_SDInit();
delay(200); // msec  

上記の場合、2回目以降のTest_SDInit()は成功する。

実装方法としては以下で対応することになりそうだ。

  • SDInit()を1回実行する
  • 200msec待つ
  • SDInit()を再度実行する

200msecも待つのは無駄に感じるが仕方がない。

ツールでの確認

(追記 2016/08/06)

UARTの送受信タイミングを計るツールを作って測定してみた。
http://qiita.com/7of9/items/c018b2fa3e3a62f8c556

UART通信で確認したところ、だいたい150msec程度で応答がある。3回の実行で起動直後だけ特殊かというと、そうでもないような気がする。

I2Cの応答処理に癖があるようだ。UALFATの時もこういう点があったので同じようなものだろう。

7of9
セブンオブナインです。Unimatrix 01の第三付属物 9の7という識別番号です。Star trek Voyagerの好きなキャラクターです。まとめ記事は後日タイトルから内容がわからなくなるため、title検索で見つかるよう個々の記事にしてます。いわゆるBorg集合体の有名なセリフから「お前たち(の知識)を吸収する。抵抗は無意味だ」。Thanks in advance.
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away