微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 终端在不加入网络状态下如何降低功耗?

终端在不加入网络状态下如何降低功耗?

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

有多个问题要问:

1.官方协议栈给的SimpleApp例程中,终端入网结果的上层处理有以下代码

void zb_StartConfirm( uint8 status )
{
  if ( status == ZB_SUCCESS )
  {
    myAppState = APP_START;

    // Set event to bind to a collector
   osal_start_timerEx( sapi_TaskID, MY_FIND_COLLECTOR_EVT, myBindRetryDelay );  }
  else
  {
    // Try joining again later with a delay
    osal_start_timerEx( sapi_TaskID, MY_START_EVT, myStartRetryDelay );
  }
}

我想问这句

osal_start_timerEx( sapi_TaskID, MY_START_EVT, myStartRetryDelay );
有什么用呢,我把他屏蔽后,按键还是一样进行入网流程。
2.入网流程在不定义HOLD_AUTO_START的情况下是自动进行的,假如终端需要长时间不入网,但是需要进行其他动作,比如采集温度之类的,怎么处理才能较好的降低功耗?以下是否合理
UINT16 ZDApp_event_loop( uint8 task_id, UINT16 events )
{
  uint8 *msg_ptr;
………………

  if ( events & ZDO_NETWORK_INIT )
  {
  	static uint8 joinCount=0;
    // Initialize apps and start the network
    devState = DEV_INIT;
    osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );
	#ifdef ED_SENSOR
 if(joinCount++<20) { ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode, DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER ); } else { joinCount=0; MAC_RADIO_RXTX_OFF(); }
	#else	
	ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );
	#endif

    // Return unprocessed events
    return (events ^ ZDO_NETWORK_INIT);
  }

如上,加网20次后关闭加网流程,并关闭RXTX。

我想在不使用RXTX的情况下,关闭32M外部晶振,启用16M内部RC,是否会影响温度采集进程?

 

1, 如果else没有进入,那么屏蔽掉代码,肯定不会有影响的

2,可以使用 uint8 ZDApp_StopJoiningCycle( void )停止网络搜索。

3,不建议这么做,Tx/RX/Idle的切换速度很快,上次做操作,不太合适。

1.明白,问题解决!

2.使用此函数也是需要判断他扫描了多少次,然后再调用比较合理

3.TX/RX /Idle的切换速度很快?我没明白什么意思,我的终端经常1天甚至3天的时间不在网络,我觉得有必要关闭TX/RX,并将时钟由32MHz XOSC切换到16MHz RC。

整体更改为

 if ( events & ZDO_NETWORK_INIT )
  {
  	static uint8 joinCount=0;
    // Initialize apps and start the network
    devState = DEV_INIT;
    osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );
	#ifdef ED_SENSOR
	if(joinCount++<20)
	{
    	ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,
                     	DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );
	}
	else
	{
		uint16 i;													   \
		joinCount=0;
ZDApp_StopJoiningCycle();
		//in order to save power,after joining failed,turn off RX,TX and 32MHz XOSC ,turn on 16MHz RC
		MAC_RADIO_RXTX_OFF();														   
		SLEEPCMD &= ~OSC_PD;					   /* turn on 16MHz RC and 32MHz XOSC */				
		while (!(SLEEPSTA & XOSC_STB) || !(SLEEPSTA & HFRC_STB)); /* wait for 32MHz XOSC and 16MHz RC stable */ 					\
		asm("NOP"); 							   /* chip bug workaround */							
		for (i=0; i<504; i++) asm("NOP");		   /* Require 63us delay for all revs */				
		CLKCONCMD = (CLKCONCMD_16MHZ | OSC_32KHZ); /* Select 16MHz RC and the source for 32K clock */ 
		while (CLKCONSTA != (CLKCONCMD_16MHZ | OSC_32KHZ)); /* Wait for the change to be effective */	
		SLEEPCMD |= OSC_PD; 					   /* turn off 32MHz RC */					
		ClockFlag = RC_16MHZ_ON;
		IsFirstJoin = FALSE;
	}
	#else	
	ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );
	#endif

    // Return unprocessed events
    return (events ^ ZDO_NETWORK_INIT);
 }

如果长时间Tx和RX不会工作的情况下,那么运行在RC 16MHZ也是可以的。

但是要确保收发数据的时候32M的OSC是稳定的

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

网站地图

Top