最近在调试DA14585的蓝牙芯片,中间遇到了一些坑,于是就随手将调试的过程记录下来,方便以后自己查看。
芯片平台:DA14585
SDK:6.0.12.1020.2
编译工具:Keil5
这次的需求是获取蓝牙的MAC地址,第一反应是去SDK中查找有没有相关的获取函数, 在da1458x_config_advanced.h文件发现了有关mac地址设置的宏定义CFG_NVDS_TAG_BD_ADDRESS。具体见下图:
也就是说DA14585的默认MAC地址是:0x06,0x00,0x70,0xCA,0xEA ,0x80,理论上只要读取这个宏定义就好了,但是如果芯片在烧录过程中修改了MAC地址,那么这个宏定义就会被忽略,自然这个宏定义的值就不是真正的mac地址。
这时候就得回归芯片手册去寻找答案了。仔细翻阅查找DA14585的datasheet,MAC地址和BLE关系较大,因此只要关注BLE Core Registers就好了。果然给我发现了两个寄存器。分别是BLE_BDADDRL_REG和BLE_BDADDRU_REG。见下图:
BLE_BDADDRL_REG寄存器上存储着MAC地址的低4字节, BLE_BDADDRU_REG寄存器的0-15bit存储着MAC地址的高2字节,第16bit表示该MAC地址是 Public Bluetooth Device Address或者Private Bluetooth Device Address。
到这里事情就逐渐明朗了,在SDK上直接搜索BLE_BDADDRL_REG,在文件Da14585_586.h里面可以看到相关定义,如下图:
可以看到,SDK里面还帮我们定义好了相关结构体,可以可以。全局搜索struct __BLE_BDADDRL_REG这个结构体,发现没有被调用啊,坑!没办法只能自己手动实现读取MAC地址的函数。
/*--------------------------------------------------------------------------------
这部分SDK里面有,为了让大家好看一些我也贴出来了
----------------------------------------------------------------------------------*/
#define BLE_BDADDRL_REG (0x40000024) /* BLE device address LSB register */
#define BLE_BDADDRL_REG_RESET (0x00000000)
/*=============================*/
struct __BLE_BDADDRL_REG
/*=============================*/
{
volatile uint32_t BITFLD_BDADDRL : 32;
};
#define BDADDRL (0xFFFFFFFF)
#define BLE_BDADDRU_REG (0x40000028) /* BLE device address MSB register */
#define BLE_BDADDRU_REG_RESET (0x00000000)
/*=============================*/
struct __BLE_BDADDRU_REG
/*=============================*/
{
volatile uint32_t BITFLD_BDADDRU : 16;
volatile uint32_t BITFLD_PRIV_NPUB : 1;
};
#define BDADDRU (0xFFFF)
#define PRIV_NPUB (0x10000)
//---------------------------------------------------------------------------------
#define GetWord16(a) (* ( volatile uint16_t*)(a) )
#define GetWord32(a) (* ( volatile uint32_t*)(a) )
void ble_get_mac_address(uint8_t* ble_mac,uint8_t len)
{
struct __BLE_BDADDRL_REG bd_addr_L;
struct __BLE_BDADDRU_REG bd_addr_H;
if(len < 6)//防止数组空间过小,产生数组越界。
return;
bd_addr_L.BITFLD_BDADDRL = GetWord32(BLE_BDADDRL_REG) & BDADDRL;
bd_addr_H.BITFLD_BDADDRU = GetWord16(BLE_BDADDRU_REG) & BDADDRU;
ble_mac[0] = (uint8_t)(bd_addr_H.BITFLD_BDADDRU >> 8);
ble_mac[1] = (uint8_t)bd_addr_H.BITFLD_BDADDRU;
ble_mac[2] = (uint8_t)(bd_addr_L.BITFLD_BDADDRL >> 24);
ble_mac[3] = (uint8_t)(bd_addr_L.BITFLD_BDADDRL >> 16);
ble_mac[4] = (uint8_t)(bd_addr_L.BITFLD_BDADDRL >> 8);
ble_mac[5] = (uint8_t)bd_addr_L.BITFLD_BDADDRL;
}
测试结果如下:
那对不对呢 ,打开手机的nRF Connect APP,扫描蓝牙设备,就可以看到MAC地址了。见下图:
可以看到蓝牙的MAC地址为0x80,0xEA,0xCA,0x70,0x00,0x06与结果一致,说明功能OK。
到此,调试结束。
感谢阅读!