ZIGBEE协调器启动Word下载.docx
《ZIGBEE协调器启动Word下载.docx》由会员分享,可在线阅读,更多相关《ZIGBEE协调器启动Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
-f$PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wCoord.cfg
-f$PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wConfig.cfg
即编译了ZDO_COORDINATOR和RTR_NWK.
Preprocessor->
Definedsymbols可以看到协调器预编译包含了:
CC2430EB;
ZTOOL_P1;
MT_TASK;
LCD_SUPPORTED=DEBUG;
MANAGED_SCAN
没有编译HOLD_AUTO_START和SOFT_START.
2、具体流程
main()->
osal_init_system()->
osalInitTasks()->
ZDApp_Init()
进入ZDApp_Init()函数:
**************************************
voidZDApp_Init(bytetask_id)
{
uint8capabilities;
//SavethetaskID
ZDAppTaskID=task_id;
//InitializetheZDOglobaldeviceshortaddressstorage
ZDAppNwkAddr.addrMode=Addr16Bit;
ZDAppNwkAddr.addr.shortAddr=INVALID_NODE_ADDR;
//0xFFFE
(void)NLME_GetExtAddr();
//LoadthesaveExtAddrpointer.
//Checkformanual"
HoldAutoStart"
//检测到有手工设置SW_1则会设置devState=DEV_HOLD,从而避开网络初始化
ZDAppCheckForHoldKey();
//InitializeZDOitemsandsetupthedevice-typeofdevicetocreate.
ZDO_Init();
//通过判断预编译来开启一些函数功能
//RegistertheendpointdescriptionwiththeAF
//Thistaskdoesn'
thaveaSimpledescription,butwestillneed
//toregistertheendpoint.
afRegister((endPointDesc_t*)&
ZDApp_epDesc);
#ifdefined(ZDO_USERDESC_RESPONSE)
ZDApp_InitUserDesc();
#endif//ZDO_USERDESC_RESPONSE
//setbroadcastaddressmasktosupportbroadcastfiltering
NLME_GetRequest(nwkCapabilityInfo,0,&
capabilities);
NLME_SetBroadcastFilter(capabilities);
//Startthedevice?
if(devState!
=DEV_HOLD)
ZDOInitDevice(0);
}
/*如果devState=DEV_HOLD,则不会调用ZDOInitDevice()来初始化网络
即不组网也不进网.LED4闪烁等待应用程序来开启设备并初始化网络
*/
else
//BlinkLEDtoindicateHOLD_START
HalLedBlink(HAL_LED_4,0,50,500);
ZDApp_RegisterCBs();
协调器没有编译HOLD_AUTO_START,也没有手工设置SW_1,初始化devState=DEV_INIT(参见基本问题说明3).因此直接在ZDApp_Init()中进入ZDOInitDevice(0)开启设备.
uint8ZDOInitDevice(uint16startDelay)
//初始化设备网络状态为ZDO_INITDEV_NEW_NETWORK_STATE:
新的网络状态.
//可能意味着ZCD_NV_STARTUP_OPTION不能恢复,或没有任何网络状态恢复
uint8networkStateNV=ZDO_INITDEV_NEW_NETWORK_STATE;
uint16extendedDelay=0;
devState=DEV_INIT;
//RemovetheHoldstate
//Initializeleavecontrollogic
//函数读取NV项目ZCD_NV_LEAVE_CTRL的值,ZDApp_LeaveCtrl指向这个值
ZDApp_LeaveCtrlInit();
//Checkleavecontrolresetsettings
ZDApp_LeaveCtrlStartup(&
devState,&
startDelay);
//Leavemaymaketheholdstatecomeback
//以上两个函数设置了对设备离开时的控制,如果有延时则延时,没有则
//把设备状态设为DEV_HOLD
if(devState==DEV_HOLD)
//ZDO_INITDEV_LEAVE_NOT_STARTED:
该设备没有在网络中,下次调用才启用.
return(ZDO_INITDEV_LEAVE_NOT_STARTED);
//Don'
tjoin-(onetime).
#ifdefined(NV_RESTORE)
//GetKeypaddirectlytoseeifaresetnvisneeded.
//HolddowntheSW_BYPASS_NVkey(definedinOnBoard.h)
//whilebooting(引导)toskippastNVRestore.
if(HalKeyRead()==SW_BYPASS_NV)
//SW_BYPASS_NV按键处于按下状态时,则避开网络层的NV存储
networkStateNV=ZDO_INITDEV_NEW_NETWORK_STATE;
//设备网络状态为新的网络状态
//DetermineifNVshouldberestored
//函数返回的设备网络状态要么是新的网络状态;
要么是恢复的网络状态;
以此
//来确定要不要读取NV里相应条目来恢复网络先前状态
networkStateNV=ZDApp_ReadNetworkRestoreState();
//如果设备的网络状态为恢复的网络状态
if(networkStateNV==ZDO_INITDEV_RESTORED_NETWORK_STATE)
//恢复设备先前的网络状态参数并且
//设置devStartMode=MODE_RESUME!
!
networkStateNV=ZDApp_RestoreNetworkState();
else
//如果设备的网络状态为新的网络状态,在下面进行处理
//Wipeout(清除)thenetworkstateinNV
NLME_InitNV();
NLME_SetDefaultNV();
//设置默认NV条目
#endif
//如果设备的网络状态为新的网络状态
if(networkStateNV==ZDO_INITDEV_NEW_NETWORK_STATE)
//根据预编译来设置设备新的网络状态参数
ZDAppDetermineDeviceType();
/*!
//Onlydelayifjoiningnetwork-notrestoringnetworkstate
extendedDelay=(uint16)((NWK_START_DELAY+startDelay)
+(osal_rand()&
EXTENDED_JOINING_RANDOM_MASK));
//Initializedevicesecurity
ZDApp_SecInit(networkStateNV);
//Triggerthenetworkstart
ZDApp_NetworkInit(extendedDelay);
return(networkStateNV);
分两种情况:
(1)如果协调器预编译了NV_RESTORE,且函数ZDApp_ReadNetworkRestoreState()返回值为ZDO_INITDEV_RESTORED_NETWORK_STATE,则进入ZDApp_RestoreNetworkState()里设置ZDO_Config_Node_Descriptor.LogicalType=NODETYPE_COORDINATOR和devStartMode=MODE_RESUME.
****************
uint8ZDApp_RestoreNetworkState(void)
…………
//Areweacoordinator
//设备的网络状态为恢复的网络状态.则进入这个函数进行恢复
//先判断如果短地址为0则设置设备逻辑类型为协调器且devStartMode=MODE_RESUME
//否则设置devStartMode=MODE_RESUME
ZDAppNwkAddr.addr.