マイコン工作実験日記

Microcontroller を用いての工作、実験記録

立ち上がりと立ち下がり

2015-01-31 12:31:23 | Weblog
前回の記事では、M24SRの書き込み時間がかなり長いことがデータシートからわかりました。実際に200バイト程度のデータを書き込んでみると150msはかからなかったものの、50msは待たないといけないようです。やはりかなり待たないといけないようなので、GPO端子を使って割り込み待ちをすることにしました。

書き込み動作終了検出のために使用するGPO端子の動作モードとしては、"Answer Ready"を使うことにしました。このモードでは書き込みだけでなく、読み出し時にもコマンドの終了をGPO端子がLowになったことで検出することができます。一方、RF経由で外部からNDEFデータが書き込まれたことを検出するためには"MIP" を使いますが、こちらはデータの書き込み期間の出力がLowになります。そのため、RFからの書き込みが終了したことは、立ち上がりで検出することになります。このように必要に応じてGPO端子の動作モードだけでなく、その検出方法も変更しなければなりません。

GPO端子の動作モード変更にも、ちょっと手間がかかります。
  • GPO端子の動作モードはシステムファイル領域に書き込まれたデータとして表現されているので、動作モード変更はこの領域のデータを書き換えることでおこなう。
  • システムファイル領域の書き換えのためにはパスワードの送信が必要。

具体的にはファイルの選択、パスワードの送信、書き換えデータの送信というように複数のコマンドを使ってようやくとGPO端子の動作モードの変更ができます。また、この際のコマンドの終了待ちにGPO端子を使うわけにはいかないので、動作モード変更時のコマンド終了待ちはpolling待ちでおこなう必要があります。

書き込み待ち時間

2015-01-25 12:41:03 | Weblog
M24SRは、NDEFタグ情報をI2Cで書き込むEEPROMです。書き込み動作には時間がかかりますので、書き込みデータを送出してからしばらくの間は、次のコマンドを処理することができません。書き込み動作中に次のコマンドが送られた場合には、NAKが返されます。1回の書き込みコマンドで送ることのできるデータ量の最大は246バイトとなっていますので、タグデータの容量がこれを超える場合には複数回数の書き込みが必要となり、その間には書き込み待ち時間が必要となります。

そこで、データシートで書き込み時間を調べてみると。。




SymbolParameterMin.Max.Unit
twrI2C write time in one page--5ms
I2C write time up to 246 bytes--150ms

246バイト書くのに最大で150msも待ちが必要となっています。M24SRは8KBのEEPROMを持っていますので、単純に最大時間を待っていたのでは、この空間すべてに書き込みをおこなう場合にはおよそ5秒が必要となることになります。実際には最大時間よりも短い時間で書き込みが終了するはずですから、できるだけ早くに書き込みが完了したことを検出して、待ち時間を短くしたいことろです。そのためには2つの方法が考えられます。
  1. 書き込みコマンドを送ってみて、NAKが返ってきた場合には再試行する。再試行までは適当なディレイをおくことで、消費電力の低減を図る。
  2. 書き込みが完了したことをGPO端子で検出できるようにしておく。割り込みで検出することで、sleepあるいはdeep sleepして待つことができる。

GPO端子は、RFからの書き込み検出に使っていましたが、ホストからの書き込み時には設定を変更して書き込み終了検出にも利用した方が良さそうです。

なお、同一ページ内での書き込み待ち時間は5msとなっていますが、データシートには「ページ」の説明がありませんでした。STのe2eCommunitiesによると、EEPROMは16バイトが1ページの構成になっているようです。


RTC設定の確認

2015-01-11 20:50:21 | Weblog
前記事では、RTCの設定をおこなうためにNFCタグへの書き込みを検出してMCUをWakeupさせました。これで、RTCの設定はできますが、ちゃんと設定できたかどうかの確認もしたいところです。そこで、RTCに設定された日時をNFCタグに書き出すことにしました。

もともとNDEFの仕様では、ひとつのNDEFファイルの中に複数のNDEFレコードを持つことが可能な階層的な構造をサポートしています。M24SRに書き込むファイル内容のレコードのひとつとしてRTCの内容を書き込むことにしました。具体的には下図の左側に示したように3つのレコードから構成される構造としています。

