项目场景:
使用CH592芯片实现一个蓝牙从机模块,对于静态功耗和连接功耗都有一定的要求(为了延长电池使用时间)
问题描述
与app连接成功后整机功耗0.3mA左右(整机功耗),要求将整机功耗降低到0.0xmA级别
原因分析:
参考文章:
蓝牙BLE从机Peripheral讲解一(广播间隔和连接间隔) - SweetTea_lllpc - 博客园百度安全验证
https://baijiahao.baidu.com/s?id=1690204008664769649&wfr=spider&for=pc
重点关注:连接间隔、从设备延迟、连接超时这几个参数
实际与厂商FAE联系,只需要关注“连接间隔”这个参数
连接间隔:长的时间间隔的优势是显著地节省功耗,因为设备可以在连接事件之间有较长时间的休眠,坏处是当设备有应用数据需要发送时,必须要等到下一个连接事件;短的时间间隔优势是两设备连接频发,可以更快地收发数据,不利之处是设备因连接事件的到来而被频繁的唤醒,会有较多功耗。因此,在实际应用的时候,有时候需要发送数据快一点,这个时候我们可以把连接间隔改小一点,这样发送数据快,但是功耗大,当把数据发完的时候,可把连接间隔改小一点,这样可以降低功耗,达到一个均衡。
解决方案:
初次尝试:程序中“DEFAULT_DESIRED_MIN_CONN_INTERVAL”“DEFAULT_DESIRED_MAX_CONN_INTERVAL”默认连接间隔范围7.5ms~125ms之间,直接修改"DEFAULT_DESIRED_MAX_CONN_INTERVAL"为800(1s)实际测试连接后整机功耗可以在0.0xmA范围,修改为1600(2s)电流会更小一点。
存在问题:修改最大连接间隔为1s之后,用OTA升级工具app更新程序时会失败
可行方案:从机端保持原始连接间隔宏定义(7.5ms~125ms)设定不变,在“SBP_PARAM_UPDATE_EVT”任务中协调连接间隔。
//用户定义用于协商的连接间隔
uint16_t User_DESIRED_MIN_CONN_INTERVAL=1500;//1000;// 1.25*1000=1.25s 1500=>1.875s
uint16_t User_DESIRED_MAX_CONN_INTERVAL=1600;//1200;// 1.25*1200=1.5s 1600=>2s
if(events & SBP_PARAM_UPDATE_EVT)//协商连接间隔
{
// Send connect param update request
GAPRole_PeripheralConnParamUpdateReq( peripheralConnList.connHandle, //协商函数
User_DESIRED_MIN_CONN_INTERVAL,
User_DESIRED_MAX_CONN_INTERVAL,
DEFAULT_DESIRED_SLAVE_LATENCY,
DEFAULT_DESIRED_CONN_TIMEOUT,
Peripheral_TaskID);
if(peripheralConnList.connInterval < User_DESIRED_MIN_CONN_INTERVAL){ //开启第一次协商
retry++; //interval_current是回调函数中实际的间隔,传递到此处
if(retry < 5){ //第一次协商次数最多为5(可自行配置),中途协商成功则跳出。
tmos_start_task(Peripheral_TaskID, SBP_PARAM_UPDATE_EVT, 1600);//SBP_PARAM_UPDATE_DELAY
}
}else {
retry = 0;
tmos_stop_task(Peripheral_TaskID, SBP_PARAM_UPDATE_EVT);
}
return (events ^ SBP_PARAM_UPDATE_EVT);
}
测试验证:
配合CH592的主机例程debug测试验证。实测与主机连接后电流0.0xmA级别。用OTA升级app更新程序不受影响