NRF52832 BLE外设取消配对后无法重新配对的解决方法咨询
解决nRF52832取消配对后无法重新配对的问题
别担心,刚接触nRF52遇到这类基础问题太正常了!我来帮你搞定这个配对后无法重新连接的麻烦~
首先说下原因:nRF52的BLE配对信息会存在持久化存储(比如Flash的FDS或NVMC区域),当你在手机上取消配对后,手机端的配对记录被删了,但设备端的旧配对信息还留在Flash里,再次配对时两端握手逻辑冲突,就会触发「不支持配对」的错误,以及你看到的Error 22 (0x16) GATT_CONN TERMINATE LOCAL HOST主动断开错误。
下面是几种有效的解决方法:
通过SDK API主动清除配对存储
这是最规范的方式,你可以在代码里添加清除逻辑,比如在设备启动时、或者加个物理按键触发清除:
对于nRF SDK 15及以上版本,用这两个API组合:// 清除所有配对设备的安全参数 ret_code_t err_code = sd_ble_gap_sec_params_delete(BLE_GAP_ADDR_TYPE_PUBLIC, NULL); if (err_code != NRF_SUCCESS) { // 这里可以加错误日志打印 } // 如果工程用了FDS存储配对信息,还要清理FDS中的对应记录 err_code = fds_delete_records(FDS_APP_ID, NULL); if (err_code != NRF_SUCCESS && err_code != FDS_ERR_NOT_FOUND) { // 处理错误 }注意:调用这些API前,必须确保SoftDevice已经完成初始化。
硬件层面快速清除(适合测试阶段)
- 部分nRF开发板自带配对信息清除功能,比如按住特定按键(比如Reset+USER键)再开机,就能触发Flash擦除。
- 如果没有这个功能,用J-Link工具直接擦除整个Flash:打开J-Link Commander,输入命令
erase,回车后就会清空所有Flash数据,设备回到初始状态(记得先备份你的程序哦)。
修改配置自动清理旧配对
打开工程的sdk_config.h,找到和BLE安全相关的配置:- 开启
BLE_GAP_SEC_PARAMS_EVENTS,让设备自动处理失效的配对记录; - 调整
BLE_GAP_SEC_TIMEOUT参数,设置一个合理的超时时间,让设备自动清除长时间未连接的配对信息。
- 开启
关于Error 22 (0x16)的说明
这个错误码对应BLE_ERROR_GATT_CONN_TERMINATE_LOCAL_HOST,本质是设备端因为配对信息冲突主动断开了连接。只要清除了旧的配对存储,这个错误就会跟着消失。
按照上面的方法操作后,重新烧录程序,再尝试配对应该就能正常工作啦!
内容的提问来源于stack exchange,提问作者Dhananjay Sutariya




