微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > cc2540串口睡眠如何去唤醒

cc2540串口睡眠如何去唤醒

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

我的程序是基于simpleperipheral,加了串口和powersaving,这是我的预编译选项

INT_HEAP_LEN=3072
HALNODEBUG
OSAL_CBTIMER_NUM_TASKS=1
HAL_AES_DMA=TRUE
HAL_DMA=TRUE
POWER_SAVING
xPLUS_BROADCASTER
HAL_UART=TRUE
HAL_LED=FALSE
HAL_UART_DMA=1
HAL_UART_ISR=0
HCI_UART_BR=4
HAL_KEY=FALSE

经过验证,程序可以进入PM2模式,现在的问题是怎样实现PM2的唤醒,保证串口的正常收发。

由于开启了POWER_SAVING选项,CTS和RTS都参与工作,现在得情况是,BTOOL连接到串口模块后,开启通知,通过串口调试助手发送数据,BTool收到数据有错,这是因为没唤醒的原因吗。BTool发数据到CC2540,串口调试助手不能立马收到数据,要把CTS拉低,才可以收到数据,不能通过无线唤醒吗,CC2540收到数据必须要通过外部中断唤醒才能开启串口发送吗。

ethan,

通过无线唤醒系统也能达到目的的。

你可以尝试代码里面把流控关闭试试看。

从机进入睡眠后,能有主机无线唤醒么?

yueliangz0123,

进入PM3之后是不可以的,只有本身IO口的中断才可以唤醒。

进入PM3只有外部中断可以?PM3进入的条件之一是不能有任何定时任务,包括睡眠定时唤醒?

PM2可以用睡眠定时唤醒吧?

PM2模式下能有主机无线唤醒从机?机制是什么样的?

Hi Yan:

关闭流控只需定义#define NPI_UART_FC                    FALSE吗,流控关闭后对CTS,RTS有什么影响,目前我修改这个参数,测试串口传输功能发现没多大影响,是否还要修改其他参数

yueliangz0123,

请看我回复你的另一个帖子。

PM2 可以用定时唤醒。

PM2 模式下只要建立者连接,只要有RF的中断,就会被唤醒,用于保持连接。

YAN,

simpleBLEperipheral例程中,PM2唤醒是通过sleeptimer在每个连接事件唤醒,也就是说只有在每个连接事件才可以发数据。如果想做到主机发个数据到从机,从机能不能马上建立连接事件

ehtan,

是的,在有连接的情况下,PM2 必须在“必要”的连接事件时候唤醒,这个是由sleep timer来监控,就是32.768K的晶振来实现。这个是为了维持正常连接。

我强调了“必要”,意思是这个是有连接参数来控制何时为“必要”,这个参数就是slave latency, 如果slave latency 为0, 那么每个连接事件从机都必须醒来。如果slave latency不为 0, 那么就在slave latency 个连接事件后 从机才会在接下来那个连接事件中醒过来回复主机的poll.

所以,你说的主机发送到从机,从机立马回应,只有在slave latency 为 0,从机会响应每个连接事件的配置下,能做到。 

YAN,

谢谢你的细心解答,我的串口程序,现在测得PM2模式功耗有140多UA,进入PM2之前,我做了IO口的处理

P1SEL = 0;
HAL_SLEEP_SET_POWER_MODE();
P1SEL = 0x40;

请问这样做是可行吗,我测了下,电流没多大变化,开启串口后进入睡眠还要做哪些处理

/******************************************************************************
* @fn HalUARTSuspend
*
* @brief Suspend UART hardware before entering PM mode 1, 2 or 3.
*
* @param None
*
* @return None
*****************************************************************************/
void HalUARTSuspend( void )
{
#if HAL_UART_ISR
HalUARTSuspendISR();
#endif
}

这个函数要在什么时候使用

ethan,

最好不要直接调用HAL_SLEEP_SET_POWER_MODE(), 这个函数是只给系统OSAL 去自动调用的,如果你看halsleep() 代码的话,在调用这个函数之前会有许多操作,你直接调用会造成系统紊乱。 

你可以试一下 osal_pwrmgr_device()这个函数。

HalUARTSuspend()是在定义了HAL_UART_ISR 模式不等于0的情况下,并且POWER_SAVING是使能的时候才会用到的。默认的UART应该是DMA模式。

Hi YAN,

没有直接调用HALSLEEP_SET_POWER_MODE();  ,是在协议栈里改的,睡眠前将串口IO模式改为普通IO口,唤醒后再将IO口恢复,需要这样做吗。还有,睡眠怎么关闭串口的外设。关于powersaving有没有相关参考文档。谢谢

ethan,

没有必要用P1SEL 之类寄存器去重新设置IO口的输入输出方向属性。

建议你用我上面提到的函数试一下。

power saving没有其他文档,本来这个是有OSAL 自动调度,不需要用户自己去修改的。

主机与从机之前未连接,通过主机去无线唤醒PM2模式的从机 可以吗?

不错,学习了

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

网站地图

Top