我们现在在调试CC2538和CC2630模块:
遇到个小的问题,请教一下:
CC2538作为协调器,基于SampleDoorLockController例程修改
CC2630作为终端设备,基于SampleDoorLock例程修改
目前通过CC2538上的按键去控制CC2630开发上的LED,是可以正常开关的
我把EZ-Mode的启动设为了上电自动启动
两者上电后可以正常通信
做如下测试发现个问题:
如果是协调器先上上电,节点后上电,被控的LED开关相应没什么延时
如果是节点先上电,协调器后上电,按下协调器上的按键后,节点的LED要等5秒以上才会反应,多次尝试现象一样
这个可能是什么原因?
EZ-Mode上电自动启动的代码如下:
把2538协调器的EZ-Mode自启动加在了void zclSampleDoorLockController_Init( byte task_id )函数的末尾,如下:
//EZ-Mode
if ( ( giDoorLockScreenMode == DOORLOCK_MAINMODE ) ||
( giDoorLockScreenMode == DOORLOCK_HELPMODE ) )
{
giDoorLockScreenMode = DOORLOCK_MAINMODE;
#ifdef ZCL_EZMODE
{
zclEZMode_InvokeData_t ezModeData;
static uint16 clusterIDs[] = { ZCL_CLUSTER_ID_CLOSURES_DOOR_LOCK }; // only bind on the on/off cluster
// Invoke EZ-Mode
ezModeData.endpoint = SAMPLEDOORLOCKCONTROLLER_ENDPOINT; // endpoint on which to invoke EZ-Mode
if ( ( zclSampleDoorLockController_NwkState == DEV_ZB_COORD ) ||
( zclSampleDoorLockController_NwkState == DEV_ROUTER ) ||
( zclSampleDoorLockController_NwkState == DEV_END_DEVICE ) )
{
ezModeData.onNetwork = TRUE; // node is already on the network
}
else
{
ezModeData.onNetwork = FALSE; // node is not yet on the network
}
ezModeData.initiator = TRUE; // DoorLock Controller is an initiator
ezModeData.numActiveInClusters = 0;
ezModeData.pActiveInClusterIDs = NULL;
ezModeData.numActiveOutClusters = 1; // active output cluster
ezModeData.pActiveOutClusterIDs = clusterIDs;
zcl_InvokeEZMode( &ezModeData );
#ifdef LCD_SUPPORTED
HalLcdWriteString( "EZMode", HAL_LCD_LINE_2 );
#endif
}
// NOT ZCL_EZMODE, Use EndDeviceBind
#else
{
zAddrType_t dstAddr;
HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );
// Initiate an End Device Bind Request, this bind request will
// only use a cluster list that is important to binding.
dstAddr.addrMode = afAddr16Bit;
dstAddr.addr.shortAddr = 0; // Coordinator makes the match
ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
SAMPLEDOORLOCKCONTROLLER_ENDPOINT,
ZCL_HA_PROFILE_ID,
0, NULL, // No incoming clusters to bind
ZCLSAMPLEDOORLOCKCONTROLLER_BINDINGLIST, bindingOutClusters,
TRUE );
}
#endif // ZCL_EZMODE
}
if ( ( giDoorLockScreenMode == DOORLOCK_MAINMODE ) ||
( giDoorLockScreenMode == DOORLOCK_HELPMODE ) )
{
giDoorLockScreenMode = DOORLOCK_MAINMODE;
#ifdef ZCL_EZMODE
{
zclEZMode_InvokeData_t ezModeData;
static uint16 clusterIDs[] = { ZCL_CLUSTER_ID_CLOSURES_DOOR_LOCK }; // only bind on the on/off cluster
// Invoke EZ-Mode
ezModeData.endpoint = SAMPLEDOORLOCKCONTROLLER_ENDPOINT; // endpoint on which to invoke EZ-Mode
if ( ( zclSampleDoorLockController_NwkState == DEV_ZB_COORD ) ||
( zclSampleDoorLockController_NwkState == DEV_ROUTER ) ||
( zclSampleDoorLockController_NwkState == DEV_END_DEVICE ) )
{
ezModeData.onNetwork = TRUE; // node is already on the network
}
else
{
ezModeData.onNetwork = FALSE; // node is not yet on the network
}
ezModeData.initiator = TRUE; // DoorLock Controller is an initiator
ezModeData.numActiveInClusters = 0;
ezModeData.pActiveInClusterIDs = NULL;
ezModeData.numActiveOutClusters = 1; // active output cluster
ezModeData.pActiveOutClusterIDs = clusterIDs;
zcl_InvokeEZMode( &ezModeData );
#ifdef LCD_SUPPORTED
HalLcdWriteString( "EZMode", HAL_LCD_LINE_2 );
#endif
}
// NOT ZCL_EZMODE, Use EndDeviceBind
#else
{
zAddrType_t dstAddr;
HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );
// Initiate an End Device Bind Request, this bind request will
// only use a cluster list that is important to binding.
dstAddr.addrMode = afAddr16Bit;
dstAddr.addr.shortAddr = 0; // Coordinator makes the match
ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
SAMPLEDOORLOCKCONTROLLER_ENDPOINT,
ZCL_HA_PROFILE_ID,
0, NULL, // No incoming clusters to bind
ZCLSAMPLEDOORLOCKCONTROLLER_BINDINGLIST, bindingOutClusters,
TRUE );
}
#endif // ZCL_EZMODE
}
把2630节点的EZ-Mode自启动加在了static void DLSApp_initialization(void)函数的末尾,如下:
// Initialize the ZStack
DLSApp_initializeStack();
//EZ-Mode自启动
// If not in PIN mode, start EZMode
if((giDlScreenMode == DLSAPP_MAINMODE) ||
(giDlScreenMode == DLSAPP_HELPMODE))
{
giDlScreenMode = DLSAPP_MAINMODE;
DLSApp_startEzMode();
}
DLSApp_initializeStack();
//EZ-Mode自启动
// If not in PIN mode, start EZMode
if((giDlScreenMode == DLSAPP_MAINMODE) ||
(giDlScreenMode == DLSAPP_HELPMODE))
{
giDlScreenMode = DLSAPP_MAINMODE;
DLSApp_startEzMode();
}
我们想要的效果是不管哪个设备断电,重新上电后都会自动加入或者建立网络