蓝牙 BLE连接参数 连接间隔讲解 connection interval Slave latency timeout CH573 CH582 CH579 peripheral通用外设讲解

本文详细介绍了蓝牙低功耗(BLE)的连接参数,包括最小和最大连接间隔、从设备延迟和超时时间。连接间隔影响数据传输速度和功耗,从设备延迟允许在无数据时节省电力,超时时间则设定通信无响应时的断开阈值。通过调整这些参数,可以在响应速度和功耗之间找到平衡,适用于不同应用场景,如大数据传输、远程操作或防丢设备等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// Minimum connection interval (units of 1.25ms, 6=7.5ms)
#define DEFAULT_DESIRED_MIN_CONN_INTERVAL    6

// Maximum connection interval (units of 1.25ms, 100=125ms)
#define DEFAULT_DESIRED_MAX_CONN_INTERVAL    100

// Slave latency to use parameter update
#define DEFAULT_DESIRED_SLAVE_LATENCY        0

// Supervision timeout value (units of 10ms, 100=1s)
#define DEFAULT_DESIRED_CONN_TIMEOUT         100

1、连接间隔

DEFAULT_DESIRED_MIN_CONN_INTERVAL(最小连接间隔)和

DEFAULT_DESIRED_MAX_CONN_INTERVAL(最大连接间隔)

这个间隔 是指成功连接后 的周期性通讯时间,主机会根据使用情况 在 这个取值范围内 选择合适的 间隔时间,这个具体值是不可控的,所以需要划定一个范围使得通讯响应在自己的可控范围之内。这个具体值会影响到下一次通讯数据包的响应时间,需要根据自己的情况来调整这个范围达到 既省电又匹配程序响应速度 的目的。

比如:
大数据传递时:通讯数据包是连续传递的,主机会选择min值来进行通讯。
无数据传递时:通讯是空闲状态,主机会选择max值来定期询问从机状态,以保持连接不中断。(在空闲时,由于使用max的值作为通讯周期,会影响到程序的下一个命令的发送时间)

( 连接间隔以1.25ms为单位;连接间隔的范围是6~3200,即7.5ms~4s之间)

2.Slave Latency(从设备延迟或者从设备时延)

 允许Slave(从设备)在没有数据要发的情况下,跳过一定数目的连接事件,在这些连接事件中不必回复Master(主设备)的包,这样就能更加省电(范围可以是0~499)。

上图,Slave Latency = OFF时,master发包,slave必须回复,如果不回复,Master就会认为slave那边接收不正常。若Slave Latency = ON时, master 发包,slave允许有3个包不回复

注意:这个参数更重要的应用 :比如在距离远或者干扰大的时候 无数据通信的时候。把这个值设大可以减少掉线概率。
比如防丢器:放在口袋里面假如这个参数设置为0 表示规定时间内必须响应从机,不然就以为是蓝牙断开了。假如设置为5。假如信号不好的时候,即使中间丢了4个,只接受了1个就表示连接了。因为他会跳过其中4个 ,保证了不掉线的概率

3.Supervision Timeout(超时时间或者监控超时)

这个参数设定了一个超时时间,如果BLE在这个时间内没有发生通信的话,就会自动断开(单位是10ms,范围是10~3200即100ms~32s)。

连接间隔、从机时延以及超时时间这三者必须满足如下公式:

Supervision Timeout >(1 +slaveLatency)*(connectionInterval)

注:slaveLatency不能算在 supervision Timeout的时间内,否则连接就会不正常断开

这三个连接参数在不同情况下对通信速率和功耗的影响

1.Connection Interval缩短,Master和Slave通信更加频繁,提高了数据吞吐速度,缩短了数据发送时间,但也提高了功耗。

2.Connection Interval加长,通信频率降低,数据吞吐速度降低,数据发送等待的时间更长,但这种设置降低了功耗。

3.Slave Latency减少或者设置为0,那么每次连接事件中都需要回复Master的包,当然功耗会上升,但数据发送速度也会提高。

4.Slave Latency加长,功耗下降,数据发送速度降低。

参数协商 启动协商任务

        // Set timer for param update event
        tmos_start_task(Peripheral_TaskID, SBP_PARAM_UPDATE_EVT, SBP_PARAM_UPDATE_DELAY);

