M24SRへの書き込み手順がわかったので、メモしておくことにします。
手順そのものはISO14443AとNDEF Type 4 Tagに準拠したものなので、両標準資料を読んでおえば理解が深まります。手順は最後のDeselectの応答までキチンと読み取ることが重要です。Deselectコマンドを送信しただけだと、タグデータへのアクセス権はまだI2C側に与えられてままになっています。応答を読み取ることで、I2C側に与えられたアクセス権が解除されます。
Deselectを忘れるとI2C側がアクセス権をつかんだままになってしまうので、RF側からスマホやタブレットでアクセスしてもデータが読み取れないので注意。
- KillRFsessionコマンドを送る
M24SRではRF側とI2C側の両方からタグデータに対してのアクセスが可能ですが、両方か同時にアクセスすることはできません。アクセス手順に先立って、まずはアクセス権を取得しておく必要があります。I2C側からKillRFsessionを送ることで、I2C側からのアクセス権を取得することができます。このコマンドは、進行中のRFアクセスがある場合には、それを中断してI2C側のアクセス権を取得してくれます。このコマンドの送信は、具体的にはコマンドデータとして 0x52の1バイトを送信してやるだけです。 - NDEF Tag Application Select commandを送信する
NDEF TAG applicationを活性化するためのSelectコマンドをI-Block形式で送信します。C-APDU形式での送信内容はデータシートに明記されていますが、実際にこれをI2Cで送信する際にはI-Block形式になっていなかればならないので、C-APDUデータの前に1バイトのPCBと、後ろに2バイトのCRCを付加してやる必要がある。そのため、実際の送信バイト数は16バイトになる。 - 応答を読み取る
5バイトの応答を読み取る。応答もまたI-Block形式なので、最初の1バイトがPCBで終わりの2バイトはCRC。正常終了であれば2バイト目と3バイト目が0x90, 0x00となる。 - 正しい手順としては、続いてCapability ContainerをSelectして、その内容を読んでおくべきなのですが、特にその内容を参照/変更する必要がなければ、この手順は省略可能。
- NDEF Selectコマンドを送信して、最初のNDEFファイルを選択する。
これまたI-Block形式で送信。PCBのBlock numberビットを反転させる。 - 5バイトの応答を読み取る
I-Blockでの応答を読み取る。応答のI-Blockも反転されている。 - UpdateBinaryコマンドを使って書き込むタグデータをI-Block形式で送信する
- 5バイトの応答を読み取る
- Deselectを送信する
タグへのアクセスの終了を示すためにDeselectコマンドをS-Block形式で送信する。具体的には 0xC2, 0xE0, 0xB4の3バイトをI2Cで送信する。最初の1バイトがDeselectを示し、残りの2バイトがCRC。 - 3バイトの応答を読み取る
応答内容もDeselectを示す3バイトである。
手順そのものはISO14443AとNDEF Type 4 Tagに準拠したものなので、両標準資料を読んでおえば理解が深まります。手順は最後のDeselectの応答までキチンと読み取ることが重要です。Deselectコマンドを送信しただけだと、タグデータへのアクセス権はまだI2C側に与えられてままになっています。応答を読み取ることで、I2C側に与えられたアクセス権が解除されます。
Deselectを忘れるとI2C側がアクセス権をつかんだままになってしまうので、RF側からスマホやタブレットでアクセスしてもデータが読み取れないので注意。