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: 使用EasyLink_getIeeeAddr获取IEEE地址时出错

Part Number: CC2640R2F
Other Parts Discussed in Thread: SIMPLELINK-CC2640R2-SDK, CC2650,

使用EasyLink_getIeeeAddr获取IEEE地址时,返回的值为是0xFFFFFFFFFFFFFFFF,而且多块板子都是这个值,为什么?

难道EasyLink_getIeeeAddr不能获取IEEE地址?

如何解决?望帮助,谢谢!

  • 已为您咨询TI工程师,一旦得到回复回立刻回复给您

  • 您使用的是哪个版本的 SIMPLELINK-CC2640R2-SDK? EasyLink 应该使用位于 FCFG1 ROM 存储器中的主要 IEEE 地址(用户不能更改),该地址由 TI 工厂在生产期间配置。这仅适用于您未在 CCFG 内提供辅助 IEEE 地址(通过从该位置读取所有 0xFF 来确定)的情况。您可以一步调试 EasyLink.c 以确定发生了什么故障。

    //Primary IEEE address location
    #define EASYLINK_PRIMARY_IEEE_ADDR_LOCATION   (FCFG1_BASE + FCFG1_O_MAC_15_4_0)
    //Secondary IEEE address location
    #define EASYLINK_SECONDARY_IEEE_ADDR_LOCATION (CCFG_BASE  + CCFG_O_IEEE_MAC_0)
    
    //...
    
    EasyLink_Status EasyLink_getIeeeAddr(uint8_t *ieeeAddr)
    {
        EasyLink_Status status = EasyLink_Status_Param_Error;
    
        if (ieeeAddr != NULL)
        {
            int i;
    
            //Reading from primary IEEE location...
            uint8_t *location = (uint8_t *)EASYLINK_PRIMARY_IEEE_ADDR_LOCATION;
    
            /*
             * ...unless we can find a byte != 0xFF in secondary
             *
             * Intentionally checking all 8 bytes here instead of len, because we
             * are checking validity of the entire IEEE address irrespective of the
             * actual number of bytes the caller wants to copy over.
             */
            for (i = 0; i < 8; i++) {
                if (((uint8_t *)EASYLINK_SECONDARY_IEEE_ADDR_LOCATION)[i] != 0xFF) {
                    //A byte in the secondary location is not 0xFF. Use the
                    //secondary
                    location = (uint8_t *)EASYLINK_SECONDARY_IEEE_ADDR_LOCATION;
                    break;
                }
            }
    
            //inverting byte order
            for (i = 0; i < 8; i++) {
                ieeeAddr[i] = location[8 - 1 - i];
            }
    
            status = EasyLink_Status_Success;
        }
    
        return status;
    }

  • 首先谢谢你的回复。

    情况如下:

    1、simplelink_cc2640r2_sdk_4_20_00_04、simplelink_cc2640r2_sdk_3_20_00_21 都用过,结果都是0xFFFFFFFFFFFFFFFF;

    2、你给出的代码是EasyLink.c中的函数部分,这些代码我们单步运行过, ieeeAddr[i]都是0xFF。建议你们帮忙实际测试一下试试看?

  • 已将您的疑问转达至TI工程师,稍后给您回复

  • 此行为是 CC2640R2F 不支持 IEEE MAC/PHY 的结果,因此 IEEE MAC 地址在生产期间未编程到 FCFG,CC2650 等设备会观察到有效地址。您可以使用 BLE MAC 地址在 CC2640R2F 上获得唯一地址,即将 EASYLINK_PRIMARY_IEEE_ADDR_LOCATION 更改为引用 FCFG1_O_MAC_BLE_0 而不是 FCFG1_O_MAC_15_4_0。同样,EASYLINK_SECONDARY_IEEE_ADDR_LOCATION 应改为 CCFG_O_IEEE_BLE_0 而不是 CCFG_O_IEEE_MAC_0。