2012/01/28

[rcs620s]RC-S620/S簡易ドキュメントを読む

SONY技術情報サイトにある、RC-S620/S簡易ドキュメント2本。
簡易説明の説明なんか書いても仕方ないかなー、と思ったが、自分のために書いておこう。


RC-S620/S 製品仕様書<簡易版>

p.3

用語について書かれている。
「コントローラ」というのは、リーダライタを制御するパソコンのような意味だ。
シリアルでコマンドを送受信してやらないといけない機器、ということですな。

 

2.ハードウェア仕様

RC-S620/Sの持つ機能や、どうやって接続したらいいかが書かれている。
最初に迷うのは、フラットケーブルが片面なのだけど、どっちに挿せばいいの?だと思う。
間違うと、壊す・・・ことはないが、通信できないので困る。

これは、「2.6 外形寸法」を見るとよい。p.13だ。
左側に、コネクタ側から見た図がある。
破線がコネクタ接点と書かれているので、金属板側に接点があるのだ。

1ピンの位置も確認しておくこと。
私はこの確認が不十分で、1台壊してしまった。

もう1つ注意する点がある。
RC-S620/Sをカードにかざす面は基板がある側だ、ということ。
金属面ではないのだ。
見た目上、金属面にカードをかざしたくなるが、そこは我慢だ。
なんでそうなっているかというと、機器に組み込む際、金属面からネジを打ち込むからだ。
だからおそらく、金属面側は電波が漏れないようにカバーされているんじゃないだろうか。
ともかく、基板側にカードをかざすこと。

「2.3 UART通信仕様」も知っておかないと通信できまい。
なしなしの115200bpsだ。
通信速度を変更したい場合は、RC-S620/Sにボーレート変更のコマンドを送信しなくてはならないのだが、そのコマンドは説明がなかったと思う。
まあ、困らないと思うのでそのままでいいんじゃないかね。

2.4.2に電気的特性がある。
電池で駆動させたいときには、気になるだろう。
もちょっと消費電力が落ちてくれればなー、という気はするが、そういうときにはソフトパワーダウンさせるよりも、電源ごとOFFにして使うときに初期化し直した方がいいだろう。


RC-S620/S コマンドリファレンスマニュアル<簡易版>

p.7

基本ルール。
コントローラから送信したコマンドに対するレスポンスは返すけれども、勝手に送りつけることはないよ、ということ。

p.8

ここから、RC-S620/Sへ送信するフレーム形式が書かれている。
また、RC-S620/Sから送信されるフレーム形式も同じフォーマットだ
ここの「データ部」が、コマンドだったりレスポンスだったりする。

NormalフレームとExtendedフレームがある。
Normalフレームはデータ部が256byteまで、Extendedフレームはデータ部が265byteまで。
私なんかは、たった9byteしか変わらないならNormalだけでいいやん、と思っているのだが、なかなかそうもいかない事情がある。

PreambleとかPostambleとか出てくるが、これは通信パケットでよく使われる言葉だ。
カード側の仕様書にも、同じようにPreambleなどが出てきたと思うが、あれは無線側なので有線側とは関係がない。

p.10

ACKフレーム。
Acknowledgeのことだが、だいたいどこでも「ACK」(あっく)と呼ぶみたいだ。
いろいろな意味があるので、読んで把握すべし。

 

p.11 通信プロトコル

ここから、どうやってフレームをやりとりするのかの説明になる。
エラーが戻る、戻らないなどは、どの層の通信にエラーがあるかで変わってくる。

p.12 データリンクレベル

データリンクレベルでは、p.8から書かれていたフレームのフォーマットが正しければよい。
正しければ、データ部を見ずにACKフレームを返す。
つまり、ACKが返ってこないということは、フレームが間違っているということになる。
自分でコマンドを送信する際は、まずACK返信の有無を確認すること。
ACKを返さないパターンは、p.13に書かれている。

RC-S620/Sは、コマンドを受信してから最大でも3.5msで応答を返す。
コントローラ側でタイムアウトを設定したい場合は、これに通信速度*(コマンド長+ACK長)の時間を加えたものになるであろう。

ACKを返してきてからレスポンスが返ってくるまでの時間は、コマンド依存だ。
すぐ返すものもあれば、何かあるまで返さないものもある。

p.14に、RC-S620/Sのタイムアウト時間が書かれている。
データ部からポストアンブルまでの時間なので、データ部長+2byte。
Normalフレームの場合、データ部は最大256byte。
通信速度が115200bpsの場合、1byteはUART10bitなので86us。258byteなら22.1ms。
よほどたらたらと送信しない限りは大丈夫なはずだ。

