请教问题,关于zigbee 2530中Z-STACK中低功耗模式的使用。
我写了一个程序,在Z-STACK中实现了电压的采集,并成功发送接收。
现在,我想实现这样的功能:终端节点每采集、发送一次后,进行几分钟的休眠,让其进入低功耗模式;然后,再进行采集。如此循环。
我进行了如下设置:
1、我打开了POWER_SAVING。
2、在f8wConfig.cfg里设置:-DRFD_RCVC_ALWAYS_ON = FALSE。
3、闭Key轮询,开关Key中断。在Onboard.c文件的函数InitBoard()里把OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE
修改为OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE;
最终,还是不能进入低功耗模式。无法进入低功耗。
if (MAC_PwrOffReq(MAC_PWR_SLEEP_DEEP) == MAC_SUCCESS) 无法成功。
请教大神指导指导,不胜感激!
PS:
有相关资料麻烦给个链接,或者496830205@qq.com
你是哪个版本的协议栈?我的2.5.1a里面怎么没有这句话,请确认下!
if (halSleepPconValue != 0 && MAC_PwrOffReq(MAC_PWR_SLEEP_DEEP) == MAC_SUCCESS)
您好,首先十分感谢您的回答。
1、我用的是“ZStack-CC2530-2.3.0-1.4.0”
该语句在 hal_sleep.c中。我看了下,两个版本,确实有点不一样。但是,下面的内容是一样的,具体如下
/* always use "deep sleep" to turn off radio VREG on CC2530 */
if (MAC_PwrOffReq(MAC_PWR_SLEEP_DEEP) == MAC_SUCCESS)
{
#if ((defined HAL_KEY) && (HAL_KEY == TRUE))
/* get peripherals ready for sleep */
HalKeyEnterSleep();
#endif
#ifdef HAL_SLEEP_DEBUG_LED
HAL_TURN_OFF_LED3();
#else
/* use this to turn LEDs off during sleep */
HalLedEnterSleep();
#endif
因为 if 判断不成功,始终进入不了HalKeyEnterSleep();
此外,
2、我还设置了
/* The number of milliseconds to wait between data request polls to the coordinator. */-DPOLL_RATE=0 //原来为1000
/* This is used after receiving a data indication to poll immediately * for queued messages...in milliseconds. */-DQUEUED_POLL_RATE=0 //原来为100
/* This is used after receiving a data confirmation to poll immediately * for response messages...in milliseconds */-DRESPONSE_POLL_RATE=0 //原来为100
因为官方文档中,有提到“To minimize power consumption by creating a
DEEP sleeping device, repetitive polling should be disabled by setting the zgPollRate to zero.”
另外还有一个疑问,“能否进入低功耗是否与硬件有关”,具体如下:
3、我看到TI官方文档“Application Note: Power Management For The CC2530” (我将其放在了附件中)里面还提到了“Hardware Considerations ”
有如下内容 ,不知道,是否硬件也要坐相应处理? 比如,没有用到的 IO必须接上拉电阻,然后再配置为通用输入IO。 或者,直接配置为 输出IO。
“ Unused I/O pins should have a defined level and not be left floating. One way to do this is to leave the pin
unconnected and configure the pin as a general purpose I/O input with pull-up resistor. Alternatively the pin can be
configured as a general purpose I/O output. In both cases the pin should not be connected directly to VDD or GND
in order to avoid excessive power consumption.
If the unused I/O pins are left floating in CC2530, the interrupt flag may not be cleared by software and constant
interrupt from the unused pin may occur. ”
4、为了实现周期采集、发送数据,我使用了“ osal_start_timerEx(GenericApp_TaskID,SEND_DATA_EVENT,3000);”函数。
是否是该函数的调用,影响了系统进入低功耗?
如果不能使用该函数,如何实现周期性采集、发送数据?
具体调用过程如下:
UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events )
{
..........................................
if(events&SEND_DATA_EVENT)
{
//extern uint16 HalAdcRead (uint8 channel, uint8 resolution);
ADshuju=HalAdcRead(0,HAL_ADC_RESOLUTION_12);
GenericApp_SendTheMessage();
osal_start_timerEx(GenericApp_TaskID,SEND_DATA_EVENT,3000);
return(events^SEND_DATA_EVENT);
}
}
再次感谢您!
最终问题解决了。是板子上面功耗的原因,把所有的附属的没用到的都去掉。功耗 1微安多一点。
你现在通过断点调试可以从之前出问题的if进去了吗? 但是你现在做的是硬件处理,跟软件的设置的没什么关系啊?
你可以整理一份资料出来嘛?
具体怎么实现给我说说呗 用自己写一个睡眠唤醒函数吗? 我也要实现低功耗 请赐教
这个,我记不清楚了。很长时间没做过嵌入式了,都搞忘了。
网上资料很多的。照着上面的步骤设置,一般都没有问题的。
注意一下,多数状况没进入低功耗的原因应该是“硬件外界电路的问题,甚至一个电阻,一个二极管导致的”。
我以前的所有的ZigBee资料,都拿来分享一下吧: http://pan.baidu.com/s/1pJO9mOV
大家再问,相关资料。很长时间没做过嵌入式了,都搞忘了。
网上资料很多的。照着上面的步骤设置,一般都没有问题的。
注意一下,多数状况没进入低功耗的原因应该是“硬件外界电路的问题,甚至一个电阻,一个二极管导致的”。
我以前的所有的ZigBee资料,都拿来分享一下吧: http://pan.baidu.com/s/1mg5c3VU
好的 谢谢
你的网盘打不开了 能给我个地址么。。。或者发送到邮箱也行。。。lovemytang@sina.cn