DA14585调试记录--获取蓝牙的MAC地址

        最近在调试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。

到此,调试结束。

感谢阅读!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值