WCH579如何使用BondManager?

#define GAPBOND_ERASE_SINGLEBOND        0x417  //!< Erase a single bonded device. Write only. Must provide address type followed by device address.

#define GAPBOND_DISABLE_SINGLEBOND      0x41A  //!< Disable a single bonded device. Write only. Must provide address type followed by device address.

#define GAPBOND_ENABLE_SINGLEBOND       0x41B  //!< Ensable a single bonded device. Write only. Must provide address type followed by device address.

调用GAPBondMgr_SetParameter的时候,第一个参数为上面三种时,后面的参数(Must provide address type followed by device address.)怎么提供?

查看例程并没有发现用法,想问下有参考的程序或者API手册吗,比如NV里保存了3个设备的绑定信息,怎么能指定禁止第二个回连?

还有就是在BondCB回调中,如果当前新设备绑定成功,怎么知道当前新绑定的设备是存储到了第几个绑定信息的位置?


通过image.png

这个函数去读image.png

#define GAP_BOND_REC_ID_OFFSET              0 //!< NV ID for the main bonding record  这个就是地址.

禁止第二个回连的话删除第二个设备的绑定信息即可。


@wangyy

您好,按照您说的我试了下;

1、报错BLE_NVIC_GAP_BOND_START没有定义;

..\Task\BleTask.c(131): error:  #20: identifier "BLE_NVID_GAP_BOND_START" is undefined


2、使用tmos_snv_read读取这六种数据的读取长度分别是多少?就是下面用法中要给多大的数组长度?

tmos_snv_read((mainRecordNvID(0),len, buff)

3、#define GAPBOND_ENABLE_SINGLEBOND       0x41B  //!< Ensable a single bonded device. Write only. Must provide address type followed by device address.

使用GAPBondMgr_SetParameter设置GAPBOND_ENABLE_SINGLEBOND,按照注释提供 地址类型和设备地址;    

地址类型是下面的宏定义吗?

// GAP_ADDR_TYPE_DEFINES GAP Address Types

#define ADDRTYPE_PUBLIC                       0x00  //!< Use the BD_ADDR

#define ADDRTYPE_STATIC                       0x01  //!< Static address

#define ADDRTYPE_PRIVATE_NONRESOLVE           0x02  //!< Generate Non-Resolvable Private Address

#define ADDRTYPE_PRIVATE_RESOLVE              0x03  //!< Generate Resolvable Private Address

设备地址是使用tmos_snv_read((mainRecordNvID(0),len, buff)读取到的吗?

提供给GAPBondMgr_SetParameter函数地址类型和设备地址分别占几个字节?直接前后拼接吗?


你好,BLE_NVID_GAP_BOND_START封库里面了,所以用不了。那可以自己管理设备地址,记录地址信息存进flash,调用GAPBondMgr_SetParameter的时候,后面的参数类型是1字节的地址类型加6字节的设备地址。


您好,这个传入的6字节设备地址是本地从机地址还是绑定的主机地址?

1、如果是本地从机地址,是否需要绑定不同设备时分别设置不同的本地地址;

2、如果是绑定主机地址,在绑定成功后调用哪个API获取绑定主机地址?


另外一个问题,WCH579不使用蓝牙协议栈直接控制Radio能否和NRF24L01通讯?


NRF24L01通讯格式。

image.png


uint8_t buf[128] = {0};

//读当前绑定count

GAPBondMgr_GetParameter( GAPBOND_BOND_COUNT, buf );

PRINT("GAPBOND_BOND_COUNT %02x \r\n",buf[0]);


tmos_memset(buf,0,6);

//读第二个绑定的地址

tmos_snv_read( mainRecordNvID(1), 6, buf);

for(uint8_t i=0;i<6;i++){

    PRINT("%02X ",buf[i]);

}

PRINT("\r\n");

//赋值,这里只是简单测试           

tmos_memcpy(tmp+1,buf,6); //mac 

tmp[0] = 0x01;                        //mac type, public address

//删除

GAPBondMgr_SetParameter(GAPBOND_ERASE_SINGLEBOND, B_ADDR_LEN + 1, tmp)



@小张同学

tmos_snv_read( mainRecordNvID(1), 6, buf);

这条语句编译不报错吗?

我试了报错:

..\Task\BleTask.c(131): error:  #20: identifier "BLE_NVID_GAP_BOND_START" is undefined





用库是报错的。要不把BLE_NVID_GAP_BOND_START这个宏定义发给我吧,我自己在程序里定义下。


icon_rar.gifCH57xBLE_LIB_V160.zip

替换库跟头文件即可。


@wangyy 多谢 另外咱们这个可以直接调用Radio和nrf24l01通讯吗?

image.png


BLE_NVID_GAP_BOND_START在0x20,


至于跟nrf24系列通讯,

ch57x 系列没有针对nrf24去做 packet handler,其收发数据都是建立在ble的包格式上的,

如果要跟nrf24 通讯,只能让nrf24 去尽量的适应ble的packet,ch57x 系列只支持4.2,所以只能BLE 1Mbps的基带,


互通:ch57x ble phy对接nrf2401类芯片

前提:1Mbps信道为频点2402-24802Mhz步进

(现代化数字架构的接收机对FSK解调devitaion相容性非常好,只要带宽够,中心频点一致,应该问题不大)

 

Ch57x Ble phy -> nrf2401:

1,Nrf2401关闭9bit packet control field,使用固定长包,包长32byte

2,ch57x手动构造数据包,包括软件构造crc8/crc16,然后再软件 异或 白化表(也可以只异或crc的位,实际数据在2401的接收端进行反白化处理)(ch57x的白化也可以单独关闭)

3,最大的有效数据为32byte-2字节=30字节(ch57x 包长可大于32byte)

 

Nrf2401->ch57x ble phy:

1,Nrf2401关闭9bit packet control field,使用固定长包包长32byte

2,NRF2401 按照ble 的方式构造包,包括软件计算crc24,,数据包写入fifo前要异或白化表(符合ble phy的白化,然后写入发射buffer。可以参照nrf2401 实现beacon 的案例,

3,ch57x 正常接收模式即可

4,最大的有效数据为:32字节去掉蓝牙两个字节的头,然后,去掉3字节的crc24,实际为27字节

 

上面,NRF2401的自动ACK方式不能用



nrf24的同步字要用符合蓝牙规范的4字节的同步字,并且要跟ch57x的配置一样


@小张同学 多谢


@小张同学

您好,在操作BondMgr时,需要指定地址是公共地址还是可解析地址,不止如何获取以下两个数据

1、需要在BondSaved回调时获取当前信息保存到NV内的ID号,用于读取devAddr;

2、需要在BondSaved回调时获取当前设备的地址类型,我看结构体linkDBItem_t中有addrType这个数据,但是不清楚如何使用;



只有登录才能回复,可以选择微信账号登录