zigbee z-stack 协调器断电后,重新上电无法恢复

1、是否宏定义了NV_RESTORE=1;NV_INIT=1;(协调器、路由器、终端都要定义)定义位置如下在这里插入图片描述
2、下载模式选Erase flash,选择位置:(20201117修正:实际调试发现如果不许选择erase flash 协调器断电重连,连接成功率更高,why?)
在这里插入图片描述
3、ZDOInitDevice初始化时,不旁路NV;源代码有按键选择,直接改为0:
if ( 0 )//HalKeyRead() == SW_BYPASS_NV );位置:ZDApp.c 623行
在这里插入图片描述
搞了两天这问题;搞得脑壳痛;记录。

用的协议栈版本:
Revised: $Date: 2012-02-16 16:04:32 -0800 (Thu, 16 Feb 2012) $
Revision: $Revision: 29348 $

……………………记录于20210420……………………………………
由于之前在Z-stack 2.5.1a上进行开发遇到协调器掉电后无法恢复网络(panid+1),通过之前以上方法,实现了协调器掉电后可恢复网络。
但后来将协议栈移植到Z-stack mesh 1.0.0,用了以上同样的方法,发现,协调器组网成功后,协调器掉电(路由器不掉)再上电,协调器始终无法组网;
后来比较 z-stack 2.5.1.a:预处理宏定义方面发现了区别;
在2.5.1.a上宏定义如下:
ZIGBEEPRO
ZTOOL_P1
NV_RESTORE=1
NV_INIT=1
xMT_TASK
xMT_SYS_FUNC
xMT_ZDO_FUNC
xLCD_SUPPORTED=DEBUG
而在mesh1.0.0上,如下
ZTOOL_P1
NV_RESTORE=1
NV_INIT=1
后来我将前者宏定义复制到mesh1.0.0;协调器又掉电又可以如入网了;真实奇了个怪,前者只是多了个ZIGBEEPRO,而且我将ZIGBEEPRO注释掉(改为xZIGBEEPRO),重新编译下载协调器也是可以重新入网;两者也是一样的状态;

不知为何,但就是这样。先记录在这。
在这里插入图片描述


--------记录于20210526---------Z-stack mesh 1.0.0协议栈下协调器掉电重启问题又解决了
我滴个乖乖,断断续续搞这个zigbee硬是头大;
之前Z-stack mesh 1.0.0版本移植后,协调器是可以掉电重启的,但后边不知改了啥,关键时刻,掉电又无法重启,或重启不太稳定。有时候 PANID自动+1,有时候又正常,除了按照20210420方法,后边又发现,我在 hal_board_cfg.h文件下将 HAL_KEY 宏定义为了FALSE,将其改为TRUE后,其它方法按照之前的调整,协调器掉电问题解决了;如下图。在这里插入图片描述
之前在简化代码时,以为没有用到协议栈提供的IO驱动,所以FALSE掉了KEY,没想到产生了一个意想不到的问题。

------------一起渔-------------
从Z-stack 协议栈在初始化看,整个过程到底发生了什么——>
1 系统上电进入 int main(void)函数,在ZMain下的ZMain.c文件中。-》
2 一系列操作后,进入 osal_init_system();操作系统初始化,在OSAL.c文件下。-》
3 随后进入 osalInitTasks();初始化系统任务,在OSAL_SampleApp.c文件下。-》
4 一系列任务初始化后,进入ZDApp_Init( taskID++ );在ZDApp.c文件下。-》
5 精彩开始了……分析ZDApp_Init(),中文为我添加的说明。
先总结:
1、在ZDAppCheckForHoldKey()中,不要让devState = DEV_HOLD了。特别时你用到了P0的6管脚;
2、在uint8 ZDOInitDevice( uint16 startDelay )中,不要让 if ( zdappHoldKeys == SW_BYPASS_NV )成真了
3、如果NLME_RestoreFromNV返回总是0,尝试下载时勾选:erase flash。

