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のドキュメントなども読むことができる。
慣れておくとよいだろう。

13 件のコメント:

  1. 初めまして、コメント失礼致します。趣味で電子工作をしている、ヒダカヒロジと申します。

    RC-S620/SとArduinoを使って、NFCチップからのデータの読み取りを行いたいと思っています。対象のNFCを調べてみたところ、どうも通信方式がType Aのようで、SONY様が公開されているライブラリとサンプルソースでは読み取ることができませんでした。

    RC-S620/Sは仕様上はType Aにも対応しているようなので、何か方法がないか探していたところ、hirokuma様が公開されていた以下のページに辿り着きました。
    https://sites.google.com/site/hiro99ma/nfc/experiment/arduino-nfc/rc-s620-s-library

    hirokuma様が公開されていたgithubのライブラリをArduinoのlibraries以下にインストールして利用しようとしてみましたが、cstringやcstdlibのincludeでファイルが見つからないとエラーになってしまいました。初歩的な質問で申し訳ないのですが、このエラーを回避する方法はございますでしょうか。また、このライブラリを使用すれば、Type Aからのデータの読み取りは行えるでしょうか(書き込みを行う予定はありません)。

    お手数をおかけしてしまい大変申し訳ありませんが、ご教授頂けますと幸いです。宜しくお願い致します。

    返信削除
    返信
    1. なくてもよさそうなので、削除してみました。
      すみませんが、もう一度githubから取り直して、試していただけますか。

      >このライブラリを使用すれば、Type Aからのデータの読み取りは行えるでしょうか
      できるような気はしますが、あまり動作確認をしたライブラリではありません。
      不具合があるときは、できれば修正してご連絡いただけると助かります。

      削除
    2. ご返信頂きありがとうございます。取り直したライブラリで同封されていたサンプルコードのtype指定の部分をType Aに変えてみたところ、無事に検出のLEDが点灯致しました。

      読み取りについてはこれから検証していきますが、もし不具合がございましたら、ご連絡させて頂きます。

      取り急ぎ、ありがとうございました!

      削除
    3. ご確認ありがとうございます。
      動いてよかったです。

      今まで指摘がなかったので、当時はビルドできていたか、初めてArduino版を使っていただけているかのどちらかだと思います。。。

      削除
    4. お世話になっております。その後色々試してみたところ、UIDの取得はできたのですが、HkNfcA::read()で失敗してしまいました。"HkNfcA.cpp"でログを出すようにすると、"read fail 1"と出ますので、"Key A Authentication"の部分で失敗しているようです(正確には、その中のNfcPcd::inDataExchange、さらにその中のsendCmdのretが0になってしまいます)。
      私がNFCを使うのが初めてで、仕様や通信シーケンスをきちんと理解しないままに使ってしまっているためかと思うのですが、一旦はUIDさえ分かれば(NFCチップの区別さえできれば)自分のやりたいことはできそうなので、まずはUIDを使って工作を進めたいと思います。
      ありがとうございました。

      削除
    5. ご連絡ありがとうございます。
      ソースを見たところ、MIFARE Ultralightなどではなく、MIFARE Classic向けの実装になってしまっているようです。

      C++版はUltralightのカードを持っていないときに行っていたようで、C版の方では別のAPIでアクセスするようにしていました。
      https://github.com/hirokuma/libhknfcrw_c/blob/master/src/HkNfcA.c#L140

      格好が悪いですが、もしReadの必要があれば上記を参考に改造していただければと思います。

      削除
    6. ご確認いただき、ありがとうございます。確かに、ログ出しをしている時に"MIFARE Ultralight"という文字列が出力されていたので、そちらの実装に変える必要がありそうです。

      改造指針までご提示頂きありがとうございました!少し先になりそうですが、改造するか、もしくはそのままでも工作が一通り形になりましたら、改めてご連絡させていただきます。

      削除
    7. あまり動作確認してませんが、Ultralight対応っぽいことをしてみました。
      使う場合はお試しください。
      http://hiro99ma.blogspot.jp/2016/03/arduino-uno.html

      気になったから対応しただけですので、使わなくても大丈夫です!

      削除
  2. お世話になっております、ヒダカヒロジです。ご連絡が遅れてしまい、大変申し訳ありませんでした。

    少し時間がかかってしまいましたが、おかげさまで自分が作りたかったものを作ることができました。ありがとうございました!以下にその内容を書かせていただきました。

    http://make-muda.weblike.jp/2016/05/3755/
    http://make-muda.weblike.jp/2016/05/3917/

    最終的にやはりUIDで処理することにはしたのですが、修正いただいたライブラリでType A Ultralightの情報を読み出せることも確認いたしました。ご対応頂き、ありがとうございます。

    この度は大変お世話になりました。ありがとうございました◎

    返信削除
    返信
    1. ご連絡ありがとうございます!
      記事、読みました~。

      私が、説明だけしてモノを作らない方なので、こうやって形になっていると素直に「いいなー」と思ってしまいます。

      削除
    2. 大変ご無沙汰しております、以前にArduino版のRC-S620Sのライブラリの件でお世話になりましたヒダカヒロジです。

      Hirokuma様のライブラリのおかげで、また新しい作品を作ることができました。ありがとうございました。宜しければ、お時間のあるときにでもご覧いただければと思います。
      https://www.youtube.com/watch?v=76jjDvL2Nag&t=9s

      以上、宜しくお願い致します。

      削除
    3. 動画見ました!
      いやあ、Arduinoでここまで音が出せるんですね。
      すごいです。

      あと、NFCライブラリが大きくて済みません。。。

      削除
    4. いえ!お世話になっておきながら何だか申し訳ありません(--;

      今回はArduino LCD Screenライブラリという大物(?)と組み合わせてしまったのがそもそもの原因なので、通常使用では全く問題ありません。むしろ補って余りあるぐらいありがとうございます、という気持ちですm(_ _)m

      削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。