2016/07/09

[nrf52]NFCペアリングサンプルを動かす

NFCペアリングサンプルがあるので、今度こそ動かそう。
前回は、理由はわからないけどうまく動かなかったのだ。

ベースはHRSサンプルで、変更点がいくつかある。
まず、接続開始まで。

  • アプリが起動したらNFCTを初期化する
  • アプリが起動してもAdvertisingを開始せず、ポーリングされたら始まる
  • Tagのメッセージにはペアリングの初期データが入っている
  • NFCデータが転送され始めたら、InitiatorはNFCアンテナにタップしないといけない

次に、接続開始から。

  • InitiatorがTagを読んだら、Initiatorはペアリングできる
  • 接続されたら、あとはHRSサンプルと同じ動きをする
  • もう一度Tagを読んだら、Advertising無しで接続できる
  • ペアリングが成功したら、nRF Toolboxアプリが起動するようになっている
  • 接続が切れても、自動的にはAdvertisingしない
  • Bonding情報を削除しないと、他のデバイスとは接続できない

大ざっぱには、こうなるようだ。
搬送波を検知しないとAdvertisingしないし、Advertisingし始めたらタップしてペアリングできる、ということか。

ボタンは、EBSHには載ってないので(リセットボタンのみ)、そろそろハンダ付けがいるか。。。
まあ、ペアリング情報はnrfjprogで消せばいいか。


前回のNFCサンプルでSoftDeviceが消されたので、もう一度焼いてからアプリを焼こう。

 

動かしてみたのだが、正直なところよくわからない。。。
困ったことに、そこそこ近くでiBeaconを出しているデバイスがいるようで、Advertisingがゴチャゴチャしているのだ。

それは置くとして、確かにスマホを近づけるまではAdvertisingしないようだ。
そしてAdvertisingしているときにアンテナに向けたままにしていると、Androidのペアリング確認ダイアログが出てくる。

これが、「はい」を押してもすぐ失敗して次のダイアログが出てくるのだ。
がんばって「はい」し続けると、いつの間にかペアリングしていた。
TIのツールでLTKが入っているので、うまくいったのだろう。
その状態でもう一度アンテナにタップすると、nRF Toolboxが起動した。

そのあと、BLE切断してタップすると、Advertisingするようだ。
「しない」と書いてあったけど、接続できるやつじゃないということか?

うーん、もう一度!


の前に、ボタンがないのでペアリング情報を削除しなくてはならない。
config/pstorage_platform.hを見て。。。

まず、pstorageで使っているFLASHの終わりを調べる。
NRF_UICR->NRFFW[0]に値が入っているかどうかで決まるようだ。

>nrfjprog --family NRF52 --memrd 0x10001014 --n 0x10
0x10001014: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF   |................|

というわけで、NRF_FICR->CODESIZEに入っているデータを見る。

>nrfjprog --family NRF52 --memrd 0x10000010 --n 0x10
0x10000010: 00001000 00000080 FFFFFFFE FFFFFFFF   |................|

PSTORAGE_FLASH_PAGE_ENDは0x80、と。
PSTORAGE_NUM_OF_PAGESは1。
PSTORAGE_FLASH_PAGE_SIZEは、NRF_FICR->CODEPAGESIZEで、0x1000。

PSTORAGE_DATA_START_ADDR = (0x80 - 1 - 1) * 0x1000 = 0x0007_E000

image

