SmartRF06评估板 Z-stack Home1.2小问题。
问题主要是任务事件触发问题
我在任务初始化中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钟一次,测试一下!