泰凌微B85m系列 Conn State Slave role 时序保护方法
本教程适⽤于泰凌微 B85m 系列芯片。
ConnSlaveRole,每个 interval 需要⼀个收发包事件,也就是 Brx Event。B85m SDK 中,Brx Event 完全是由中断触发的,所以 MCU 系统总中断需要⼀直被打开。如果 user 在 Conn state 的⼀些任务时间较⻓且必须把系统总中断关闭(⽐如擦除 Flash),就会造成 Brx Event 被停掉,BLE 的时序很快就乱掉,最终连接断开。
对于这种情况 SDK 中提供了⼀套保护机制,让 user 去停掉 Brx Event 却不破坏 BLE 的时序,user 需要严格根据这个机制来操作。相关 API 如下:
1 | int bls_ll_requestConnBrxEventDisable(void); |
调⽤ bls_ll_requestConnBrxEventDisable 来申请关掉 Brx Event。
- 该 API 返回值若为 0,表⽰当前不接受⽤⼾的申请,即此时不能停掉 Brx Event。在 Conn state 时的 Brx working 阶段,不能接受申请,返回值为 0,⼀定要等到⼀个完整的 Brx Event 结束后,在剩余的 UI task/suspend 时间内才会接受申请。
- 该 API 返回⾮ 0 值表⽰可以接受申请,返回的值是允许停掉 Brx Event 的时间,单位为 ms。该事件值有三种情况:
A. 若当前Link Layer为Advertising state或Idle state,返回值为0xffff,即没有Brx Event,⽤⼾关闭系统中断的时间随便多⻓都可以。
B. 若当前为Conn state,收到了master的update map或update connection parameter且还没有到更新的时间点时,返回时间为更新的时间点减去当前时间。即停掉Brx Event的时间不能超过更新的时间点,否则会造成后⾯所有包收不到,最终断开连接。
C. 若当前为Conn state,且没有master的更新请求,返回值为当前connection supervision timeout值的⼀半。⽐如当前timeout为1S,返回值为500ms。
user 调⽤上⾯的 API 申请停掉 Brx Event,若返回值对应的时间 (ms),⾜够⾃⼰的任务运⾏时间,即可进⾏该任务。在该任务执⾏之前,调⽤ API bls_ll_disableConnBrxEvent 停掉 Brx Event。任务结束后,调⽤ API bls_ll_restoreConnBrxEvent 重新开启 Brx Event 并修复 BLE 时序。
参考使⽤⽅法如下:
1 | if (bls_ll_requestConnBrxEventDisable() > 300) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 xgclevo的博客!
评论