【WCH蓝牙系列芯片】-基于CH582开发板—蓝牙连接间隔协商
-------------------------------------------------------------------------------------------------------------------------------------
蓝牙的主机和从机成功连接后,主机和从机设备之间的交互频率就是连接间隔的时间参数。连接间隔参数分为最小连接间隔时间和最大连接间隔时间,其范围在6~3200,单位是1.25ms,实际的连接间隔时间为7.5ms~4s。
针对连接间隔:
这个间隔是指主机和从机成功连接后的周期性通讯时间,主机会根据使用情况在这个取值范围内选择合适的间隔时间,具体值是不可控的,所以需要划定一个范围使得通讯响应在自己的可控范围之内。这个具体值会影响到下一次通讯数据包的响应时间,需要根据自己的情况来调整这个范围达到既功耗低,数据响应速度快的目的
1、若将连接间隔时间变大,因为主机和从机之间的休眠时间长,这样功耗也会随之降低,但是当主机和从机需要相互发送数据时,就必须等到下一次连接事件。
2、若将连接间隔时间变小,主机和从机之间交互频率更快,收发数据更快,但是需要功耗也会增大。
在实际蓝牙的使用过程中,有时候需要发送数据快一点,可以把连接间隔改小一点,可以发送数据快,但功耗大,当把数据发完的时候,再把连接间隔改小一点,这样降低功耗,动态控制连接间隔的协商时间,达到一个均衡。
注意:
在蓝牙使用过程中,可能会因为蓝牙本身任务阻塞导致蓝牙断连的情况,这其中有一个原因是在蓝牙连接后,连接间隔是固定的,当有程序任务事件来时,会出现来不及处理当前的任务事件,两个任务发生冲突,导致蓝牙断连。
此时,可以通过修改增大连接间隔时间,给每一个程序任务事件更多的处理时间,这样就不会出现蓝牙断开连接的现象。还可以将任务进行拆分处理,保证能够让蓝牙在适当的时间内处理任务事件。
连接间隔协商处理:
在使用蓝牙过程中,由于连接间隔是可以协商的,因此在主机主动发起协商出的连接间隔不理想时,可以重新协商连接间隔,
这里以CH582从机为例程,通过从机端发起协商处理。需要更新连接参数,重新传递连接间隔参数并调用函数使用:GAPRole_PeripheralConnParamUpdateReq
连接参数的更新:
不仅可以由主机端发起,也可以由从机端请求发起,即使在主机端不主动更新连接参数,当从机发起连接参数更新请求时候,主机端也会执行连接参数更新。
添加一段连接间隔协商的例子,通过打印来观察协商结果
//连接间隔协商例子
#if 1
uint16_t User_Define_MinConnectionInterval = 400; //最小连接间隔
uint16_t User_Define_MaxConnectionInterval = 420; //最大连接间隔
uint16_t User_Define_TimeOut = 200;
static uint8 num1 = 0; //第一次协商用的参数
if(events & SBP_PARAM_UPDATE_EVT)
{
// Send connect param update request 协商函数
uint8_t state = GAPRole_PeripheralConnParamUpdateReq(peripheralConnList.connHandle, //进行参数更新的连接句柄或标识符
User_Define_MinConnectionInterval, //期望的最小连接间隔
User_Define_MaxConnectionInterval, //期望的最大连接间隔
DEFAULT_DESIRED_SLAVE_LATENCY, //期望的从机延迟
User_Define_TimeOut, //期望的连接超时时间
Peripheral_TaskID); //从机任务的标识符
printf("state = %d\r\n",state); //判断协商返回值,0为成功
if(peripheralConnList.connInterval < 200) //开启协商
{
num1++; //conn_params.interval_current是回调函数中实际的间隔,传递到此处
printf("num1 = %d\n", num1);
if(num1 < 10)
{ //第一次协商次数最多为5(可自行配置),中途协商成功则跳出。
tmos_start_task(Peripheral_TaskID, SBP_PARAM_UPDATE_EVT, 1600);
}
else
{
num1 = 0;
tmos_stop_task(Peripheral_TaskID, SBP_PARAM_UPDATE_EVT);
printf("STOP\r\n");
}
}
return (events ^ SBP_PARAM_UPDATE_EVT);
}
#endif
通过功耗分析仪可以来观察整个变化过程,
一开始程序中,最小连接间隔和最大连接间隔设置如下:
协商出来的结果是0x3C = 60,连接间隔时间为60*1.25mS = 75mS。
第二次,自定义最小连接间隔和最大连接间隔,还有连接超时时间。
调用GAPRole_PeripheralConnParamUpdateReq函数,重新更新连接间隔值,协商出结果是0x19a = 410, 连接间隔时间为410*1.25mS = 512.5mS。