CC2540 强制进入低消费
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, ¤t_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 抓包看一下是否已经在底层建立了连接?