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
>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にしたんだけどね。。。
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で出ているから、スマホ側だろう)
これより前は、LL_Version_IndとかLL_Connect_UpdateReqとかしかないので、もう接続処理に入っている。
失敗しているときはAdvertisingが止まるような感じがしなかったから、単に接続できなかったとかそういう話か?
でも、なんで??
スマホが接続してくれようとしなければ、そもそもペアリングも何もあったものではない。
だから、なんとなくAndroid側に原因がありそうな気がする。
しかし、NFCペアリングするスピーカーなども売られているから、ここまで失敗しそうな気もしない。
うまくいくときは、ちゃんといくし。
もしかして、タグとかNFCアンテナとかがそこら辺に置いてあるからいかんとか、ピンをハンダ付けせずにやってるからとか、アンテナが裸だから距離が近すぎるとか、そういうハードウェア的(?)な要因なのか?
ちゃんとハンダ付けしてみたが、うーん、よくわからん。。。
nRF52 DKなんかは、NFCアンテナ周りにコンデンサやら抵抗やらが挟まっている。
私が使っているアンテナはPreview-DKのものなので、そちらの回路も見た。
やっぱり130pFのコンデンサが左右に入っているな。
NFCのアクセスはできるけれども、実はRF部分で何度もリトライしてうまくいっているだけで、その遅延によってうまくいかない場合が多い、とか?
EBSHはどうなっているだろうか?
C10とC11がそれか。
でも、基板を見ても書いてないから、よくわからんのよねぇ。
でも、確かに外側に着いているP9とP10とはつながっていなかったから、この図通りではある。
わからん。
調整されていることにしよう。
それにしても、太陽誘電のドキュメントにNFCのことがほとんど書かれていないのだ。
お前達のNFCに対する思い入れはそんなものなのかーッ!
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。