本教程适⽤于泰凌微 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
2
3
int bls_ll_requestConnBrxEventDisable(void);
void bls_ll_disableConnBrxEvent(void);
void bls_ll_restoreConnBrxEvent(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    if (bls_ll_requestConnBrxEventDisable() > 300)
{
bls_ll_disableConnBrxEvent();

#if 0 //test 1
irq_disable();
DBG_CHN3_HIGH;
sleep_us(287*1000);
DBG_CHN3_LOW;
irq_enable();
#else //test 2
DBG_CHN3_HIGH
flash_erase_sector(0x40000);
DBG_CHN3_LOW;
#endif

bls_ll_restoreConnBrxEvent();
}

参考来源:https://doc.telink-semi.cn/doc/zh/software/res/sdk/ble/b85m_ble_cn/b85m_ble_single_connection_cn/#ble