最初のレコードの部分は温度と気圧を表示するためのURLを保持するSmart Posterのレコードです。NDEFのSmart Posterの標準規格は、それ自体が複数のレコード(タイトル、URL、アクション)で定義されていますので、図の右側に示したように、全体の構造は入れ子構造になります。

2番目のレコードとして、RTCの保持する日時情報をテキストとして保持することにします。3番目のレコードは現在は未使用ですが、記録された気温/気圧のログを外部から参照する際に使うつもりでいます。今回は、16バイトのデータを参照できることを確認することを目的としています。独自レコードなのでアプリに対応したタイプ名をつけるべきですが、ここではとりあえずst.com:sirius506としてあります。

実際のRTCの設定操作は次のようになります。まず、Text形式でTIMEコマンドを用いてRTCの時刻を設定します。この例ではKDDIのNFCタグリーダーを使っています。同様にして、DATEコマンドで日付と曜日も設定します。



同じタグリーダーで読み出しをおかなうと、3つのレコードが表示されますが、3つめのレコードは独自レコードなので実際のデータ内容を表示することができません。



こんな時にはやはりNXPのTaginfoが重宝します。データのデコードはできなくても、実際のデータ内容を16進ダンプで確認することができます。



タグへの書き込みを検出する

2015-01-03 18:34:45 | Weblog
RTCを追加したので、その時計を設定する方法を用意する必要があります。普通であれば、シリアル経由で時刻設定コマンドを用意するところなのですが、今回は電池で動かすことを前提としたいのでOpenSDA経由でのUSBシリアルも使いたくありません。そこで、時刻設定もNFC経由ですることにします。

仕組みとしてはスマホやタブレットのNFC書き込みアプリを使って、文字列をNDEFとしてタグに書き込んでやるだけです。マイコン側では書き込まれた文字列をコマンドとして解釈して処理することにすれば、時計の設定に限らず色々な処理をNFC経由で操作することが可能となります。

マイコン側はRTCで1分おきにWakeupして気温、気圧の測定をさせていますが、それ以外はずっとDeep sleepさせて電池を消耗しないようにしています。そのため、RF経由でタグへの書き込みが行われたことも、Wakeup割り込みで知らせて欲しいということになります。幸いにM24SRにはGPO端子が用意されており、タグの状態変化に応じて端子の状態を変化させることができます。

GPO端子の振る舞いは、タグのメモリ領域の一部であるSystem File領域の内容によって変更することができます。出荷時設定としてはSession Open Configurationという設定になっており、RFもしくはI2Cでのコマンド処理のためのセッションが開いている間だけGPO端子がLowになるようになっています。タグがアクセスされたことは この設定でも知ることができますが、NDEFへの書き込みと読み込みのどちらの場合でも端子が変化してしまいます。

WIP (Writing in Progress)という設定を使うと、タグへの書き込みがおこなわれている間だけ端子がLowになります。実際にタブレット上のNFCアプリから短いテキストの書き込みを行ってみると、1回の書き込みで2回端子がLowになることがわかりました。NDEFデータの書き込みと、Capability ContainerもしくはNDEFデータ長更新の2回の書き込み操作が行われるためでしょうか?

GPO端子の設定には MIP (NDEF message writing in Progress)という設定もあり、こちらの設定ではNDEFデータ長として0以外の値が書き込まれた時にのみGPO端子がLになってくれます。この設定を使うとアプリからの書き込み後に1度だけGPO端子がLになってくれました。この設定でGPO端子を動かして、その立ち上がりを検出することにすれば、タグに何らかの情報が書き込まれた場合にWakeup割り込みがかかることになります。

GPO端子の動作設定は、System file領域のGPOフィールドの値をUpdate Binaryコマンドで書き換えてやることで行います。出荷時設定ではこの領域はパスワードプロテクトされているので、書き込みに先立ってVerifyコマンドを使ってパスワードを入力してやる必要があります。

どういうわけか、NXPのTagInfoアプリは、M24SRに対応しているようでSystem File領域の内容を(一部ですが)表示することができます。参考にまでに貼っておきます。




上が出荷時の設定。GPOの設定がSession Openになっています。I2C Protectが有効になっているため、System File領域の書き込みはパスワード入力が必要。

下は、GPOをMIPに変更した後の表示です。