TI中文支持网
TI专业的中文技术问题搜集分享网站

IO唤醒后,串口收不到数据。

使用协议栈为:ZHA1.2    

  产品进入深度休眠,利用io中断唤醒后,开启工作模式。串口DMA和ISR模式都尝试过了。

if(keys & HAL_KEY_SW_7)
{
     osal_pwrmgr_device(PWRMGR_ALWAYS_ON);//工作模式

      ZDApp_StartJoiningCycle();//开始寻网
      NLME_SetPollRate( 500);
      NLME_SetQueuedPollRate( 100);
      NLME_SetResponseRate( 100 );

}

然后开始发送串口数据。

设置断点调试,发现程序并没有跑到这里。

case CMD_SERIAL_MSG://模块从串口接收到数据
        zclSampleDoorLock_SerialCMD((mtOSALSerialData_t *)MSGpkt);
        break;

抓包显示,有Data Request发出。但是并没有发出我想要的数据包。

想问一下,从深度休眠唤醒,是否需要对串口进行处理,才能正常接受数据。

麻烦帮忙分析一下。

YiKai Chen:

深度休眠唤醒調試看一下UART相關的暫存器有沒有在對的設定值,如果不確定就重新設定一下串口

Alvin Chen:

你最好唤醒之后等一下在用UART或者如YK说的重新open一下。
推荐是重新open试试。

user5032796:

回复 YiKai Chen:

我使用的是ZTOOL_P2. 如下为目前使用的配置

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void MT_UartInit ()

{

 halUARTCfg_t uartConfig;

 /* Initialize APP ID */

 App_TaskID = 0;

 /* UART Configuration */

 uartConfig.configured           = TRUE;

 uartConfig.baudRate             = MT_UART_DEFAULT_BAUDRATE;//修改波特率57600

 uartConfig.flowControl          = MT_UART_DEFAULT_OVERFLOW;//修改流控FALSE

 uartConfig.flowControlThreshold = MT_UART_DEFAULT_THRESHOLD;//64

 uartConfig.rx.maxBufSize        = MT_UART_DEFAULT_MAX_RX_BUFF;//128

 uartConfig.tx.maxBufSize        = MT_UART_DEFAULT_MAX_TX_BUFF;//128

 uartConfig.idleTimeout          = MT_UART_DEFAULT_IDLE_TIMEOUT;//6

 uartConfig.intEnable            = TRUE;

#if defined (ZTOOL_P1) || defined (ZTOOL_P2)//选择U0&U1端口

 uartConfig.callBackFunc         =MT_user_UartProcessZToolData;//回调函数

#elif defined (ZAPP_P1) || defined (ZAPP_P2)

 uartConfig.callBackFunc         = MT_UartProcessZAppData;

#else

 uartConfig.callBackFunc         = NULL;

#endif

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

回调函数:uint8 buf[128];void MT_user_UartProcessZToolData( uint8 port, uint8 event ){ uint8 flag=0,i,len=0;//flag-判断是否收到数据,len-接收数据长度 (void)event; while(Hal_UART_RxBufLen(port)) { HalUARTRead(port,&buf[len],1); //接收数据,存入buf len++;//记录数据长度 flag=1;//标志-接收到数据 } if(flag==1) { SPI_Msg = (mtOSALSerialData_t *)osal_msg_allocate(sizeof(mtOSALSerialData_t)+len+1);//分配内存 SPI_Msg->hdr.event = CMD_SERIAL_MSG; SPI_Msg->msg = (uint8 *)(SPI_Msg+1); SPI_Msg->msg[0] = len; //0-存数据长度 for(i=0;i<len;i++)//copy数据 { SPI_Msg->msg[i+1] = buf[i]; } osal_msg_send(App_TaskID,(byte *)SPI_Msg); osal_msg_deallocate((uint8 *)SPI_Msg);//释放内存 }}

 

user5032796:

回复 Alvin Chen:

您指的是重新配置么。楼下是我原来的配置程序。不知道可以更改哪一部分为好。

YiKai Chen:

回复 user5032796:

唤醒之后先呼叫一次MT_UartInit 試試

user5032796:

回复 YiKai Chen:

尝试了一下,确实不可以。对接方的唤醒时序是10ms持续高电平唤醒后20ms后发送数据。不知道调用MT_UartInit();配置完来不来的及。

YiKai Chen:

回复 user5032796:

30ms可能来不及,你可能要自己試試

user5032796:

回复 YiKai Chen:

感谢答复,问题解决了。按键去抖占用25ms,时间缩短正常了。

赞(0)
未经允许不得转载:TI中文支持网 » IO唤醒后,串口收不到数据。
分享到: 更多 (0)