Zstack 终端设备 低功耗测试的一些问题及整理的测试结果
之前的疑问在 http://www.deyisupport.com/question_answer/wireless_connectivity/zigbee/f/104/p/64844/149224.aspx#149224 这个帖子里面回复了几条。
下面是我整理出来的一些调试结果。
测试 二种情况终端设备脱离网络之后的 低功耗设置。
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;
你确定进入的是PM3模式?在PM3模式下只能有复位或者外部I/0中断才能唤醒,应该是PM2吧。
另外你的板子上是否还有其他的其他,像LED这类的。
如果测试准确的话7.7mA的数据应该已经进入休眠了,可能是其他外设在消耗。
板子没有其他外设或者LED, 是一个最小核心板。
我是用寄存器设置进入PM3模式的,正常的话待机电流是1.1UA,PM2应该是18UA左右。
一样低功耗的设置, 重启之后的joining和 发送失败之后的joining 有什么不一样的地方吗?
我没有强制PM3模式,电流也比较小,难道我万用表有问题了?