>nrfjprog --family NRF52 --memrd 0x0007e000 --n 0x200
0x0007E000: 6354EF2A 5B2CE37A A06EA323 BDD2C536   |*.Tcz.,[#.n.6...|
0x0007E010: E9A5B700 FF344DF7 FFFE2FD3 7923AD64   |.....M4../..d.#y|
0x0007E020: 640B4C4A C5C60605 4C708827 2FD30040   |JL.d....'.pL@../|
0x0007E030: 44AAEAF4 FDF9FCBE 00000003 0000000E   |...D............|
0x0007E040: 0002000C 00120000 00000002 000030A3   |.............0..|
0x0007E050: 00000000 00000000 00000000 FFFFFFFF   |................|
0x0007E060: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF   |................|
....

なんか入っているので、この辺を消せばいいんじゃなかろうか。

>nrfjprog --family NRF52 --erasepage 0x7e000-0x7f000
Erasing addresses 0x7E000 to 0x7EFFF.

>nrfjprog --family NRF52 --memrd 0x0007e000 --n 0x200
0x0007E000: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF   |................|
0x0007E010: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF   |................|
0x0007E020: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF   |................|
0x0007E030: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF   |................|
0x0007E040: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF   |................|
....

"erasepage"という割りには、アドレスを指定するんだな。


今度は、adbでログを見ながらやってみた。
全然うまく行かないのだが、こういうログが出ていた。

E/BluetoothEventManager: Got bonding state changed for xx:xx:xx:xx:xx:xx, but we have no record of that device.

DISCOVERY_FINISHED、なんてのも出ているから、端末は見つけているのだろう。
でも見つからない??

その1つ前のログが、こうだ。

BluetoothEventManager: CachedBluetoothDevice for device xx:xx:xx:xx:xx:xx not found, calling readPairedDevices()

CachedBluetoothDevice??
何かキャッシュされている方を見に行こうとしているのだろうか。

 

よくわからないので、一度BluetoothをOFFにしてからやってみた。
よくわからんが、ペアリングされたようだ。
でも、その前もOFFにしたんだけどね。。。

image

OOBDataFlagが1と返しているから、nRF52は返事をしているようだ。
まあ、うまくいった後だから、そうだろうけど。

 

うまく行かないときは、

BluetoothBondStateMachine: bondStateChangeCallback: Status: 0 Address: xx:xx:xx:xx:xx:xx newState: 1

で、うまく行くときは、

BluetoothBondStateMachine: bondStateChangeCallback: Status: 0 Address: xx:xx:xx:xx:xx:xx newState: 2

といなっている気がする。
でもその前に、

bt_smp: io_cap = 4

のようなログが出ているので、SMPが動くとかどうとかいう辺りなのかも。
(io_cap=4はReqで出ているから、スマホ側だろう)

image

これより前は、LL_Version_IndとかLL_Connect_UpdateReqとかしかないので、もう接続処理に入っている。
失敗しているときはAdvertisingが止まるような感じがしなかったから、単に接続できなかったとかそういう話か?

でも、なんで??


スマホが接続してくれようとしなければ、そもそもペアリングも何もあったものではない。
だから、なんとなくAndroid側に原因がありそうな気がする。
しかし、NFCペアリングするスピーカーなども売られているから、ここまで失敗しそうな気もしない。
うまくいくときは、ちゃんといくし。

もしかして、タグとかNFCアンテナとかがそこら辺に置いてあるからいかんとか、ピンをハンダ付けせずにやってるからとか、アンテナが裸だから距離が近すぎるとか、そういうハードウェア的(?)な要因なのか?

ちゃんとハンダ付けしてみたが、うーん、よくわからん。。。


nRF52 DKなんかは、NFCアンテナ周りにコンデンサやら抵抗やらが挟まっている。

image

私が使っているアンテナはPreview-DKのものなので、そちらの回路も見た。

image

やっぱり130pFのコンデンサが左右に入っているな。
NFCのアクセスはできるけれども、実はRF部分で何度もリトライしてうまくいっているだけで、その遅延によってうまくいかない場合が多い、とか?

EBSHはどうなっているだろうか?

image

C10とC11がそれか。
でも、基板を見ても書いてないから、よくわからんのよねぇ。
でも、確かに外側に着いているP9とP10とはつながっていなかったから、この図通りではある。

わからん。
調整されていることにしよう。

それにしても、太陽誘電のドキュメントにNFCのことがほとんど書かれていないのだ。
お前達のNFCに対する思い入れはそんなものなのかーッ!

0 件のコメント:

コメントを投稿

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