2015/03/20

[felica]FeliCa Linkを動かす

FeliCa Linkの件をいろいろ考えたが、現状でよいような気がしている。
なので、現状でどうやっているかの記録を残しておこう。


配線は、こう。

image

回路図エディタ:水魚堂オンライン
Arduino UNO回路LIB(NUCLEOとして使った):bsch3v向けArduino UNO回路図作った - ねぎらぼ

FeliCa Linkの回路LIBはここに置いてみました。
見えるかな?


mbedのライブラリはこんな感じで作った。
ロジアナで記録したのは、これらの関数。
「RETRY_NUM」は5だ。
プログラムは、ByteWrite()→RandamRead()の順で呼んだだけ。メモリアドレスは0x01、書込む値は0x41だ。

 

書くほう

int RCS730::ByteWrite(uint16_t MemAddr, uint8_t Data)
{
    int ret;
    int retry = RETRY_NUM;
    char buf[3];
    buf[0] = (char)(MemAddr >> 8);
    buf[1] = (char)(MemAddr & 0xff);
    buf[2] = (char)Data;
    do {
        ret = mI2c.write(mSlvAddr, buf, (int)sizeof(buf));
    } while ((ret != 0) && (retry--));
    return ret;
}

 

読むほう

int RCS730::SequentialRead(uint16_t MemAddr, uint8_t *pData, int Length)
{
    int ret;
    int retry = RETRY_NUM;
    char buf[2];
    buf[0] = (char)(MemAddr >> 8);
    buf[1] = (char)(MemAddr & 0xff);
    do {
        ret = mI2c.write(mSlvAddr, buf, (int)sizeof(buf), true);
    } while ((ret != 0) && (retry--));
    if (ret == 0) {
        ret = mI2c.read(mSlvAddr | 1, reinterpret_cast<char*>(pData), Length);
    }
    return ret;
}


まず、書く。

image

image

何回か波形を取ったが、1回だけリトライ4回目で成功、それ以外は3回目で成功だった。

 

そして読む。

image

書いた直後に読もうとしているので、書き込み完了までの間はACKポーリングになってる。


そういうわけで、初回アクセスできるまでのところ以外は、意図した通りに動作しているようだ。

 

稼動になるまでのNACKも、もうACKポーリングの一環とみなしてしまおうか、という気になっている。
I2Cでアクセスしたいのは、通常はメモリを読み書きしたいときか、ホストスルーでのアクセス時くらいしかない。
メモリをホストから読み書きするのは、リトライでカバーする。
ホストスルーの場合は無線経由で稼動状態になるので、ホスト側でカバーする必要が無い。
ホストからメモリアクセスするのは、そうそう頻繁にやるものではない(用途に因るだろうけど)ので、時間にシビアなシーンが発生しにくいとみなすと、まあ、困るものでもないんじゃないだろうか。

リーダライタが使えるタイプのFeliCa Linkが出たりしたら、また考えましょうかね。

2 件のコメント:

  1. 匿名14:02

    最近RC-S730の存在を知り、いじり始めたところなのですが、やはりACKが返ってきません。
    記事を参考にタイミングやリトライを繰り返してみるのですが、一切ダメです。
    壊したのかなと思い、追加で2個発注してみたので、そちらに期待しています。
    もし、何かポイントがあれば教えていただけると助かります。

    返信削除
    返信
    1. かなり忘れていますが、思いついたところを。。。

      ・まずRFDETだけ試す
      RFDETは電源がつながっていれば動くみたいなので、そこにLEDなりロジアナなりをつないで、搬送波を近づけるなどして「まったく動いてないことはないな」を見てました。

      ・I2C
      私がいつもはまるのは、I2Cのプルアップ抵抗です。
      計算方法はぜんぜんわからないのですが、適当に上げたり下げたりしてみてます。
      ここでは4.7kΩにしていますが、うちのセットではこれで動いた、というだけです(電源は3.3V)。

      削除

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

注: コメントを投稿できるのは、このブログのメンバーだけです。