微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 终端使能NV_RESTORE和HOLD_AUTO_START断电重启后devState不正确

终端使能NV_RESTORE和HOLD_AUTO_START断电重启后devState不正确

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

协议栈:Z-Stack Home 1.2.2a

CPU:CC2530

使用情况:

1.终端节点,使能NV_RESTORE和HOLD_AUTO_START;

2.希望节点在未加入过网络时保持devState=DEV_HOLD;

3.希望节点在加入过网络,断电重启或软复位后,恢复至先前网络状态且devState=DEV_END_DEVICE。

问题:

上面描述的第3点,网络环境能够恢复,但是devState依然为DEV_HOLD,导致应用层无法处理ZDO_STATE_CHANGE为DEV_END_DEVICE的事件,请问如何解决?

谢谢

可以通过定时器,设置一个中断函数,定时检测这些,如果没满足要求,就调用初始化函数,初始化到想要的状态。如果满足要求了,就继续等待下次中断

@gaoyang9992006

我理解你说的意思是我在应用层自己定时判断devState然后改变他?

可是这样就达不到我的目的了呀,这个应该协议栈干的事情(断电重启后恢复到之前的状态),不是么

你解决了没有,我也出现了同样的问题

@Tianhao Wang 

我解决了。

     (1)预编译NV_RESTORE

     (2)在ZDAPP.c,ZDOInitDevice()中增加粗体字内容:

  if ( networkStateNV == ZDO_INITDEV_NEW_NETWORK_STATE )
  {
    ...
  }
  else if( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE )
  {
    startDelay = 0;
  }
这是我的方法,你试试行不行

谢谢你的回答,我也解决了不过我是在入网前加了

 if(devState == DEV_HOLD )
  {
    devState = DEV_INIT;
  }

我认为你这种做法不妥, 那如果设备出厂后第一次上电呢?即它没有加入过网络,一上来就你将它设置DEV_INIT? 

我觉得最好是在应用程序上 加一个bool 变量,入网后将其写入NV flash 中, 下次上电前判断一下, 如果是入过网的, 则调用ZDOstartdevice 

恩,确实,我的设计是出厂使用NLME_RestoreFromNV()函数查询终端是否在网络内

如果不在网络内就调用ZDApp_StopJoiningCycle();函数让他不自动组网。

只有通过串口收到组网命令才调用ZDApp_StartJoiningCycle();函数组网。组网前改变网络模式为DEV_INIT

我以前帖子问过这个问题,TI工程师说的就算进入了HOLD模式重新上电组网也可以成功,不过我断电后还是不能组网成功。

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

网站地图

Top