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.
你需要加入 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终端节点能不能在尝试加入原来的网络失败(协调器掉电后),自动扫描其他网络 ?