微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > ZigBee BatteryPowered Device 退网之后重新入网十分困难

ZigBee BatteryPowered Device 退网之后重新入网十分困难

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

我在做一个被动红外探测器,目标是为了实现深度睡眠,可是在执行退网操作之后,尝试重新入网,有时候能重新入网成功,有时候尝试很多遍就是没法再次入网。但是只要先把电池拔出来再重新上电,那么设备入网就特别顺利。有没有什么好方法在不断电的情况下退网之后还能顺利的重新入网?

下面的退网代码有啥问题吗?

void BasicResetCB( void )
{
  NLME_LeaveReq_t leaveReq;
  // Set every field to 0
  osal_memset( &leaveReq, 0, sizeof( NLME_LeaveReq_t ) );

  // This will enable the device to rejoin the network after reset.
  leaveReq.rejoin = TRUE;  
  
  // Set the NV startup option to force a "new" join.
  zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE );

  // Leave the network, and reset afterwards
  if ( NLME_LeaveReq( &leaveReq ) != ZSuccess )
  {
    // Couldn't send out leave; prepare to reset anyway
    ZDApp_LeaveReset( FALSE );
  }
  
}

拔掉电池以后,节点是通过什么方式入网的,join 还是rejoin?

退网代码没问题。

使用的是最新版本的协议栈吗?

版本:1.2.2

预编译加了 HOLD_AUTO_START,

用户App 初始化时

ZDOInitDevice(0);

ZDApp_StartJoiningCycle();

后来我觉得(猜想)可能是因为End Device 先启动加网一段时间后Coordinator才允许入网,于是导致End Device越过了Coordinator所在的信道的扫描,所以End Device很难再次入网。(这仅仅是猜想)

于是我把退网代码改成如下:

void BasicResetCB( void )
{
  	NLME_LeaveReq_t leaveReq;
  	// Set every field to 0
  	osal_memset( &leaveReq, 0, sizeof( NLME_LeaveReq_t ) );

  	// This will enable the device to rejoin the network after reset. //leaveReq.rejoin = TRUE;  
  
  	// Set the NV startup option to force a "new" join.
  	zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE );

  	// Leave the network, and reset afterwards
  	if ( NLME_LeaveReq( &leaveReq ) != ZSuccess )
  	{
    	// Couldn't send out leave; prepare to reset anyway
    	ZDApp_LeaveReset( FALSE );
  	}
  	else { SystemResetSoft(); } }

并且在确保在End Device入网之前先让Coordinator允许入网,这样End Device退网之后再入网就很顺利了。

不知道有没有更好的解决办法?

谢谢,解决了。

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

网站地图

Top