2015/03/29

[felica]FeliCa Linkの読み書き時I2Cパケット

前回「動いた」と記事にはしたのだが、それだけだと味気がないので波形を取った。
が、それを全部載せるとわかりにくくなるので、ロジアナにパケットだけを抜き出してくれる機能があったから、それを使ってみた。
なお、うちのロジアナはZeroPlusのLAP-Cだ。

今回は、Plugモードで動かし、R/WからはPage0へRead without Encryptionを行っている。

image

image

以下で、簡単に説明をしていく。
ユーザマニュアルの「7.2.2 FT転送設定」を参照しながら読んでいただくとよろしいか。

IRQの立ち下がりをトリガにしてキャプチャしている。
なお、FeliCa Linkのデフォルト状態ではIRQ割込設定(割込マスクレジスタ)は全部マスクしてあるので、どこかで許可させる必要がある。
マスク設定はNon-Volatileで保持されるので、一度変更しておけばよい。
外すマスクは、ユーザマニュアルの推奨に合わせてint_tag_rw_rx_done2にした。

作ったソフトでは、mbedの起動時にPlugモードへの変更(動作モード設定レジスタ)とマスクの設定を行い、IRQ待ちにしている。
そして、R/WのPaSoRiからRead without Encryptionを行っている。
Androidとかで試すと準備がいらなくてよいのだが、どういうアクセスの仕方をされるかわからないので、Windowsで作ったアプリを使ってアクセスさせた。

 

IRQ割込が来たときには、既にメモリの0x0C00から読み込んだデータが入っているので、それを読込む。
のだが、まずは割込み要因を調べるため、割込ステータスレジスタ(0x0B28)を4byte読込んでいる。
なおレジスタアクセスは、アドレスはビッグエンディアンで書込み、レジスタ値はリトルエンディアン(4byte)になっている。
よってここでは、0x00000008が読み込めたことになる。

int_tag_rw_rx_done2での割込だったことがわかるので、ようやく0x0C00のデータを読みにいく。
ここでは、まず12byte読込み、まだ読込む必要があれば再度読込みにいっている。
が・・・なんだこの12byteって・・・。
返信するときのデータ長が最短でも12byteになるから、それと間違えているな。
R/Wから来るデータの最短は16byteになるので、あとで修正しておこう。
mbedの汎用I2C APIを使っているからこういう書き方にしたが、自分でI2C含めて書くのだったら、最初の1byteでLENを取って、あとはLEN-1回回すような作りにするだろうな。

image

ブロックリストは、本来2byteタイプと3byteタイプがあるのだが、R/W側のアプリは2byteタイプでしかアクセスしに来ないので、割り切って作っている。

 

レスポンスデータも、同じく0x0C00に書込むことになっている。
ただ、いくつかのデータについてはFeliCa Linkが自動で作成することになっているので、ここでは変更が必要なところしか書き換えていない。
上の図でいえば、白い部分(ST1, ST2, ブロックデータ)が必要な箇所になる。
レスポンスデータの書き込みが終わったら、FeliCa Linkにそのことを通知(タグモード送信制御レジスタ)のtag_rf_send_enableに1を立てて書込む。
そうすることで、FeliCa LinkはR/Wにレスポンスを返してくれる。

最後に、割込クリアレジスタに書込んで、割り込み要因を消している。
この動作が必要かどうかは調べてないのだが、わざわざ用意しているくらいだからやるんだろう。
IRQ端子の説明としても、マスクされていない割込が1つ以上発生している場合、となっている。
このレジスタに書込んでから25usecくらい後にIRQ=Hになっているから、やるのかな。

 

Write without Encryptionの場合は、こんな感じ。
スレーブアドレス0x3Eはデバッグで使っているLCDなので、気にしないでおくれ。

image


なお、ここには出てこないが、RFDETは特に使っていない。
割込はさせてるけど、それでLEDを点灯させている程度だ。

0 件のコメント:

コメントを投稿

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