微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > orphan 节点无法加入协调器网络的问题

orphan 节点无法加入协调器网络的问题

时间:10-02 整理:3721RD 点击:

1. 终端ZE使用了NV_RESTORE,加入了协调器ZR,协调器也开了NV_RESTORE;

2. 若协调器掉电,重新上电协调器,协调器可以正常与ZE通信;

3. 若ZE掉电,然后重新上电,协调器可以正常与ZE通信;

4.若ZE掉电,协调器断电,ZE重新上电,抓包狗捕捉到ZE发出 orphan notification ,然后就开始发出 Beacon Request信号;然后开启另一个协调器,ZE无法加入新的协调器;

 请问有前辈可以指教吗? 终端使用了NV_RESTORE要如何才能加入新网络?

你需要加入 reset 功能

你看一下 ZDApp.c 的 ZDOInitDevice()

去執行這段

#if defined ( NV_RESTORE )
// Hold down the SW_BYPASS_NV key (defined in OnBoard.h)
// while booting to skip past NV Restore.
if ( zdappHoldKeys == SW_BYPASS_NV )
{
zdappHoldKeys = 0; // Only once
networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;
}
else
{
// Determine if NV should be restored
networkStateNV = ZDApp_ReadNetworkRestoreState();
}

if ( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE )
{
networkStateNV = ZDApp_RestoreNetworkState();
}
else
{
// Wipe out the network state in NV
NLME_InitNV();
NLME_SetDefaultNV();
// clear NWK key values
ZDSecMgrClearNVKeyValues();
}
#endif

orphan节点顾名思义,要记录原先的父节点,以PANID为判断依据,你新开的协调器PANID与orphan节点的PANID不一致,就不能加。

一个最简单的方法,把NV区擦除

    for(n = HAL_NV_PAGE_BEG; n <= HAL_NV_PAGE_END; n++)
    {
        EA = 0;
        HalFlashErase(n);
        while(FCTL & 0x80);
        EA = 1;
    }

hi felix shih,

    感谢回复,我使用的是Version 2.5.1a 版本,这一段代码有点区别,ZDOInitDevice()原来的代码是这样的:

uint8 ZDOInitDevice( uint16 startDelay )
{
  uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;
  uint16 extendedDelay = 0;

  if ( devState == DEV_HOLD )
  {
    // Initialize the RAM items table, in case an NV item has been updated.
    zgInitItems( FALSE );
  }

  ZDConfig_InitDescriptors();
  //devtag.071807.todo - fix this temporary solution
  _NIB.CapabilityFlags = ZDO_Config_Node_Descriptor.CapabilityFlags;

#if defined ( NV_RESTORE )
  
  // Get Keypad directly to see if a reset nv is needed.
  // Hold down the SW_BYPASS_NV key (defined in OnBoard.h)
  // while booting to skip past NV Restore. 
  if ( HalKeyRead() == SW_BYPASS_NV )    
    networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;
  else
  {
    // Determine if NV should be restored
    networkStateNV = ZDApp_ReadNetworkRestoreState();  /*读取NV网络状态的状态*/
  }

  if ( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE )
  {
    networkStateNV = ZDApp_RestoreNetworkState();
  }
  else
  {
    // Wipe out the network state in NV
    NLME_InitNV();
    NLME_SetDefaultNV();
    // clear NWK key values
    ZDSecMgrClearNVKeyValues();
  }
#endif

这段代码是通过按键来绕过NV数据恢复,功能与你贴出的版本应该无异。

请问您说的 reset功能是? 

基本上, reset 就是重開機後,去 erase flash

Aries Lord 的方法你也可以試看看

我是定義一個自己的按鍵為 SW_BYPASS_NV 

#define SW_BYPASS_NV    HAL_KEY_SW_5  // Bypass Network layer NV restore

在按住按鍵重新上電後,讓它去執行

// Wipe out the network state in NV
NLME_InitNV();
NLME_SetDefaultNV();
// clear NWK key values
ZDSecMgrClearNVKeyValues();

楼上的正解,VV大神曾经也是这么建议的,Aries Lord的方法要求对NV比较了解,都可以尝试下!

 felix shih的办法是可以的,V大神在其他帖子里也是这么建议的,Aries Lord的办法也可行,要求对NV比较了解。

hi felix shih ,

    谢谢你的建议。不过如果是产品的话,按键有时不太合理。

     不知道zigbee终端节点能不能在尝试加入原来的网络失败(协调器掉电后),自动扫描其他网络 ?

您好,请问你的问题解决了么?可以实现自动扫描新网络了吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top