This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2640R2F:使用 HCI_ReadBDADDRCmd ()读取蓝牙地址不起作用?

Guru**** 2587345 points
Other Parts Discussed in Thread: CC2640R2F

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/596011/cc2640r2f-reading-bluetooth-address-using-hci_readbdaddrcmd-does-not-work

器件型号:CC2640R2F

您好!

   我们的产品进入读取 BDA 的测试模式。 此过程首先使用 SmartRF 闪存编程器2在次 MAC 地址写入 BDA。 我写入 BDA 0x11223345566、并且能够使用 SmartRF 闪存编程器2读取 BDA。 在读取 BDA 的测试模式下 ,我在 Tera Term 键入命令以读取蓝牙设备,程序进入使用 HCI_ReadBDADDRCmd ()读取 BDA 的 C 函数。 BDA 读取已损坏、请参阅下文。

为了进一步验证 HCI_ReadBDADDRCmd ()是否正常工作、我首先使用  HCI_EXT_SetBDADDRCmd ()写入 BDA、然后使用 HCI_ReadBDADDRCmd ()读取 BDA。 BDA 读取已损坏、请参阅下文。

如何使 CC2640R2F 的 BDA 读数有效?


-克尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Kel、

    我感到惊讶的是、它的编译没有发出警告。 请参阅 hci.h 中的函数原型:

    /**
    *@简介 读取此器件的 BLE 地址(bdaddr)。
    *
    *@PAR 相应事件
    *@ref hciEvt_CmdComplete_t with cmdOpcode @ref HCI_read_Bdaddr
    *
    *@返回 @参考 HCI_SUCCESS
    *
    extern hciStatus_t HCI_ReadBDADDRCmd (void);

    请注意、没有输入参数、命令完成包含 bdaddr。
    提示:cmd 完整缓冲区将为6+1字节以说明返回状态。
    参考:7.4.6在 BT Core 4.x、第2卷、第 E 部分中读取 BD_ADDR 命令

    祝你一切顺利
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、JXS、

       我的团队成员制作了该代码行 HCI_ReadBDADDRCmd (readbdAddress);。 我不知道她在哪里得到了这个想法。

       那么、获取 BDA 是获取 RSSI 的相同方式吗? 那么、获取 BDA 的代码应该如下所示? 我从哪个" COMMAND_COMPLETE->pReturnParam[x]"获取 BDA?

    静态 uint8_t SimpleBLEPeripheral_processStackMsg (iCall_HDR *pMsg)
    {
    uint8_t safeToDealloc = true;
    uint8 bdAddress[6+1];
    
    switch (pMsg->event)
    {
    案例 GATT_MSG_EVENT:
    //处理 GATT 消息
    SAFeToDealloc = SimpleBLEPeripheral_processGATTMsg (((gattMsgEvent_t *) pMsg);
    中断;
    
    案例 HCI_GAP_EVENT_EVENT:
    {
    //处理 HCI 消息
    switch (pMsg->status)
    {
    案例 HCI_COMMAND_COMPLET_EVENT_CODE:
    //处理 HCI 命令完成事件
    //解析操作码和状态的命令完成事件
    hciEvt_CmdComplete_t* command_complete =(hciEvt_CmdComplete_t*) pMsg;
    uint8_t status = COMMAND_COMPLETE->pReturnParam[0];
    
    //查找此命令完成用于的命令
    开关(COMMAND_COMPLETE ->cmdOpcode)
    {
    案例 HCI_READ_BDaddr:
    {
    if (status == Success)(如果(状态==成功))
    {
    uint16_t handle = build_uint16 (command_complete->pReturnParam[2]、
    Command_Complete->pReturnParam[1]);
    //检查手柄
    如果(handle == 0x00)
    {
    
    //store BDA at bdAddress[]
    }
    }
    
    中断;
    
    默认值:
    中断;
    }
    }
    
    中断;
    
    默认值:
    //不执行任何操作
    break;
    }
    
    return (safeToDealloc);
    } 

    [引用 user="jxs"]参考:7.4.6在 BT Core 4.x、第2卷、第 E 部分中读取 BD_ADDR 命令[/引用]

    目前、我找不到指向 BT Core 4.x 的链接

    -克尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

      我在简单外设上尝试过此代码、但无法获得正确的 BDA。 获取 BDA 的正确代码是什么?

    C 函数: SimpleBLEPeripheral_init

    //硬编码直到 CC2640R2板获取其自身 IEEE 地址的 DB 地址*/
    uint8 bdAddress[B_ADDR_LEN]={0x22、0x22、0x22、0x22、0x22、0x22、0x22、 0x5A};
    HCI_EXT_SetBDADDRCmd (bdAddress); 

    C 函数: SimpleBLEPeripheral_taskFxn()

    //初始化
    
    
    
    应用程序 SimpleBLEPeripheral_init();//应用程序主循环(;)
    {
    uint32_t 事件;
    
    //等待与调用线程关联的事件被发布。
    //请注意,与线程关联的事件在时发布
    //消息在线程的消息接收队列中排队
    事件= Event_pend (syncEvent、Event_ID_none、SBP_All_Events、
    iCall_TIMEOUT_FOREVER);
    
    HCI_ReadBDADDRCmd (); 

    C 函数: SimpleBLEPeripheral_processStackMsg()

    静态 uint8_t SimpleBLEPeripheral_processStackMsg (iCall_HDR *pMsg)
    {
    uint8_t safeToDealloc = true;
    uint8 bdAddress[6+1];
    
    switch (pMsg->EVENT)
    {
    案例 GATT_MSG_EVENT:
    //处理 GATT 消息
    SAFeToDealloc = SimpleBLEPeripheral_processGATTMsg (((gattMsgEvent_t *) pMsg);
    中断;
    
    案例 HCI_GAP_EVENT_EVENT:
    {
    //处理 HCI 消息
    switch (pMsg->status)
    {
    //处理 HCI 命令完成事件
    案例 HCI_COMMAND_COMPLET_EVENT_CODE:
    {
    //解析操作码和状态的命令完成事件
    hciEvt_CmdComplete_t* command_complete =(hciEvt_CmdComplete_t*) pMsg;
    uint8_t status = COMMAND_COMPLETE->pReturnParam[0];
    
    //查找此命令完成用于的命令
    开关(COMMAND_COMPLETE ->cmdOpcode)
    {
    案例 HCI_READ_BDaddr:
    {
    if (status == Success)(如果(状态==成功))
    {
    memcpy (&bdAddress、&command_complete->pReturnParam[1]、6);
    }
    }
    
    }
    
    
    }
    中断;
    
    默认值:
    //不执行任何操作
    中断;
    }
    
    返回(safeToDealloc);
    } 

    BDA 读取为0x2000126C、这不是正确的 BDA。

    -克尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

      我在下面将 BDA 设置为此值。

    uint8 bdAddress[B_ADDR_LEN]={0xAA、0x55、0xAA、0x55、0xAA、 0x55};
    HCI_EXT_SetBDADDRCmd (bdAddress); 

        0x2000126C 是一个存储器位置。 因此、我转到存储器视图并检查内容。 这就是我在0x2000126C 位置得到  的结果。 因此、BDA 被复制到 bdAddress[]。 但是、BDA 存储在存储器位置的方式有点奇怪。 接下来、我需要将十六进制值转换为字符串、以便可以在 Tera Term 中打印出来。

    -克尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、JXS、

    次 MAC 地址会因任何原因被擦除。 我的目标是在测试模式下读取该值。 为什么次 MAC 地址会被擦除?

    我已经有一个工作代码来读取主 BDA 或 MAC 地址。 我使用了"GAPRole_GetParameter (GAPROLE_BD_ADDR、bdAddress);"、然后对数组进行反向排序、以便能够按正确的顺序打印 BDA。

    本 BDA 测试模式的步骤如下。

    使用 SmartRF 闪存编程器2写入次要 MAC 地址。
    2.使用测试模式程序读取次 MAC 地址。

    如果辅助 MAC 地址被擦除、次级 MAC 地址的读取将如何发生? 当我使用 SmartRF 闪存编程器读取辅助 MAC 地址时、它将成为 FF FF FF FF FF FF FF。

    -克尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我以前的答复是不介意的。 当我进行调试时、次级 MAC 地址被擦除。

    另一篇文章说、如果闪存中存在辅助 MAC 地址、则该地址将成为主要 MAC 地址。

    问题已解决。

    -克尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    在我的测试中、闪存编程器2无法获取正确的辅助地址(我设置了66 55 44 33 22 11)、但我可以从监听器获取正确的地址。 我想、R1/R2中的二次地址闪存地址可能不同。

    顺便说一下,我还可以通过 HCI_ReadBDADDRCmd ()获得正确的二级地址;

    e2e.ti.com/.../4555.simple_5F00_peripheral.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、kel、

    很高兴它能正常工作。 看起来您在 memcpy 中找到并修复了不需要的"&bdaddr"、因此无需在此处使用双指针。

    关于为什么在闪存编程器2中看不到第二个 bdaddr、调用 HCI_EXT_SetBDADDRCmd 不会对闪存进行编程、并且只会在下次重新引导之前在控制器的本地 RAM 中设置 BD 地址。 如果要对第二个 bdaddr 进行编程、必须将 addr 写入闪存中的 CCFG 区域。 请参阅 CC26xx TRM SWCU117的器件配置部分。

    祝你一切顺利

    PS:无需指责同事!