微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > SmartRF06评估板 Z-stack Home1.2小问题。

SmartRF06评估板 Z-stack Home1.2小问题。

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

问题主要是任务事件触发问题

我在任务初始化中zclSampleDoorLock_Init有 osal_set_event(zclSampleDoorLock_TaskID, TZIGBEE_AP_EVENT);//设置应用层处理事件。

然后在zclSampleDoorLock_event_loop中

if (events & TZIGBEE_AP_EVENT) //判断是否有应用层事件处理,目前是定时50MS周期性地处理。
{
com_packet_process();//通信包处理,查询是否有通信包,有则处理,没有则退出
Ap_auxFuntion_process();//辅助功能处理,包括LED1,LED2灯的显示,复位功能,按键处理等等/

//osal_set_event(zclSampleDoorLock_TaskID, TZIGBEE_AP_EVENT);//设置应用层处理事件。

osal_start_timerEx(zclSampleDoorLock_TaskID, TZIGBEE_AP_EVENT,50);//设置下一次的事件的定时时间事件。
return (events ^ TZIGBEE_AP_EVENT);
}

这段主要是50MS扫描一次处理数据,现在遇到一次问题,就是在处理数据时,要AF广播发送数据出去(GenericApp_packetRFSend发送成功),然后TZIGBEE_AP_EVENT事件不触发了,导致我程序主要的50MS扫描不运行。。如果不执行AF发送数据,一直50ms扫描。已经在JLINK验证过,问题出现在哪里?

请TI员工帮忙一下。谢谢

附主要问题代码:

endPointDesc_t SampleApp_epDesc;
void zclSampleDoorLock_Init( byte task_id )
{
unsigned char i = 0;
zclSampleDoorLock_TaskID = task_id;

//------------------------配置串口---------------------------------
//MT_UartInit(); //串口初始化
//MT_UartRegisterTaskID(task_id); //注册串口任务


HalUARTWrite(0,"Louis", 5);//串口发送

//-----------------------------------------------------------------

// Set destination address to indirect
zclSampleDoorLock_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;
zclSampleDoorLock_DstAddr.endPoint = 0;
zclSampleDoorLock_DstAddr.addr.shortAddr = 0;


SampleApp_epDesc.endPoint = zclSampleDoorLock_SimpleDesc.EndPoint;
SampleApp_epDesc.task_id = &zcl_TaskID;

SampleApp_epDesc.simpleDesc = &zclSampleDoorLock_SimpleDesc;
SampleApp_epDesc.latencyReq = noLatencyReqs;

afRegister( &SampleApp_epDesc );

zcl_registerForMsg( zclSampleDoorLock_TaskID );

// Register for a test endpoint
afRegister( &sampleDoorLock_TestEp );

#ifdef LCD_SUPPORTED
// display the device name
HalLcdWriteString( (char *)sDeviceName, HAL_LCD_LINE_3 );
#endif

// // initialize NVM for storing PIN information
// if ( SUCCESS == osal_nv_item_init( ZCD_NV_APS_DOORLOCK_PIN, 5, aiDoorLockMasterPINCode ) )
// // use NVM PIN number in APP
// osal_nv_read( ZCD_NV_APS_DOORLOCK_PIN, 0, 5, aiDoorLockMasterPINCode );
//



// TT3_init_1ms();//初始化定时器为1ms,暂时不启动,等待应用启动。
// TLED_init(); //LED灯的I/O口初始化为输入状态和关闭状态。
// TKEY_init(TKEY_SCAN);//按键检测采用扫描模式
// TUART_init(BAUD_115200);//初始化UART串口
// TUART_cnt = 0; //UART串口接收数据计数初始化为0
// TSPI_init(); //初始化SPI串口
// TSPI_cnt = 0; //SPI串口接收数据计数初始化为0
// EA = 1; //中断开启

AP_circleBuff_comBuff0_init();//初始化通信数据包循环缓冲区。
osal_set_event(zclSampleDoorLock_TaskID, TZIGBEE_AP_EVENT);//设置应用层处理事件。

//--上电LED1,LED2快闪几下,指示系统开始工作--
HAL_TURN_OFF_LED2();
HAL_TURN_OFF_LED1();
for(i=0;i<10;i++)
{
Tdelay_ms(100);
HAL_TOGGLE_LED1();
HAL_TOGGLE_LED2();
}
}