void ZDApp_Init( uint8 task_id )
{
  // Save the task ID
  ZDAppTaskID = task_id;

  // Initialize the ZDO global device short address storage
  ZDAppNwkAddr.addrMode = Addr16Bit;
  ZDAppNwkAddr.addr.shortAddr = INVALID_NODE_ADDR;
  (void)NLME_GetExtAddr();  // Load the saveExtAddr pointer.

  // Check for manual "Hold Auto Start"
  ZDAppCheckForHoldKey();
/*进入按键检查,halGetJoyKeyInput()函数将根据
adc = HalAdcRead (HAL_KEY_JOY_CHN, HAL_ADC_RESOLUTION_8);
也就是:#define HAL_KEY_JOY_CHN   HAL_ADC_CHANNEL_6,通道6,对应CC2530端口P0的第6通道的电平来返回按键信息。在应用中若P0第6通道电位没有明确,则返回值存在不确定性。
若运气不好,halGetJoyKeyInput()函数返回值被判定为HAL_KEY_UP(也就是ADC采样值2~38之间)
#define HAL_KEY_SW_1 	0x01  // Joystick up
#define HAL_KEY_UP     	0x01  // Joystick up
则ZDAppCheckForHoldKey()将返回devState = DEV_HOLD;
if ( zdappHoldKeys == SW_BYPASS_START ){
	devState = DEV_HOLD;}
*/
  // Initialize ZDO items and setup the device - type of device to create.
  ZDO_Init();

  // Register the endpoint description with the AF
  // This task doesn't have a Simple description, but we still need
  // to register the endpoint.
  afRegister( (endPointDesc_t *)&ZDApp_epDesc );

#if defined( ZDO_USERDESC_RESPONSE )
  ZDApp_InitUserDesc();
#endif // ZDO_USERDESC_RESPONSE

  // Start the device?
  if ( devState != DEV_HOLD )
  {
    ZDOInitDevice( 10 );
  }
  else
  {
  
    ZDOInitDevice( ZDO_INIT_HOLD_NWK_START );
    // Blink LED to indicate HOLD_START
    HalLedBlink ( HAL_LED_4, 0, 50, 500 );
  }
/*
	系统根据devState状态,进入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 )//如果NV_RESTORE 被定义为真,则进入恢复状态
  // Hold down the SW_BYPASS_NV key (defined in OnBoard.h)
  // while booting to skip past NV Restore.
  if (0)//此处之前时根据SW_BYPASS_NV key的值来判断是否进入,由于我们希望不旁路NV,所以将改条件屏蔽掉
  {
    zdappHoldKeys = 0;   // Only once
    networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;
  }
  else
  {
    // Determine if NV should be restored
    networkStateNV = ZDApp_ReadNetworkRestoreState();
…………
    注意,返回0表示下一步将读取NV,返回1下一步将重新建立网络
…………
  }
  
  if ( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE )
  {
    networkStateNV = ZDApp_RestoreNetworkState();
*****
	**

# *重点来了:*

**参考:http://blog.sina.com.cn/s/blog_3fb7f7270101iccq.html
*****
  }
  else
  {
    // Wipe out the network state in NV
    NLME_InitNV();
    NLME_SetDefaultNV();
    // clear NWK key values
    ZDSecMgrClearNVKeyValues();
  }
#endif

  if ( networkStateNV == ZDO_INITDEV_NEW_NETWORK_STATE )
  {
    ZDAppDetermineDeviceType();

    // Only delay if joining network - not restoring network state
    extendedDelay = (uint16)((NWK_START_DELAY + startDelay)
              + (osal_rand() & EXTENDED_JOINING_RANDOM_MASK));
  }

  // Initialize the security for type of device
  ZDApp_SecInit( networkStateNV );

  if( ZDO_INIT_HOLD_NWK_START != startDelay )
  {
    devState = DEV_INIT;    // Remove the Hold state

    // Initialize leave control logic
    ZDApp_LeaveCtrlInit();

    // Check leave control reset settings
    ZDApp_LeaveCtrlStartup( &devState, &startDelay );

    // Leave may make the hold state come back
    if ( devState == DEV_HOLD )
    {
      // Set the NV startup option to force a "new" join.
      zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE );

      // Notify the applications
      osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );

      return ( ZDO_INITDEV_LEAVE_NOT_STARTED );   // Don't join - (one time).
    }

    // Trigger the network start
    ZDApp_NetworkInit( extendedDelay );
  }

  // set broadcast address mask to support broadcast filtering
  NLME_SetBroadcastFilter( ZDO_Config_Node_Descriptor.CapabilityFlags );

  return ( networkStateNV );
}	
*/
  // Initialize the ZDO callback function pointers zdoCBFunc[]
  ZDApp_InitZdoCBFunc();

  ZDApp_RegisterCBs();

#if !defined ( ZDP_BIND_SKIP_VALIDATION )
#if defined ( REFLECTOR )
  ZDApp_InitPendingBind();
#endif
#endif
} /* ZDApp_Init() */

先更新到这里了,过几天协调器若又抽风恢复不上,解决后再来更新。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值