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.

[参考译文] LAUNCHXL-CC1310:用于多个器件的 EasyLink_enableRxAddrFilter

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1345577/launchxl-cc1310-easylink_enablerxaddrfilter-for-multiple-devices

器件型号:CC1310

必须在星型网络中配置 CC1310器件。
中央器件是一个 CC1310、此器件能够以无线方式与多个 CC1310器件交互。 该地址已配置为8个字节。
有人可以指导我如何使用=> EasyLink_enableRxAddrFilter 函数使中央器件与周围的每个器件独立同步、而不影响其他器件。

实现的 Easylink 版本为4.20.02.07

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

    请查看以下帖子:

    (+) CC1310:EasyLink_enableRxAddrFilter ()过滤目标地址或源地址吗? -低于1GHz 论坛-低于1GHz - TI E2E 支持论坛

    Siri

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

    你好,Siri。
    我已阅读所提供主题中的信息。

    现在,我已经被提出了一个问题。 在我的代码中、我尝试在两个初始化发送方地址的 CC1310之间建立通信(工作正常)。当我尝试由 ceceptor 使用广播地址进行传输、以将消息通知其他器件时、会出现此问题。 此时程序被阻止。

    是否有办法禁用接收器中的目标地址并切换到另一个?

    附件是代码块。


     static void Task_Nozzle_ON(UArg arg0, UArg arg1){
    
     EasyLink_enableRxAddrFilter(global,8,1);
     EasyLink_receiveAsync(RxCb, 0);
    
     while (true){
    
     if(mFlag){
    
        switch(Conection.status){
    
        case Active:{
    
            Conecton.status = sleep;
        break;
        }
    
    
        case sleep: {
            Conection.status = NFC;
        break;
        }
    
        case NFC:{
            Conection.status = Broadcast_Send;
        break;
        }// 
    
        case Broadcast_Send:{
            txPacket.payload[0] =  0x6E;
            txPacket.payload[1] =  0xA2;
    
            memcpy(txPacket.dstAddr,dir_Broadcast, sizeof(dir_Broadcast));
            txPacket.len = 2;
            EasyLink_transmitAsync(&txPacket, TxCb);//*/
        break;
        }
    

    非常感谢 Siri。  

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

    恐怕我不能完全理解您希望如何使用地址过滤、所以我将仅分享一些简单的示例:

    我使用了默认的 rfEasyLinkTx 和 rfEasyLinkRx 作为起点、但简化了应用、如下所示:

    发送:

    static void rfEasyLinkTxFnx(UArg arg0, UArg arg1)
    {
        // Initialize the EasyLink parameters to their default values
        EasyLink_Params easyLink_params;
        EasyLink_Params_init(&easyLink_params);
    
        if(EasyLink_init(&easyLink_params) != EasyLink_Status_Success)
        {
            System_abort("EasyLink_init failed");
        }
    
        while(1)
        {
            EasyLink_TxPacket txPacket =  { {0}, 0, 0, {0} };
    
            uint8_t i;
            for (i = 0; i < RFEASYLINKTXPAYLOAD_LENGTH; i++)
            {
              txPacket.payload[i] = i + 1;
            }
    
            txPacket.len = RFEASYLINKTXPAYLOAD_LENGTH;
            txPacket.absTime = 0;
            txPacket.dstAddr[0] = 0xAA;
    
            EasyLink_Status result = EasyLink_transmit(&txPacket);
    
            if (result == EasyLink_Status_Success)
            {
                PIN_setOutputValue(pinHandle, Board_PIN_LED1,!PIN_getOutputValue(Board_PIN_LED1));
            }
            else
            {
                PIN_setOutputValue(pinHandle, Board_PIN_LED2,!PIN_getOutputValue(Board_PIN_LED2));
            }
            sleep(1);
        }
    }
    

    接收:

    static void rfEasyLinkRxFnx(UArg arg0, UArg arg1)
    {
        EasyLink_RxPacket rxPacket = {0};
    
    
        // Initialize the EasyLink parameters to their default values
        EasyLink_Params easyLink_params;
        EasyLink_Params_init(&easyLink_params);
    
        /*
         * Initialize EasyLink with the settings found in easylink_config.h
         * Modify EASYLINK_PARAM_CONFIG in easylink_config.h to change the default
         * PHY
         */
        if(EasyLink_init(&easyLink_params) != EasyLink_Status_Success)
        {
            System_abort("EasyLink_init failed");
        }
    
        while(1)
        {
            rxPacket.absTime = 0;
            EasyLink_Status result = EasyLink_receive(&rxPacket);
    
            if (result == EasyLink_Status_Success)
            {
                /* Toggle LED2 to indicate RX */
                PIN_setOutputValue(pinHandle, Board_PIN_LED2,!PIN_getOutputValue(Board_PIN_LED2));
            }
            else
            {
                /* Toggle LED1 and LED2 to indicate error */
                PIN_setOutputValue(pinHandle, Board_PIN_LED1,!PIN_getOutputValue(Board_PIN_LED1));
            }
        }
    }
    

    默认情况下、两个器件都有其正在过滤的1字节地址0xAA (仅接受地址为0xAA 的数据包)。

    在 rfEasyLinkTxFnx 中、地址会写入数据包、如下所示:

    txPacket.dstAddr[0] = 0xAA;

    接收器将接收到该数据包、您将看到 rxPacket 中的 dstAddr 在接收数据包时设置为0xAA。

    如果您在发送器侧写入其他内容、例如:

    txPacket.dstAddr[0] = 0xCC;

    将不会接收到该数据包。

    如果希望接收器也接收此地址的数据包、可以将以下内容添加到 rfEasyLinkRxFnx

    uint8_t addressTable[] = {0xAA, 0xCC};
    EasyLink_enableRxAddrFilter(addressTable, 1, 2);
    

    现在、接收器将接收地址为0xAA 和地址为0xCC 的两个数据包。

    在 rxPacket 的 dstAddr 中可以看到接收到的地址

    假设您想改用4字节长的地址、并希望接收器接收具有以下地址的数据包。

    0xAABBCCDD 和0x11223344

    需要在 RX 代码中添加以下内容:

    EasyLink_setCtrl(EasyLink_Ctrl_AddSize, 4); // Addresses are 4 bytes long
    
    uint32_t addressTable[] = {0xDDCCBBAA,
                               0x44332211};
    
    EasyLink_enableRxAddrFilter(addressTable, 4, 2); // 2 addresses of 4 bytes each
    
    

    在 TX 端、您将执行以下操作:

    EasyLink_setCtrl(EasyLink_Ctrl_AddSize, 4);
    
    txPacket.dstAddr[0] = 0xAA;
    txPacket.dstAddr[1] = 0xBB;
    txPacket.dstAddr[2] = 0xCC;
    txPacket.dstAddr[3] = 0xDD;

    请注意字节在地址表(在 RX 中)中与它们在 txPacket 中写入顺序的交换方式。

    Br

    Siri