【Felicaを使う】Felicaリーダー・ライターとFelica Plug の通信プロトコル
吉田は『回想十年』の中で、彼らしい好悪の強さをにじませて、マッカーサー司令部にも二つのグループがあったと語っている。 ものごとの道理をわきまえ、勝者と敗者を超えて相互に理解と信頼をもちあえるマッカーサーとその側近の軍事グループ、 そして急進的な改革の情熱に突き動かされて日本の実情を無視した乱暴な要求を仕かけてくるニューディーラーたちである。吉田は前者と協力関係を築き、後者とはつきあわなかった。
ケーディスの民政局は、保守政治を忌避して、鳩山追放を強行した結果、意図に反してもっと手ごわい保守外交官を政権につかせることになってしまった。
日本の近代6 戦争・占領・講和 P287より引用
前回はGR-KURUMIとFelica Plugを接続し、データの送受信を行う方法を説明しました。
ですが、データを単に送受信するだけでは通信は出来ません。
データは規格に従ったデータ構造を持ち、適切なタイミングで送受信されと通信は成立しません。
今回はFelicaリーダー・ライターとFelica Plug の通信プロトコルについて説明します。
今回のシステムは以下の構成になっています。
RX62Nマイコン ⇔ Felicaリーダー・ライター ⇔ Felica Plug ⇔ RL78マイコン
これらの機器間において、通信プロトコルは以下のようになっています。
まずRX62NマイコンはRFConfigurationコマンドを送信することによりFelicaリーダー・ライターの初期設定をしています。
この初期化をしないとFelicaリーダー・ライターはFelicaカードやFelica Plugを認識しません。
コマンドの詳細は別記事で説明しますが、RFConfigurationコマンドは1つにつき1個のパラメータしか設定できないので、必要なパラメータの分だけ複数回送信する必要があります。
次にRX62NマイコンはInListPassiveTargetコマンドを送信します。Felicaリーダー・ライターはこのコマンドを受信すると、Pollingコマンドを無線送信し、FelicaカードやFelica Plugを探索します。
ここでFelicaカードやFelica Plug を検知するとは、Felicaリーダー・ライターはPollingレスポンスを受信することを意味します。Felicaリーダー・ライターはPollingレスポンスを受信すると、RX62Nに対してInListPassiveTargetレスポンスを送信します。
私のプログラムではInListPassiveTargetコマンドに対するレスポンスがあるまで、繰り返しこのコマンドを送信するようにしています。
Felica PlugがFelicaリーダー・ライターに近づくと、磁気検出し、RFDET信号がLOWになります。これを検知したRL78マイコンは初期化コマンドをFelica Plugに送信します。
これによりFelica PlugはPollingコマンドを受信した際に、Pollingレスポンスを送信できるようになります。 (上の図では、Felica Plug初期化していないときにPollingコマンドを受信しても、何の応答も返していません。)
Felica PlugとFelicaリーダー・ライター間のデータ送受信はCommunicationThruEXコマンドを用いて行います。
Felica Plug側へデータを送信したいときはWrite Without Encryptionコマンドを使い、Felica Plug側からデータを受信したいときはRead Without Encryptionコマンドを使います。
CommunicationThruEXコマンドのデータ構造は以下のようになっています。
RX62NはCommunicationThruEXコマンドのData outにFelicaコマンドを格納して、Felicaリーダー・ライターへ送信します。
するとRL78は、Felica PlugからこのData out、Felicaコマンドを受信します。Felicaコマンドを受信するとFelica PlugのIRQ端子がHighになり、RL78へ受信データがあることを報せます。
RL78(HOST CPU)ではオレンジ色の部分のみが受信データとして確認できます。
そして、RL78がFelica plugへ送信したFelicaレスポンスはCommunicationThruEX応答のData inに格納され、RX62Nが受信します。
RL78(HOST CPU)ではオレンジ色の部分のみ用意して送信すれば、残りは自動的に生成してくれます。
このFelicaコマンドとFelicaレスポンスは、ブロックリストとブロックデータという構造を持ちます。
(Felica PlugユーザーズマニュアルP49参照)
ブロックリストは複数のブロックエレメントから構成されます。
1個のブロックに対して1個のブロックエレメントが存在します。よってt個のブロックを持つブロックリストは、先頭にt個のブロックエレメントが配置されています。
送信するブロックの数が256個以上ならばブロックリストは3bytesで、255個までならブロックリストは2bytesになります。
ブリックリストに続いて、必要ならばブロックデータが配置されます。1ブロックは16bytesのデータを持ちます。
また、ブロックエレメントは以下の構造を持ちます。
ここでブロックエレメントの1byte目をD0、2byte目をD1、3byte目をD2と表記します。
ブロックリストエレメント2bytesの場合
bit | 名称 | 内容 |
---|---|---|
D0のbit7 | 長さ | ブロックリストエレメントの長さ 0:ブロックリストエレメントは2bytes |
D0の[bit6:bit4] | アクセスモード | Felica Plugは000b固定 |
D0の[bit3:bit0] | サービスコードリスト順番 | Felica Plugは0000b固定 |
D1 | ブロック番号 | このブロックリストエレメントに対応するブロック番号 |
ブロックリストエレメント3bytesの場合
bit | 名称/th> | 内容 |
---|---|---|
D0のbit7 | 長さ | ブロックリストエレメントの長さ 1:ブロックリストエレメントは3bytes |
D0の[bit6:bit4] | アクセスモード | Felica Plugは000b固定 |
D0の[bit3:bit0] | サービスコードリスト順番 | Felica Plugは0000b固定 |
D1 | ブロック番号 | このブロックリストエレメントに対応するブロック番号 の下桁(リトルエンディアンなので) |
D2 | ブロック番号 | このブロックリストエレメントに対応するブロック番号 の上桁(リトルエンディアンなので) |