記事
【Java Ring】05. CRC エラー!
iB-IDE と 1-Wire API の挙動を追い,Java Ring との通信で何が起きているのか整理します。
前回の記事では,古の依存関係を乗り越えて iB-IDE を起動するところまで進めました。 今回は,iB-IDE から Java Ring に話しかけたとき,内部で何が起きているのかを整理します。
とりあえず試してみたけど…#
iB-IDE には APDU を送信する機能があったため,とりあえず 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 の式は次の通りです。

さて,計算してみると,結果は 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-Wire API が Java-powered iButton を認識する。
checkStatusからgetStatusが呼ばれる。0x55,つまり MATCH ROM を使って宛先を指定し,ステータス取得命令を発行する。- Java Ring からステータス応答が返る。
- その応答は CRC チェックに通る。
返ってきた応答は,ざっくり見ると次のような構造になっています。
ROM コマンド | ROM ID | 命令名 | 引数・応答
ステータス命令の応答としては,08 00 40 00 が返ってきています。
このうちステータス 40 が意味することは,即ち「POR を正すためにデバイスをリセットしろ」ということです。
やはり POR を正そうとして失敗している#
ステータス 40 を受けて,correctPOR メソッドが呼ばれます。
このメソッドは,おおむね次の処理を呼び出します。
resetsetStatus(試行回数)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 チェックに失敗する,というのが一連の流れのようです。
いったん整理#
ここまでで分かったことを整理します。
- 最初のステータス取得では,Java Ring から意味のある応答が返ってきている。
- 最初の CRC チェックは成功している。
- ステータス
40により,POR 補正の処理が走る。 - POR 補正後の再ステータス取得で,
FFまみれの応答が返る。 - その 2 回目の応答で CRC チェックに失敗している。
詳しくはまだ分かりませんが,少なくとも全く通信できていないわけではなさそうです。 調査を続けることにします。
まとめ#
いかがでしたか?
この記事では,Java Ring が Java-powered iButton として扱われていることを確認し,通信を試みました。 応答を得ようとしても,謎の CRC エラーによって阻まれてしまいました。 次回は,このあたりをもう少し掘ってみたいと思います。
ではでは。
前回: 【Java Ring】04. iB-IDE を動かす
次回: 【Java Ring】06. バッテリー交換が必要らしい