p.15 アプリケーションレベル

アプリレベルのコマンドを処理している間に、ホストからACKか異なるコマンドを送信すると、現在実行しているコマンドを中断するので、詳細を確認すべし。
ACKで中断させた場合は、1ms以上待ってから次のコマンドを送信すること。

アプリレベルの場合、シンタックスエラーを返すことがある。
もちろん、データ部が間違っているからである。

 

p.16 モード

今までは通信レベルの話だったが、ここはRC-S620/Sが持つ状態について書かれている。
全部で7つのモードがあるので、意識すべし。
ここでは0と6についてしか書かれていないが、RC-S620/Sを購入後に入手する資料では、他のモードについても書かれている。

このドキュメントは、モード6の「Initiatorモード」のみ書かれている。
Initiatorというのは、カード側にコマンドを送信する方である。
カード側は、Target、と呼ばれる。

 

p.18 コマンド一覧

ここからは、データ部に詰めるコマンドとそのレスポンスについて書かれている。
自分でプログラムを作る場合、送信は「コマンド部を作成するところ」と「データ部からフレームを作成するところ」を作り、受信は「フレームからデータ部を抜き出す」「データ部を解析する」を作ることになるだろう。

このドキュメントでは、4つのコマンドが説明されている。

  • RFConfiguration
  • Reset
  • InListPassiveTarget
  • CommunicateThruEX

最初の2つは、RC-S620/Sの初期化や状態を戻すのに使われる。

InListPassiveTargetは、いわゆる「ポーリング」を行う。
「Passive Target」というのは「受動的なTarget」ということで、普通はカードを指す。
このコマンドを使って、モードを0から6に変化させる。
この動作を「Targetを捕捉する」ということもある(Type-Bは捕捉するタイプではないという話を聞いた)。

CommunicateThruEXは、捕捉したTargetにコマンドを送信するコマンドだ。
例えばFeliCa Liteカードのデータを読みたいなら、InListPassiveTargetでカードを捕捉し、CommunicateThruEXで"Read Without Encryption"を送信することになる。
そうすると、CommunicateThruEXのレスポンスに"Read Without Encryption"のレスポンスが載ってくる。

各コマンドの詳細は、省略する。
FeliCa Developers' BlogのRC-S620/Sサンプルのソースを読むと、どういう順番でコマンドを使えばよいか、コマンドの作り方、フレームの作り方など、基本的な部分はわかる。

Resetは、レスポンスが返ってきた時点でリセットされるのではなく、その次にコントローラからのACKを受信したときに行われるので、注意しよう。

InListPassiveTargetは「結局Initiator Data部に何を書けばいいのよ」と思われそうだ。
私の認識では、BrTyによって無線送信速度とTargetを決め、Targetの種類によってInitiator部をどう使うかR/Wが決めてうまいこと無線コマンドを送信している。
例えばFeliCaの場合、POL_REQという無線コマンドを送信するのだが、そのパケットをInitiatorDataに書いてやる。

[0] 0x00 (POL_REQコマンド)
[1] SystemCodeの上位
[2] SystemCodeの下位
[3] Request Code
[4] TimeSlot

とりあえず実行するなら「0x00 0xFF 0xFF 0x00 0x00」でよい。
詳細は、FeliCa LiteやFeliCa Standardのユーザーズマニュアルにある「Pollingコマンド」の説明を読むとよい。

もちろん、InListPassiveTargetでType-AやType-Bも見つけることができるので、興味がある方は探してみるとよいだろう。

CommunicateThruEXは、ちょっと特殊なコマンドだ。
R/Wに送るコマンドの中に、Targetへ送るコマンドを含める。
そのため、Target側のタイムアウトも考慮しなくてはならず、パラメータにTimeoutがある。
FeliCa Developers' Blogのサンプルでは、FeliCa携帯電話にURLをPUSHするようになっているが、PUSHするデータは携帯電話(=Target)に送信するため、CommunicateThruEXを使っている。
このコマンドは、Targetへのデータ(DataOut)に255byteまで載せることができる。そのときのコマンド長は259byte。256byteを超えてしまうので、Extendedフレームが必要になるのだ。


ざーっと流して読んでいったが、なんとなくわかっただろうか。

R/Wのドキュメントはだいたいこんな作りになっているので、見慣れるとPN533のドキュメントなども読むことができる。
慣れておくとよいだろう。