日本語マニュアルが親切なように見えて、親切ではない…
と感じたので、つまずいたことと対策方法、感じたことをまとめます。
(※相当イライラさせられて、そのテンションで書いてるので表現がよくなかったらすみません)
はじめに
MSC-MOD20はマイクロテクニカ社で販売しているI2CまたはUART通信でマイコンからSDカードにファイル保存できるボードです。
(ふつう、SDカードへの保存はSPIを使います)
microSDカードシリアル制御ボード [MSC-MOD20]
外国製でマイクロテクニカが専売しているボードで、日本語マニュアルがいけてない。
(もしマイクロテクニカの人見てたら、マニュアルの追加修正してほしいです)
しかも5000円近い値段で超高いです。
ほんとはこんなの使いたくないんですけど、使用中の評価ボードのSPIが1chしかなく、もともと接続されていたSPIモジュールのMISOピンが動作しない時にH信号を出し続けるという恐ろしい仕様(=他のモジュールが使えない)だったため、やむなくこれを使うことに。
納品遅すぎ
注文してから1週間後に手元に着きました。
注文から4日後に横浜港郵便局から発送処理、郵便局の引受がその翌日、到着にさらに2日です。
最初のマイクロテクニカの発送が遅い、まさか注文のたびに海外から取り寄せてませんよね?国内在庫しておいて、当日もしくは翌日には発送ほしいです。
超急ぎだったのに、御社の商品が届くのが遅かったせいでお客様にご迷惑をおかけしました。遅くなるなら遅くなる旨の一報を入れてほしいです。
スレーブアドレスは0xA4ではなく、0x52
MSC-MOD20はスレーブデバイスとして動作します。スレーブアドレスは0xA4に固定されておりアドレス値は変更できません。
日本語マニュアル原文P.5
I2Cはスレーブアドレスを7bitで表現しますので、0x7F以上にはなりえません。
0xA4と見て、は?ってなりました。
これたぶん8bit目のRWを0と仮定した上で、書いてるんですよね。
だから、実際のスレーブアドレスは1010010で、使ってるマイコンによりますが、もしRWを別に指定する関数表現の場合、最初に0を置いた0101 0010 = 0x52でスレーブアドレス指定する必要があります。
というか、スレーブアドレスは7bit表現なんだから、ビットで書いてもらえませんかね。
ACKが!00\n
MSC-MOD20が正しくコマンドを受け付けた場合には、ACKが返ります。ACKは、”!00″という文字列です。(0x21,0x30,0x30,0x0A)最後の0x0Aは終端を表すラインフィードです。
日本語マニュアル原文P.8
アクノリッジ(ACK)が!00\n。。。え?
アクノリッジは1バイトデータを送った最後に付加される1ビット表現の信号です。
クロックがHのときにアクノリッジがLだったら受付、Hだったらエラー、の意味になります。
このアクノリッジがH/Lではなく、!00\nということですか・・・え??
実際にはアクノリッジはH/Lの1bit表現で、MSC-MOD20が正常処理したという意味の応答が!00\nです。
どちらもアクノリッジという言葉を使っているので、混乱を招きます。
MSC-MOD20からの応答はアクノリッジではなく、エラーコードと書いてほしいです。
受信で0が返ってくる
microSDカードが正しく初期化できると、ACKの!00が返ります。必ず初期化を実行してACKが返ることを確認してから次の操作をするように設計してください。ここで初期化に失敗して!00以外のエラーコードが返った場合、そのメディアは使えません。
日本語マニュアル原文P.10
なにかしらコマンドを送ると、!00が返るというが、実際には0が延々と続き、その後!00\nが返ってきました。
この0はエラーコードになく、何なんだろうと思ったらP.6にありました。
MSC-MOD20からマスタ機器へ送るべきデータがない時、MSC-MOD20は、0x00を常に送信します。よって、マスタ側はこの0x00を受信する時はMSC-MOD20側に送るべきデータがないことを把握できます。この0x00のことをNo Data Token(NDT)といいます。
日本語マニュアル原文P.6
おい、これをP.10に書けよ!と言いたい。
省電力モード時にRTCが動かない
MSC-MOD20はRTC内蔵でファイルにタイムスタンプを付加できます。
RTCのクロックソースとして外付けの水晶振動子を使うバックアップモードと、内臓クロックを使うシェアードモードを選択できます。
水晶振動子を持ってないので、内蔵クロックのシェアードモードを選択したが、問題は省電力時の動作状態です。
省電力モードには、スタンバイモードとストップモードの2つがあります。
スタンバイモードはシステムを完全に停止させる
ストップモードは作業状態を維持したまま低消費電力状態になる
。。。スタンバイだとRTC動かなそうだが、ストップモードだと動く?
いざストップモードにしてRTCが、、、動かない!!
MSC-MOD20は通常時に50mAも消費するので、普段は寝かせておきたいのだが。。。
省電力モード時はRTCが動かないことをマニュアルに書け!不親切なマニュアルだな、ほんとに。
追記:
水晶発振子を追加して、ストップモードで動かしたらRTC動作しました
書き込みコマンドのバイト表現
【コマンド】 W△ n>ssssssss{FH}
【動作】 指定したファイルハンドルにWモード又はAモードで開かれたファイルに、指定したサイズ分のデータを書き込む
【引数】
n 0~F データを書き込みたいファイルの開かれているファイルハンドルを指定します
ssssssss 書き込むデータサイズを16進数表記のバイト単位で指定します”FFFFFFFF”まで指定できます。すなわち4294967295バイトまで1回のコマンドでデータを書き込むことができます
【解説】 ファイルハンドルにOコマンドのWモード又はAモードで開かれているファイルに対して、データを書き込みます。Rモードで開かれたファイルに対しては書き込みはできません。MSC-MOD20はWコマンドを受信後、ACKの!00を返しその後データの受信待機状態となります。このACKがMSC-MOD20から送信されたことを確認してから、ssssssssで指定したサイズのデータを送信します。
日本語マニュアル原文P.24
書き込みバイト数はFFFFFFFFまで指定できるんだ、ってことは1バイトだったら00000001ってことかー
と思ったら、使用例では13バイト(=0x0000000D)の書き込みで、コマンドは0000000Dではなく、Dだけになっている。。。え?
このコマンドは正常に処理されると書き込んだバイト数が返ってくるんですが、こちらは0000000Dで返ってくる。
受信文字列は8バイト固定だが、コマンドでは8バイトで表現する必要がない、と明記してもらわないと使い方がわからないです。
あと、これ
【コマンド】 W△ n>ssssssss{FH}
とマニュアルにあるけど、FHじゃなくてLFね、誤記です。たぶんFH=file handleのことです。
失敗しているのにオープンコマンドが正常と返す
これは私のミスなのですが、ファイルハンドルからファイルオープンするコマンドでファイル名含めて14文字なのに、15文字としてオープンコマンドを送信。
正常と返答があるも、その後ファイルの書き込みも読み込みもできない。ずっと応答待ちで止まるのです。
どこに原因があるか分からないものの、なんだか腑に落ちない動き。
ファイル名によって送信文字数が変わるので、そこらへんの設計は丁寧に。
まとめ
MSC-MOD20の日本語マニュアルは使いやすそうで使いづらい。
コメント