記事

【Java Ring】05. CRC エラー!

iB-IDE と 1-Wire API の挙動を追い,Java Ring との通信で何が起きているのか整理します。

 前回の​記事では,​古の​依存関係を​乗り越えて​ iB-IDE を​起動する​ところまで​進めました。​ 今回は,​iB-IDE から​ Java Ring に​話しかけた​とき,​内部で​何が​起きているのかを​整理します。

とりあえず試してみたけど…#

 iB-IDE には​ APDU を​送信する​機能が​あった​ため,とりあえず Get Firmware Version ID を​してみました。​ おそらく,​指輪から​ファーム・ウェアの​バージ​ョンが​帰ってくるのでしょう。

Get Firmware Version ID のエラー

ウーン。

 CRC に​関連する​エラーが​発生しているようです。

検算を​してみよう#

 一旦​手元で​チェック・サムを​計算してみる​ことにしました。

 指輪からの​応答は,​以下のような​バイト列でした。

55 16 94 03 07 00 00 00 D0 E1 FE FF FF FF FF FF

 命令の​開始が​必ず 55 である​ことは​仕様書に​明記されており,​実際に​返答も​ 55 から​始まっています。​ その​ため,​私の​ Java Ring が​(ファームごと)​回復不可能な​ほど​壊れている,と​いう​ことはなさそうです。

 これを​ Dallas 式の​ CRC に​入れ,​得られた​結果が​ 45057 で​あれば​良いらしいようです。

CRC の検証

 な​お,​CRC の​式は​次の​通りです。

CRC の式

 さて,​計算してみると,​結果は​ 45057 ではなく​ 57343 でした。​ なんででしょう。

状況把握#

 ​最初は​ CRC の​計算か,​あるいは​ Java Ring 自体が​壊れているのかと​思っていました。​ しかし,​標準出力を​差し挟むなどして​デバッグしてみると,​どうも​話は​もう​少し​複雑でした。

 実際には,​CRC チェックは​計 2 回走っています。​ そして,​最初の​ CRC は​成功しており,​2 回目の​ CRC だけが​失敗しているようです。

ステータス取得時のログ

 ログを​見ると,​最初に​次のような​応答が​返ってきています。

0x55, 0x16, 0x94, 0x03, 0x07, 0x00, 0x00, 0x00,
0xD0, 0xE1, 0x08, 0x00, 0x40, 0x00, 0x70, 0x49

 ​これは​ CRC チェックに​通っています。​ したがって,​少なくとも​最初の​ステータス取得の​時点では,​Java Ring から​意味の​ある​応答が​返ってきているようです。

Power-On Reset に​失敗#

 ログを​もう​一度​見てみると,​どうやら​ Power-On Reset​(POR)に​失敗!と​いう​表示が​1番最初に​出ている​ことが​分かります。

 POR とは,​マイコンの​電源投入直後に​発生しうる​中途半端な​状態を​捨て,​まっさらな​状態で​動か​すための​処理です。​ 私の​指輪では,​この​ PORンい​複数回失敗しているようで,​しかも​これが​原因で​ CRC エラーに​つながっているようです。

挙動を​整理#

 さて,​最初の​電源投入から​エラーまでの​流れは​こうです。

  1. 1-Wire API が​ Java-powered iButton を​認識する。
  2. checkStatus から​ getStatus が​呼ばれる。
  3. 0x55,​つまり​ MATCH ROM を​使って​宛先を​指定し,​ステータス取得命令を​発行する。
  4. Java Ring から​ステータス応答が​返る。
  5. その​応答は​ CRC チェックに​通る。

 返ってきた​応答は​,​ざっくり見ると​次のような​構造に​なっています。

ROM コマンド | ROM ID | 命令名 | 引数・応答

 ステータス命令の​応答と​しては,08 00 40 00 が​返ってきています。​ このうちステータス 40 が​意味する​ことは,​即ち​「POR を​正すために​デバイスを​リセットしろ」と​いう​ことです。

やはり​ POR を​正そうと​して​失敗している#

 ステータス 40 を​受けて,correctPOR メソッドが​呼ばれます。​ この​メソッドは,​おおむね次の​処理を​呼び出します。

  1. reset
  2. setStatus(試行回数)
  3. run(試行回数)

 reset メソッドは,​デバイスに​ 0xDD, 0xBC, 0x92 を​送りつけて​リセットを​要求するようです。​ 他 2 つの​メソッドに​ついては,​この​時点では​まだ​調査中です。

 問題は​その後です。​ POR 補正の​ための​処理を​行った​あと,​再度 checkStatus 内で​ステータス取得と​環境適合作業が​行われます。​ この​とき,なぜか​デバイスからは,​ほとんど​すべてが​ FF に​なるような​値が​返ってきます。

55 16 94 03 07 00 00 00 D0 E1 FE FF FF FF FF FF

 そうして,​2 回目の​ CRC チェックに​失敗する,と​いうのが​一連の​流れのようです。

いったん整理#

 ここまでで​分かった​ことを​整理します。

  1. 最初の​ステータス取得では,​Java Ring から​意味の​ある​応答が​返ってきている。
  2. 最初の​ CRC チェックは​成功している。
  3. ステータス 40 に​より,​POR 補正の​処理が​走る。
  4. POR 補正後の​再ステータス取得で,FF まみれの​応答が​返る。
  5. その​ 2 回目の​応答で​ CRC チェックに​失敗している。

 詳しくは​まだ​分かりませんが,​少なくとも全く​通信できていないわけではなさそうです。​ 調査を​続ける​ことにします。

まとめ#

いかがでしたか?

 この​記事では,​Java Ring が​ Java-powered iButton と​して​扱われている​ことを​確認し,​通信を​試みました。​ 応答を​得ようと​しても,​謎の​ CRC エラーに​よって​阻まれてしまいました。​ 次回は,​この​あたりを​もう​少し​掘ってみたいと​思います。

ではでは。

前回: 【Java Ring】04. iB-IDE を​動かす
次回: 【Java Ring】06. バッテリー交換が​必要らしい