2015/06/07

[nrf51]sd_ble_gap_ppcp_set()でパラメータエラー

わからん・・・。

v8でリンクが通るようにまでできたのだが、sd_ble_gap_ppcp_set()でINVALID_PARAMが返ってきてしまう。
SoftDeviceの中でエラーを返しているようなので、何がどう悪いのかがわからんのだ。

v7で動いていたところで、v8になってパラメータが変わったわけでもない。
ということは、v8になったことでやってやらないかんことがあるのか?
でも、sd_ble_gap_ppcp_set()なんて最初の方で呼ぶものだから、特になさそうだしなぁ。

 

実はここに至るまでも、SoftDeviceのサイズが変わったことでリンクのアドレスが変えないといけないことに気付かずに時間がかかっていた。
あとはすんなりいってくれることを期待したのだが・・・。


いろいろやってみたが、結果としては値がよくなかったようだ。

connIntervalのminとmaxを、それぞれ1秒と4秒にしていたのだが、これが原因らしい。
hrsサンプルでは400と650だったので、それにすると通った。

が、だ。
connIntervalの仕様としては、7.5msec~4secだ。
Core_V4.2を参照し直したが、変わっていない。

image

1.25msecの倍数で、最小値は6=>7.5msec、最大値は0xc80=3200=>4000msec。

以前はこの値で動いていたから、SoftDevice v8.0.0のバグか?と疑ったが、だいたいこういうのは自分が間違えている。

"Vol.6 Part B - 4.5.2 Supervision Timeout"に、値の範囲は100msec~32secで、(1 + connSlaveLatency) * connInterval *2より大きいこと、とある。
このconnIntervalをminの方と思っていたのだが、どうもmaxのようだ。
私はconnSlaveLatencyを0、Supervision Timeoutを4秒にしていたので、この条件に引っかかっていたようだ。

 

はあ、疲れた・・・。
nRF51 SDK v8.1.0対応したFelicaLinkアプリをGitHubに置いた。
https://github.com/hirokuma/nrf51822_felicalink_v810

リポジトリ名にSDKのバージョンまで書いておかないと、管理できんな。
ブランチで分けるって手もあるんだろうけど、ぐしゃぐしゃになってしまいそうだ。


Supervision Timeoutの範囲チェックはもう1つあって、これもconnSlaveLatencyとconnIntervalMaxを使う。
私はこの判定式を、

connSupervisionTimeout * 8 > connIntervalMax * (connSlaveLatency + 1)

としていたのだけど、nRF51 SDKでは

connSupervisionTimeout * 4 > connIntervalMax * (connSlaveLatency + 1)

と書いてあった。
GitHubにアップした方は4にあわせたんだけど、そもそもこの式はどこから出てきたんだっけ?
Core_v4.2を探しているけど、見つけられない・・・。

0 件のコメント:

コメントを投稿

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