执行参数协商任务

    if(events & SBP_PARAM_UPDATE_EVT)
    {
        // Send connect param update request
        GAPRole_PeripheralConnParamUpdateReq(peripheralConnList.connHandle,
                                             DEFAULT_DESIRED_MIN_CONN_INTERVAL,
                                             DEFAULT_DESIRED_MAX_CONN_INTERVAL,
                                             DEFAULT_DESIRED_SLAVE_LATENCY,
                                             DEFAULT_DESIRED_CONN_TIMEOUT,
                                             Peripheral_TaskID);

        return (events ^ SBP_PARAM_UPDATE_EVT);
    }

进回调函数,打印协调的参数结果

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);
    }
    else
    {
        PRINT("ERR..\n");
    }
}
nRF52830芯片支持BLE通信协议,需要进行协议栈的初始化,以实现BLE设备之间的数据传输和通信。nRF5 SDK中提供了示例代码,可以参考nRF5 SDK中的ble_peripheral模块,来实现nRF52830的BLE初始化。下面是nRF52830 BLE初始化的详细步骤: 1. 初始化SoftDevice:SoftDevice是nRF52830芯片上的蓝牙协议栈,需要进行初始化才能使用。在nRF5 SDK的示例代码中,使用了nrf_sdh_enable_request函数来请求SoftDevice的启用,该函数会自动初始化SoftDevice。 ```c // Enable the SoftDevice ret_code_t err_code = nrf_sdh_enable_request(); APP_ERROR_CHECK(err_code); ``` 2. 初始化BLE协议栈参数:在使用BLE协议栈之前,需要设置一些BLE协议栈参数,如设备名称、设备地址、广播间隔等。在nRF5 SDK的示例代码中,使用了ble_cfg_t结构体来设置BLE协议栈参数。 ```c // Set the BLE stack configuration parameters ble_cfg_t ble_cfg = { .conn_cfg = { .params = { .gap_conn_cfg = { .conn_count = BLE_GAP_CONN_COUNT_MAX, .event_length = BLE_GAP_EVENT_LENGTH_DEFAULT }, .gatt_conn_cfg = { .att_mtu = NRF_SDH_BLE_GATT_MAX_MTU_SIZE } } } }; ret_code_t err_code = sd_ble_cfg_set(BLE_CONN_CFG_GAP, &ble_cfg, RAM_START); APP_ERROR_CHECK(err_code); ``` 3. 初始化GAP参数:GAP是BLE通信协议的关键部分,需要设置一些GAP参数,如广播间隔、设备名称等。在nRF5 SDK的示例代码中,使用了ble_gap_conn_params_t结构体来设置GAP参数。 ```c // Set the GAP connection parameters ble_gap_conn_params_t gap_conn_params = { .min_conn_interval = MSEC_TO_UNITS(100, UNIT_1_25_MS), .max_conn_interval = MSEC_TO_UNITS(200, UNIT_1_25_MS), .slave_latency = 0, .conn_sup_timeout = MSEC_TO_UNITS(4000, UNIT_10_MS) }; ret_code_t err_code = sd_ble_gap_ppcp_set(&gap_conn_params); APP_ERROR_CHECK(err_code); ``` 4. 初始化广播数据:在BLE设备之间进行广播时,需要设置广播数据,以便其他设备识别和连接。在nRF5 SDK的示例代码中,使用了ble_advdata_t结构体来设置广播数据。 ```c // Set the advertisement data ble_advdata_t advdata; memset(&advdata, 0, sizeof(advdata)); advdata.name_type = BLE_ADVDATA_FULL_NAME; advdata.include_appearance = true; advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; advdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]); advdata.uuids_complete.p_uuids = m_adv_uuids; err_code = ble_advdata_encode(&advdata, m_adv_data.adv_data.p_data, &m_adv_data.adv_data.len); APP_ERROR_CHECK(err_code); ``` 5. 初始化BLE事件处理函数:在使用BLE协议栈进行数据传输和通信时,需要定义BLE事件处理函数,并进行注册。在nRF5 SDK的示例代码中,使用了Nordic Semiconductor提供的BLE事件处理函数,并进行了注册。 ```c // Register the BLE event handler function err_code = nrf_sdh_ble_app_evt_handler_register(ble_evt_dispatch, NULL); APP_ERROR_CHECK(err_code); ``` 以上就是nRF52830 BLE初始化的主要步骤,更详细的初始化代码可以参考nRF5 SDK中的ble_peripheral示例程序。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值