/*********************************************************************
* @fn zclSample_event_loop
*
* @brief Event Loop Processor for zclGeneral.
*
* @param none
*
* @return none
*/
uint16 zclSampleDoorLock_event_loop( uint8 task_id, uint16 events )
{
afIncomingMSGPacket_t *MSGpkt;

(void)task_id; // Intentionally unreferenced parameter

if ( events & SYS_EVENT_MSG )
{
while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( zclSampleDoorLock_TaskID )) )
{
switch ( MSGpkt->hdr.event )
{

case MT_SYS_APP_MSG:
// Message received from MT
zclSampleDoorLock_ProcessAppMsg( ((mtSysAppMsg_t *)MSGpkt)->endpoint,
((mtSysAppMsg_t *)MSGpkt)->appDataLen,
((mtSysAppMsg_t *)MSGpkt)->appData );
break;

case ZCL_INCOMING_MSG:
// Incoming ZCL Foundation command/response messages
zclSampleDoorLock_ProcessIncomingMsg( (zclIncomingMsg_t *)MSGpkt );
break;

case AF_INCOMING_MSG_CMD: //接受数据

// zcl_ProcessMessageMSG( (afIncomingMSGPacket_t *)MSGpkt );

GenericApp_MessageMSGCB( (afIncomingMSGPacket_t *)MSGpkt );


break;

case ZDO_STATE_CHANGE:
zclSampleDoorLock_NwkState = (devStates_t)(MSGpkt->hdr.status);

// now on the network
if ( (zclSampleDoorLock_NwkState == DEV_ZB_COORD) ||
(zclSampleDoorLock_NwkState == DEV_ROUTER) ||
(zclSampleDoorLock_NwkState == DEV_END_DEVICE) )
{

}
break;

default:
break;
}

// Release the memory
osal_msg_deallocate( (uint8 *)MSGpkt );
}

// return unprocessed events
return (events ^ SYS_EVENT_MSG);
}

if (events & TZIGBEE_AP_EVENT) //判断是否有应用层事件处理,目前是定时50MS周期性地处理。
{
com_packet_process();//通信包处理,查询是否有通信包,有则处理,没有则退出
Ap_auxFuntion_process();//辅助功能处理,包括LED1,LED2灯的显示,复位功能,按键处理等等/

//osal_set_event(zclSampleDoorLock_TaskID, TZIGBEE_AP_EVENT);//设置应用层处理事件。

osal_start_timerEx(zclSampleDoorLock_TaskID, TZIGBEE_AP_EVENT,50);//设置下一次的事件的定时时间事件。
return (events ^ TZIGBEE_AP_EVENT);
}


return 0;

}


// 射频无线收到数据处理
void GenericApp_MessageMSGCB(afIncomingMSGPacket_t *pkt)
{
switch(pkt->clusterId)
{
case ZCL_CLUSTER_ID_CLOSURES_DOOR_LOCK:
//EA=0;//关闭中断,防止在拷贝时被其它通信包中断调用。
AP_circleBuff_WritePacket(pkt->cmd.Data, pkt->cmd.DataLength, RF_PORT_NUM);//把收到的数据,统一压栈到循环缓冲区,等待处理。
//EA=1;//开中断。
break;
}
}


// 射频无线数据发送处理
void GenericApp_packetRFSend(unsigned char *s, unsigned int len)
{
// Set destination address to indirect
zclSampleDoorLock_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;
zclSampleDoorLock_DstAddr.endPoint = SAMPLEDOORLOCK_ENDPOINT;
zclSampleDoorLock_DstAddr.addr.shortAddr = 0xffff;

if(AF_DataRequest( &zclSampleDoorLock_DstAddr,
&SampleApp_epDesc,
ZCL_CLUSTER_ID_CLOSURES_DOOR_LOCK,
(byte)len,
(byte *)s,
&zclSampleDoorLock_TaskID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS)
{
g_sys_ledTimerSel = 6;
}
else
{

}
}

osal_start_timerEx  延迟事件触发问题

当没有执行数据请求AF_DataRequest时,osal_start_timerEx延迟事件正常触发,50ms一次。

当系统程序正在扫描中,执行数据请求函数时,osal_start_timerEx触发事件失效,主要在那个地方找原因?

用户任务初始化时,第一次触发事件。

在处理事件函数中:

当执行到

// 射频无线数据发送处理

void GenericApp_packetRFSend(unsigned char *s, unsigned int len)

{

    // Set destination address to indirect

    zclSampleDoorLock_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;

    zclSampleDoorLock_DstAddr.endPoint = SAMPLEDOORLOCK_ENDPOINT;

    zclSampleDoorLock_DstAddr.addr.shortAddr = 0xffff;

    if(AF_DataRequest( &zclSampleDoorLock_DstAddr,

                       &SampleApp_epDesc,

                       ZCL_CLUSTER_ID_CLOSURES_DOOR_LOCK,

                       (byte)len,

                       (byte *)s,

                       &zclSampleDoorLock_TaskID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS)

    {

    }

    else

    {

       

    }

}

延迟触发事件失效,主要是在哪里找问题?

发送你广播数据的周期太短了,你把周期性时间改为2s钟一次,测试一下!

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

网站地图

Top