【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。

 

posted on 2024-01-24 10:11  凡仕  阅读(281)  评论(0编辑  收藏  举报