Zigbee网络设备启动基本问题说明Word下载.docx
《Zigbee网络设备启动基本问题说明Word下载.docx》由会员分享,可在线阅读,更多相关《Zigbee网络设备启动基本问题说明Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
自动启动模式:
个人认为就是自动通过ZDApp(具体讲是ZDOInitDevice())来开启设备并初始化建立/加入网络,设备的逻辑类型由所携带的配置文件来决定.
2、三种逻辑类型节点的配置文件
协调器:
f8wCoord.cfg配置文件中同时编译了路由功能RTR_NWK和协调器功能ZDO_COORDINATOR
/*CommonToAllApplications*/
-DCPU32MHZ//CC2430sRunat32MHz
-DFORCE_MAC_NEAR//MACcodeinNEAR
-DROOT=__near_func//MAC/ZMACcodeinNEAR
-DMAC_CFG_APP_PENDING_QUEUE=TRUE
/*CoordinatorSettings*/
-DZDO_COORDINATOR//CoordinatorFunctions
-DRTR_NWK//RouterFunctions
/*OptionalSettings*/
-DBLINK_LEDS//LEDBlinkFunctions
/*Compilerkeywords*/
-DCONST="
const__code"
-DGENERIC=__generic//Ptrdeclaration
路由器:
f8wRouter.cfg配置文件中编译了路由功能RTR_NWK
/*RouterSettings*/
终端:
f8wEdev.cfg配置文件中没有编译这两个功能.
-DMAC_OPT_FFD=0//ZigBeeRFD
协调器的配置文件只比路由器配置文件多编译了个-DZDO_COORDINATOR//CoordinatorFunctions
如果同时编译非自动启动模式HOLD_AUTO_START和软启动模式SOFT_START,设备可以通过应用程序来选择成为路由器或协调器.当然这个设备所带的配置文件应为f8wCoord.cfg.对于设备携带的是何种配置文件,可以打开project->
options->
c/c++compiler->
extraOptions选项查看.
比如SampleApp中的DemoEB,同时编译了SOFT_START和HOLD_AUTO_START,貌似下载进去后通过外部跳线来选择是当协调器还是路由器,不过这部分程序已经被注销了.当然的,DemoEB所带的配置文件应该是同时编译了路由功能和协调器功能的f8wCoord.cfg,即编译了RTR_NWK和ZDO_COORDINATOR.再比如SimpleApp中两个实验中的灯与开关实验.开关设备SimpleSwitchEB无论按K1还是K2都是作为终端设备的,其预编译选项只有HOLD_AUTO_START而没有SOFT_START,配置文件为f8wEndev.cfg,没有协调器和路由功能;
而灯设备SimpleControllerEB按键K1则作为协调器,按K2则作为路由器,其预编译选项同时编译了SOFT_START和HOLD_AUTO_START,配置文件为f8wCoord.cfg,即编译了RTR_NWK和ZDO_COORDINATOR.SimpleApp中传感器实验也一样,只能作为终端设备的SimpleSensorEB预编译了HOLD_AUTO_START,配置文件为f8wEndev.cfg;
而SimpleCollectorEB按K1作为协调器按K2作为路由器,预编译了SOFT_START和HOLD_AUTO_START,配置文件f8wCoord.cfg.可以通过project->
extraOptions选项查看,也可由workspace看出,如下:
作为终端的开关节点与作为协调器/路由器的灯节点:
空白的文件表示没有包含在这个workspace中.
作为终端的传感器节点与作为协调器、路由器的中心收集节点:
***********************************
3、有两种方式来设置非自动启动模式:
HoldAutoStart
(1)、手工方式:
在ZDApp_Init()函数中有个ZDAppCheckForHoldKey();
(//Checkformanual(手工的)"
HoldAutoStart"
).
来看下这个函数:
********************
voidZDAppCheckForHoldKey(void)
{
#if(definedHAL_KEY)&
&
(HAL_KEY==TRUE)
//直接通过读取按键来判断是否需要采用HOLD_AUTO_START模式,如果发现
//SW_1处于按下(普通按键?
)/向上(Joystickup)状态,则设置devState为DEV_HOLD;
//GetKeypaddirectlytoseeifaHOLD_STARTisneeded.
//HolddowntheSW_BYPASS_STARTkey(seeOnBoard.h)
//whilebootingtoavoidstartingupthedevice.
if(HalKeyRead()==SW_BYPASS_START)//HAL_KEY_SW_1
//ChangethedevicestatetoHOLDonstartup
devState=DEV_HOLD;
}
#endif//HAL_KEY
*********************
可以看到如果手工使HAL_KEY_SW_1置位状态,则会设置devState=DEV_HOLD.
这里HAL_KEY的初始化见hal_board_cfg.h:
#ifndefHAL_KEY
#defineHAL_KEYTRUE
#endif
而对SW_BYPASS_START的初始化见OnBoard.h:
//TheseKeydefinitionsareuniquetothisdevelopmentsystem.
//Theyareusedtobypassfunctionswhenstartingupthedevice.
//这些键的定义仅适用于本应用例子,可以在设备启动时避开一些功能:
//避开网络层的NV存储和避开网络初始化
#defineSW_BYPASS_NVHAL_KEY_SW_5//BypassNetworklayerNVrestore
#defineSW_BYPASS_STARTHAL_KEY_SW_1//BypassNetworkinitialization
因此避开网络层NV存储也可以通过手工方式来完成.
(2)、预编译方式:
project->
preprocessor->
definedsymbols下编译选项:
HOLD_AUTO_START
SimpleApp例子里四种节点都预编译了HOLD_AUTO_START:
非自动启动模式
在ZDApp.c中:
#ifdefined(HOLD_AUTO_START)
devStates_tdevState=DEV_HOLD;
#else
devStates_tdevState=DEV_INIT;
把devState初始化为DEV_HOLD.
以上两种方式最终都会设置devState=DEV_HOLD//Initialized-notstartedautomatically
****************************************
4、devStartMode和devState的初始化,ZDApp.c中:
devStartMode:
#ifdefined(ZDO_COORDINATOR)&
!
defined(SOFT_START)
//Setthedefaulttocoodinator
devStartModes_tdevStartMode=MODE_HARD;
devStartModes_tdevStartMode=MODE_JOIN;
//Assumejoining
//devStartModes_tdevSt