低功耗蓝牙系列芯片CH57x,CH58x,CH59x实现蓝牙多通道配对/回连同一台电脑或多台电脑实现步骤
提醒:这篇博客没有配套太多形象的图文辅助理解,建议结合程序实践。
依旧以老朋友CH583为例,
我们随便打开一个HID例程,还是以HID_Keyboard例程做讲解:
1、直奔主题到我们的库函数初始化函数中去,红圈圈中的SNVAddr配置信息为我们此次配对连接后所获取到的信息存储的地址区,配对信息中包含:对方MAC地址,设备信息,协商所得IRK密钥等关键信息,都会保存到SNVAddr起始的地址中去。
2、这里可以看到当前这个程序中配置的BLE_SNV_ADDR起始地址为0x77E00-0x70000=0x7E00=31k,CH582Dataflash总大小为32k,因此给SNV分配的地址只有1k;
另外0x77E00是可以更改的,这样可以分配更多flash存储空间给SNV使用;
3、我们如果想实现一颗芯片分别作为多个BLE设备以不同的mac地址与多个电脑进行绑定回连,可按以下步骤进行配置;
①首先找到我们的CH58X_BLEInit()函数,其中我们的广播地址是由BLE_MAC宏控制的。
②假设我们BLE_MAC宏未开启,则我们使用芯片自身mac地址,特性:地址全球唯一,
这时我们开启广播,记此时的广播mac地址为:MAC_A,再去操控电脑A来连接我们以MAC_A地址进行广播的芯片,配对完成后此次配对的密钥等信息将存储在SNVADDR=0x7E00的地方,
密钥的作用:作为双方解析对方身份信息的关键手段,这个密钥一旦存在,那么不管你广播mac地址是否已经更改,电脑A始终认为你就是上次与他配对过的设备,那么当然你就算改了地址信息,电脑还是会拒绝此次配对,一般单片机中返回的错误代码信息为0x13:主机拒绝此次配对连接。
现象如下图:
③那么我如果想更换一个mac地址作为新设备进行广播该怎么修改呢?
一、广播mac地址是一定要修改的,不然我们刚广播,上次连接的主机会再次向我们发起连接。
二、更换我们存储的SNV_ADDR地址,这样在主机配对时访问我们IRK密钥信息时就不会发现匹配的密钥信息,这样一来,电脑会认为这是个新设备,因此会同意这次配对。
先估算:一次配对中,与对方所产生的配对信息大概会占用多少个字节的存储,从下图可以读出一次配对中dataflash被写入了0x7EE0-0x7E00=0xE0=224字节,不满一个BLE_SNV_BLOCK=256字节;
接下来,我们可以将CH58X_BLEInit中SNV存储起始地址更改,以0x100=256字节为单位修改SNV起始地址,以便于向电脑发起新的连接,并且存储此次新配对的密钥等配对信息。
三、当前两步都同时更改之后,再次发起广播时,电脑将会认为是新设备,此次配对可以顺利完成,
需要注意的是:CH58X_BLEInit函数中的SNVAddr起始地址与你的广播mac地址是需要对应上的,以我这边举例:
第一次广播时,使用的是芯片自身MAC地址MAC_A,SNV存储区域使用的是0x7E00,此次配对的信息存储在0x7E00开始的地址中,配对的电脑为电脑A,
第二次广播时,这边修改了广播MAC地址更改为MAC_B,并且将SNV存储区域更改到0x7E00+0x100,此次配对的信息存储在0x7F00开始的地址中,配对的电脑为电脑B,
第三次广播时,这边将第二次广播MAC地址MAC_B改回第一次的广播MAC地址MAC_A,并且将SNV存储区域更改回0x7E00,那么与第一次广播配对时的电脑A将会来回连MAC_A的设备,
同理,再次将MAC_A改到MAC_B时,将SNV地址相应更改,电脑B会来回连MAC_B的设备。
四、这样一来,可以实现单个蓝牙芯片分别连接多个不同主机,并且在这些主机间来回切换回连通信。
4、实操部分:
①芯片首次配对初始化:
②配对成功
③五秒后主动断开,断开后过一秒进行重新初始化进行广播