end device 发现脱网后,便会执行重新加网(添加了NV_RESTORE和NV_INIT),为了省电,我便让它搜索网络20后,便强制进入PM3模式,当有按键按下后,便又会执行重新加网20s,如此循环。我执行的逻辑是:按键外部中断唤醒后会zgPollRate = 500;zgQueuedPollRate = 100;zgResponsePollRate = 100;强制睡眠前会执行zgPollRate = 0;zgQueuedPollRate = 0;zgResponsePollRate = 0;现在出现的问题是这样循环唤醒重新加网多次或一次(随机的)后,便会出现beacon request发不出来了,不过我的按键还是有效的(按键按下后按键的指示灯还会正常闪烁);此时我执行复位程序却跑飞了。一开始我以为是我的强制进入PM3模式的函数有问题,为了证实,我改为了停止搜索网络的方式——ZDApp_StopJoiningCycle(); ZDApp_StartJoiningCycle();可是还是会出现一样的情况,beacon request发不出来。各位TI大神,求解答啊!!!
VV:
你们用的协议栈版本是哪一个?
在Beacon Request发不出来以后,执行复位是通过代码实现的,还是直接执行硬件Reset。
为了定位问题,可以把这个功能单独在一个完整的没有经过改动的协议栈上做下测试,开启一个Timer 事件,定期的调用ZDApp_StopJoiningCycle(); ZDApp_StartJoiningCycle(),看是否会出现问题,
如果没有,再按键加上去。。
chuanhai chen:
回复 VV:
不好意思,刚过完年回来上班,复位是通过代码实现的,其代码如下:
static void dev_ClearNVtoRestartSystem(void){#ifdef NV_RESTORE // 初始化设备(包括NV) //ZDOInitDevice( 0 );
uint8 startOption; // 复位加网需重写设备初次加网标志 g_u8ZgEndDev_InitJoinNwkFlag = 0; osal_nv_write( DEVICE_INIT_JOIN_NWK_FLAG_ITEM, 0, sizeof(uint8), (void*)&g_u8ZgEndDev_InitJoinNwkFlag);
// 复位加网需重写搜索信道 g_u32CurrentNetworkChannel = MAX_CHANNELS_24GHZ; osal_nv_write( CURRENT_NETWORK_CHANNEL_ITEM, 0, sizeof(uint32), (void*)&g_u32CurrentNetworkChannel); // 修改启动项,不自动启动 osal_nv_read(ZCD_NV_STARTUP_OPTION,0,sizeof(uint8),&startOption); startOption &= ~ZCD_STARTOPT_AUTO_START; osal_nv_write(ZCD_NV_STARTUP_OPTION,0,sizeof(uint8),&startOption); // set to defalut state zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE ); // Initializes Global device configuration items zgInitItems(TRUE); // Initialize the Binding NV Item BindInitNV(); // Write the defaults to NV BindSetDefaultNV(); // Initialize the Nwk, Assoc device list, and binding NV Items NLME_InitNV(); // Set defaults for the Nwk, Assoc device list, and binding NV Items NLME_SetDefaultNV(); ZDSecMgrClearNVKeyValues(); // Remove All of the Group Table { //aps_RemoveAllGroup(13); } // Remove All of the Scenes Table { //zclGeneral_RemoveAllScenes( uint8 endpoint, uint16 groupID ); } #endif // Restart system from absolute beginning // Disables interrupts, forces WatchDog reset //SystemReset(); SystemResetSoft();}
好的,我会按您的方法去测试下,如有问题再向您请教,谢谢。
xiaoming huang1:
回复 chuanhai chen:
你好你的问题解决了吗?我也碰到了类似的问题
chuanhai chen:
回复 xiaoming huang1:
你的问题是什么,我找不到为什么发不出beacon request为什么不发出来的原因,我已经跟踪到mac层的相关代码了,出现这个问题的时候,感觉应用层的代码是正常执行的,但是beacon request就是发不出来,如果复位程序便会跑飞,你的呢?
l l3:
回复 chuanhai chen:
我也出现过类似问题有两大类:1、终端软件复位后程序不知道跑哪里去了,不像是程序跑飞,像是跑到某一循环里去了(I/O有脉冲波输出);
2、终端软件复位有时不能使程序复位(通过复位引脚或是重新上电复位终端可以重新入网);
chuanhai chen:
回复 l l3:
是的,beacon request发不出来后,复位后,我这里的P1.0会输出低电平。现在我们是采用保护的措施,你解决得怎么样了?835769418欢迎一起讨论。
user4041165:
回复 chuanhai chen:
我也遇到这个问题,终端唤醒后,发现不在网络,去搜索网络时,发送不出beacon request。我通过串口调试信息,发现一直在调用ZDO_StartDevice->NLME_NetworkDiscoveryRequest,由于没有发送出beacon request 所以无法得到beacon,最后导致无法加网。
请问你们找到问题解决了吗?能否提供下思路!!