之前的疑问在 www.deyisupport.com/.../149224.aspx 这个帖子里面回复了几条。
下面是我整理出来的一些调试结果。
测试 二种情况终端设备脱离网络之后的 低功耗设置。
1、 终端在加入网络之后掉线,设备网络会变成DISC,之后会一直查找网络。
2、终端在加入网络之后,协调器离线(掉电或者其他),终端设备重启,终端也会一直查找网络。
VV给了二个函数:
《《
利用下面的函数来终止联网和启动连网
uint8 ZDApp_StopJoiningCycle( void )
uint8 ZDApp_StartJoiningCycle( void )
》》
第一种情况,我的解决是,设备加入网络之后,设备标记网络标示。 当设备再次离开网络的时候,启动定时器1。 定时器1回调执行 启动联网的操作,并且在启动一个定时器2,定时器2回调执行,检测设备网络,当设备网络不是END_DEVICE时候,终止设备联网,并且写寄存器强制进入PM3模式。同时启动定时器1定时。循环进行。
测试结果是: 当设备加入网络的之后, 睡眠电流1UA, 掉网后26MA, 终止联网的时候恢复1UA。 启动联网恢复到26MA, 并且当协调器上电之后,终端在启动联网的时候能再次加入网络。
但是第二种情况,终端在终止联网之后的工作电流为7.74ma。 并不能进入休眠。 不知道是什么因数引起的。
一下是一些操作代码:
初始化之后最后一条启动定时器检查 是否已经加入网络。
osal_start_timerEx( MkTaskID, APP_START_JOIN_MSG_EVT,0x3a98);
led关闭,进入PM3休眠
if(events &APP_START_JOIN_MSG_EVT)
{
if(SmartHomeApp_NwkState != DEV_END_DEVICE)
{
//ZDApp_StopJoiningCycle();
g_mSendFlag =true;
HalLedSet(HAL_LED_3,HAL_LED_MODE_OFF);
SLEEPCMD &= ~PMODE; /* clear mode bits */ \
SLEEPCMD |= 0x03; /* set mode bits */ \
while (!(STLOAD & LDRDY));
}
return (events ^ APP_START_JOIN_MSG_EVT);
}
检查设备是或否加入网路,否的话 ,终止加入网络,启动定时器 进入PM3模式
if(events &APP_START_CHECK_MSG_EVT)
{
if(SmartHomeApp_NwkState != DEV_END_DEVICE)
{
ZDApp_StopJoiningCycle();
SLEEPCMD &= ~PMODE; /* clear mode bits */ \
SLEEPCMD |= 0x03; /* set mode bits */ \
while (!(STLOAD & LDRDY));
osal_start_timerEx( MkTaskID, APP_START_NET_MSG_EVT,0x3a98);
}
return (events ^ APP_START_CHECK_MSG_EVT);
}
开启加入网络,并且定时检测
if(events&APP_SEND_HEARTBEAT_MSG_EVT)
{
//Send heart data, and check vdd is low that send vdd msg.
app_Heartbeat();
osal_start_timerEx( MkTaskID, APP_SEND_HEARTBEAT_MSG_EVT,0x7530+(osal_rand()&0x7530));
return (events ^ APP_SEND_HEARTBEAT_MSG_EVT);
}
case ZDO_STATE_CHANGE:
SmartHomeApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
if ((SmartHomeApp_NwkState == DEV_ROUTER)|| (SmartHomeApp_NwkState == DEV_END_DEVICE) )
{
g_mSendFlag = true;
}
else
{
if(g_mSendFlag == true)
{
ZDOInitDevice(0xffff);
//ZDApp_StopJoiningCycle();
osal_start_timerEx( MkTaskID, APP_START_NET_MSG_EVT,0x3a98);
}
}
break;