微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI无线射频设计 > CC2540 强制进入低消费

CC2540 强制进入低消费

时间:12-22 整理:3721RD 点击:

hi 各位:

我使用CC2540 SimpleBLEPeripheral例子。 程序在正常模式工作,现在我想要让它进入低消费。

设置:osal_pwrmgr_task_state(simpleBLEPeripheral_TaskID,PWRMGR_CONSERVE),且pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON。

当我在如下代码红色位置设断点,发现pwrmgr_attribute.pwrmgr_task_state一直等于1,经调查是LL层脱出低消费时候设置的LL_PowerOnReq( wakeForRF );。

问题:如果我想要进入低消费,强制清除pwrmgr_attribute.pwrmgr_task_state,会不会造成数据链路层不良影响?

还有,LL_PowerOnReq( wakeForRF )函数作用是?参数作用?

void osal_pwrmgr_powerconserve( void )

 {   uint32        next;   halIntState_t intState;

 if ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON )  

 {   

      if ( pwrmgr_attribute.pwrmgr_task_state == 0 )   

       {    

                HAL_ENTER_CRITICAL_SECTION( intState );

               next = osal_next_timeout();

                 HAL_EXIT_CRITICAL_SECTION( intState );

                  OSAL_SET_CPU_INTO_SLEEP( next );   

              }  

      }

}

Hi 麦蒂,

不太明白你的意思, 系统已经设置好进入和退出低功耗模式的正确方式, 你想修改整个模式吗?

你说的想让程序在正常模式工作的时候进入低功耗, 你的意思是想让程序在比如传输数据的时候进入低功耗? 这样是不对的, 肯定会影响到LL 层的数据传输.

pwrmgr_attribute.pwrmgr_task_state 被设置成 1 是因为退出低功耗模式调用 LL_PowerOnReq(wakeForRF) 并且 wakeForRF 为 TRUE.

这个函数的作用是通知LL 层系统已经唤醒, 主要操作是重启32MHz的晶振, 准备全力工作.  参数的作用, 如果是外部中断, 则wakeForRF 为FALSE. 如果是sleep timer 唤醒, 则wakeForRF 为 TRUE, 即pwrmgr_attribute.pwrmgr_task_state 被设置成 1. 

HI YAN:

如何才能pwrmgr_attribute.pwrmgr_task_state 被设置成 0?

我现在发现一个新问题,我在正常模式时候可以找到cc2540从机设备,进入低消费后,定时脱出低消费,手机就无法搜索到cc2540从机设备。

请问在低消费脱出后,需要再设置什么东西才能搜索到蓝牙设备么? 

调用 osal_pwrmgr_task_state( uint8 task_id, uint8 state ), state 设置成 PWRMGR_CONSERVE, 就会把相应的 task_id 对应的 pwrmgr_task_state 中那一位设置成0.

退出低消费后想让设备被查找到, 得需要让设备进入 广播模式, 可以通过按键做到, 比如 看 SimpleBLEPeripheral.c 中的 simpleBLEPeripheral_HandleKeys()

里面

if( gapProfileState != GAPROLE_CONNECTED )
{
     uint8 current_adv_enabled_status;
      uint8 new_adv_enabled_status;

//Find the current GAP advertisement status
GAPRole_GetParameter( GAPROLE_ADVERT_ENABLED, &current_adv_enabled_status );

if( current_adv_enabled_status == FALSE )
{
new_adv_enabled_status = TRUE;
}
else
{
new_adv_enabled_status = FALSE;
}

//change the GAP advertisement status to opposite of current status
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &new_adv_enabled_status );
}

HI YAN:

谢谢你,每次我的帖子都是你回复的。

没错,我就是调用 osal_pwrmgr_task_state( uint8 task_id, uint8 state )让LL层状态为0进入消费。刚您回答的问题我试试。

HI  YAN:

我按键使用和你如上提供的代码。

进入低消费 定时5s后脱出,手机无法搜索到cc2540,当按下按键,new_adv_enabled_status = TRUE时的一瞬间才能搜索到cc2540,手机再次搜索,就无法搜索到cc2540。

 后来我把代码放在按键触发的中断函数处理,在睡眠时,按键按下后 脱出低消费,直接进入中断函数处理 就可以做到持续广播了。我也不知道为什么?

hi, 

手机搜索到设备的一瞬间是否同时也已经和设备连接上了? 有可能是底层已经连接上了, 应用层没有显示. 这会导致CC2540 无法被再次找到.

你能用sniffer 抓包看一下是否已经在底层建立了连接?

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

网站地图

Top