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.

[参考译文] CC2530:如何动态更改 ZigBee 通信通道?

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1411841/cc2530-how-to-change-the-channel-of-zigbee-commucation-dynamically

器件型号:CC2530
主题中讨论的其他器件:TIMAC

工具与软件:

#define MSA_MAC_CHANNEL  =   MAC_CHAN_11; // in msa.h TIMAC

以下修改过的源代码是否正常?

extern uint8 MSA_MAC_channel ;

msa_MAC_channel =20;//在 msa.c 中

如果对通道进行分频、如何检查频率?

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

    尊敬的 Edan:

    您是否仍在评估 TIMAC v1.5.2 SDK 解决方案?  将 MSA.c 中的 MSA_MAC_channel 更改为20 (或 MAC_CHAN_20)与 2.450GHz 频率相关。  您可以使用频谱分析仪、数据包监听工具、也可以使用能够检测数据包的 Smart RF Studio 7进行验证。  如果您为 PAN 协调器(正常-FFD)和终端设备(正常-RFD)使用相同的通道、则应该观察它们的调试和通信情况、与它们使用不同的通道进行比较。

    此致、
    Ryan

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

    是的、我仍使用 TIMAC v1.5.2 SDK。
    我需要更改 FCC 认证的通道。

    协调器必须使没有 EndDevice 的频率符合 FCC。
    但频谱分析仪上没有 EndDevice 时没有检测协调器频率。
    可通过 EndDevice 检测到它的频率。

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

    MAC 示例应用协调器确实更改了动态设置通道、因为为终端器件选择了静态通道来查找和加入。  通道等网络设置存储在非易失性存储器中、以便在器件复位后恢复、并且2.4GHz IEEE 解决方案没有跳频机制。  协调器没有理由在没有连接终端设备的情况下发送无线电数据包。  除非您想考虑在信标模式下使用 PAN 协调器?  有关 本设计以及有关应用功能的其他详细信息、请参阅 MAC 示例应用软件设计。

    我之前参与的大多数 FCC 认证都允许只要使用相同的 IEEE PHY 无线电、就可以评估其他固件。  因此、您可以考虑以下其他选项:

    此致、
    Ryan

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

    如果使用基本的 RF 软件示例、 协调器 可以 在没有 EndDevice?的情况下发出信号。

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

    基本射频软件示例不考虑有关所连设备的网络设置或存储信息、因此传输可以不受限制地发送。

    此致、
    Ryan

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

    总结、
    修改基本射频软件示例以动态地更改通道。 那么协调器就可以在没有器件的情况下传输信号。
    您可以在 smartRFstudio 中检查它。
    这是什么意思?

    //  基本射频软件示例中的 lightswitch.c
    #define RF_CHANNEL 25 // 2.4GHz 射频通道

    2400 MHz 的值为25。

    如果要设置为2435 MHz、值是多少?

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

    可以专注于   RF_CHANNEL 分配到的 basicRfConfig.channel。  下面是 IEEE 2.4GHz 的通道分配:

      11 - 2405 MHz
      12 - 2410 MHz
      13 - 2415 MHz
      14 - 2420 MHz
      15 - 2425 MHz
      16 - 2430 MHz
      17 - 2435 MHz
      18 - 2440 MHz
      19 - 2445 MHz
      20 - 2450 MHz
      21 - 2455 MHz
      22 - 2460 MHz
      23 - 2465 MHz
      24 - 2470 MHz
      25 - 2475 MHz
      26 - 2480 MHz

    因此、通道17为2435 MHz、通道25为2475 MHz。

    此致、
    Ryan

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

    basicRF 样本的 appLight() 没有 appSwitch()使信号与 TIMAC 相同。

    我没有看到 smartRFstudio 发出的信号。

    请参见 appLight()的源代码

    appSwitch()中没有 basicRfSendPacket()的源代码。

    static void appLight()
    {
        halLcdWriteLine(HAL_LCD_LINE_1, "Light");
        halLcdWriteLine(HAL_LCD_LINE_2, "Ready");
    #ifdef ASSY_EXP4618_CC2420
        halLcdClearLine(1);
        halLcdWriteSymbol(HAL_LCD_SYMBOL_RX, 1);
    #endif
    
        // Initialize BasicRF
        basicRfConfig.myAddr = LIGHT_ADDR;
        if(basicRfInit(&basicRfConfig)==FAILED) {
          HAL_ASSERT(FALSE);
        }
        basicRfReceiveOn();
    
        // Main loop
        while (TRUE) {
            while(!basicRfPacketIsReady());
    
            if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)>0) {
                if(pRxData[0] == LIGHT_TOGGLE_CMD) {
                    halLedToggle(1);
                }
            }
        }
    }

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

    我完全不了解您遇到的问题。  appSwitch 旨在向 appLight 发送数据包、而不是相反。  根据您的需求生成正确的解决方案需要进行修改。   basicRfSendPacket 的源代码包含在 basic_rf.c 中

    此致、
    Ryan

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

    感谢您的回答。
    我将 basicRfSendPacket 的源代码添加到 while ()。
    我确认仅使用不带设备的路由器时信号才会发出。

    static void appRouter()
    {
        initUART();
        // Initialize BasicRF
        basicRfConfig.myAddr = ROUTER_ADDR;
        if(basicRfInit(&basicRfConfig)==FAILED) {
          HAL_ASSERT(FALSE);
        }
        basicRfReceiveOn();
        // Main loop
        while (TRUE) {
            pTxData[0] = '0';
            pTxData[1] = '2';
            pTxData[2] = ':';
            pTxData[3] = 0x34;
            pTxData[4] = 0x35;
            pTxData[5] = 0x36;
            pTxData[6] = 0x37;
            pTxData[7] = 0x38;
            pTxData[8] = 0x39;
            pTxData[9] = '\n';      
        
    
    
            //while(!basicRfPacketIsReady());
            while(TRUE){             
              //basicRfReceiveOff();
              basicRfSendPacket(DEVICE_ADDR, pTxData, APP_PAYLOAD_LENGTH);
              //basicRfReceiveOn();
              if(basicRfPacketIsReady())
                break;
            }
            if(basicRfReceive(pRxData, ROUTER_DATA_LENGTH, NULL)>0) {
    			for(int i=0;i<ROUTER_DATA_LENGTH;i++)
    				send_uart(pRxData[i]);
            }
    
        }
    }