FeliCa Linkの件をいろいろ考えたが、現状でよいような気がしている。
なので、現状でどうやっているかの記録を残しておこう。
配線は、こう。
回路図エディタ:水魚堂オンライン
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;
}
まず、書く。
何回か波形を取ったが、1回だけリトライ4回目で成功、それ以外は3回目で成功だった。
そして読む。
書いた直後に読もうとしているので、書き込み完了までの間はACKポーリングになってる。
そういうわけで、初回アクセスできるまでのところ以外は、意図した通りに動作しているようだ。
稼動になるまでのNACKも、もうACKポーリングの一環とみなしてしまおうか、という気になっている。
I2Cでアクセスしたいのは、通常はメモリを読み書きしたいときか、ホストスルーでのアクセス時くらいしかない。
メモリをホストから読み書きするのは、リトライでカバーする。
ホストスルーの場合は無線経由で稼動状態になるので、ホスト側でカバーする必要が無い。
ホストからメモリアクセスするのは、そうそう頻繁にやるものではない(用途に因るだろうけど)ので、時間にシビアなシーンが発生しにくいとみなすと、まあ、困るものでもないんじゃないだろうか。
リーダライタが使えるタイプのFeliCa Linkが出たりしたら、また考えましょうかね。
最近RC-S730の存在を知り、いじり始めたところなのですが、やはりACKが返ってきません。
返信削除記事を参考にタイミングやリトライを繰り返してみるのですが、一切ダメです。
壊したのかなと思い、追加で2個発注してみたので、そちらに期待しています。
もし、何かポイントがあれば教えていただけると助かります。
かなり忘れていますが、思いついたところを。。。
削除・まずRFDETだけ試す
RFDETは電源がつながっていれば動くみたいなので、そこにLEDなりロジアナなりをつないで、搬送波を近づけるなどして「まったく動いてないことはないな」を見てました。
・I2C
私がいつもはまるのは、I2Cのプルアップ抵抗です。
計算方法はぜんぜんわからないのですが、適当に上げたり下げたりしてみてます。
ここでは4.7kΩにしていますが、うちのセットではこれで動いた、というだけです(電源は3.3V)。