【WCH蓝牙系列芯片】-基于CH592开发板—获取从机广播间隔参数

------------------------------------------------------------------------------------------------------------------------------------

  在蓝牙设备广播中,设备的广播间隔是一个关键的因素,BLE设备每次广播时,会在3个广播信道上依次发送数据包,这些数据包被称为一个广播事件。两个相邻广播事件之间的时间称为广播间隔。广播间隔是针对从机设备来说的,广播间隔决定了从机设备的广播频率,是设备在未连接状态下,作为蓝牙从机(Peripheral)向四周喊话“我在这里,快来连我”的频率。其实际广播间隔时间为32~16448,单位是0.625ms,所以实际的广播间隔时间是320.625~164480.625ms。

  这次接收如何在蓝牙动态广播间隔时,在CH592F的开发板上使用蓝牙从机设备去读取广播间隔参数。

//读取蓝牙广播间隔参数
void Check_Current_Adv_Interval(void)
{
    uint16_t current_adv_min = 0;
    uint16_t current_adv_max = 0;
    //读取最小广播间隔
    current_adv_min = GAP_GetParamValue(TGAP_DISC_ADV_INT_MIN);
    //读取最大广播间隔
    current_adv_max = GAP_GetParamValue(TGAP_DISC_ADV_INT_MAX);
    //
    // 如果读出来是 160,代表实际时间是 160 * 0.625 = 100 毫秒
    PRINT("Current ADV MIN: %d (Ticks)\r\n", current_adv_min);
    PRINT("Current ADV MAX: %d (Ticks)\r\n", current_adv_max);
    //打印毫秒值
    PRINT("Time in ms: %d ms\r\n", (current_adv_min * 5) / 8);
}

  可以将封装好的Check_Current_Adv_Interval()函数,创建一个TMOS的任务函数,启动一个定时任务去执行这个参数;当蓝牙初始化之后,启动任务就一秒一次读取。

image

    再用TMOS写一个更新广播间隔的任务事件,5秒执行一次

if(events & SBP_Update_ADV_Interval_EVT)
    {
        uint8_t  initial_advertising_enable = FALSE;  //关广播
        // Set the GAP Role Parameters
        GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initial_advertising_enable);
        printf("-> close_ADV \r\n");
        uint8_t buff[2] = {0};
        ADVTime = ADVTime+1600; //更新广播间隔参数
        if(ADVTime >16000)
        {
            ADVTime = 80;
        }
        // Set advertising interval
        buff[0] = GAP_SetParamValue(TGAP_DISC_ADV_INT_MIN, ADVTime);
        buff[1] = GAP_SetParamValue(TGAP_DISC_ADV_INT_MAX, ADVTime);
        printf("--->buff[0] = %d,buff[1] = %d\r\n", buff[0], buff[1]);

        tmos_start_task(Peripheral_TaskID, SBP_Update_ADV_Interval_EVT, 1600*5);
        return (events ^ SBP_Update_ADV_Interval_EVT);
    }

  然后再等待开启广播的回调中,再次开启广播

image

  通过串口打印来观察广播间隔读取情况,和广播间隔读取情况。

image

 

image

 

连接参数获取:

此外,在蓝牙从机中,当蓝牙主机与蓝牙从机建立连接之后,也可以在从机设备端看到连接的参数信息,

image

static void peripheralParamUpdateCB(uint16_t connHandle, uint16_t connInterval,
                                    uint16_t connSlaveLatency, uint16_t connTimeout)
{
    if(connHandle == peripheralConnList.connHandle)
    {
        peripheralConnList.connInterval = connInterval;
        peripheralConnList.connSlaveLatency = connSlaveLatency;
        peripheralConnList.connTimeout = connTimeout;

        PRINT("Update %x - Int %x \n", connHandle, connInterval);  //打印句柄和间隔

        PRINT("Update Handle: %d \r\n", connHandle); // 打印handle值
        PRINT("New Conn Interval: %d (*1.25) = %d ms \r\n", connInterval, (connInterval * 5) / 4); //连接间隔
        PRINT("New Slave Latency: %d \r\n", connSlaveLatency);  // 打印潜伏期:比如是 4,就从机可以连续 4 次不理主机的呼叫继续睡。
        PRINT("New Conn Timeout: %d (*10) = %d ms \r\n", connTimeout, connTimeout * 10); // 连接超时时间
    }
    else
    {
        PRINT("ERR..\n");
    }
}

  可以在peripheralParamUpdateCB 连接参数更新完成回调函数中,当蓝牙主机(比如手机)和从机(你的板子)成功协商并修改了连接参数后,可以获取到下面的几个参数。

  • connHandle - connect handle 连接句柄 (当前连接的唯一ID编号,多连接时用于区分不同设备)

  • connInterval - connect interval 新的连接间隔

  • connSlaveLatency - connect slave latency 新的从机潜伏期

  • connTimeout - connect timeout 连接超时时间

  连接间隔:BLE主机和BLE从机成功建立连接后,主机从机设备之间的交互频率(握手)。其实际连接间隔时间为6~3200,单位是1.25ms,所以实际的连接间隔时间是61.25~32001.25ms。

  通过串口打印也可以看到连接参数值

image

 

posted on 2026-02-27 23:24  凡仕  阅读(62)  评论(0)    收藏  举报