飞比开发板学习教程,经典教程

更新时间:2023-11-09 10:31:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

“飞比”Zigbee论坛CC2530开发板学习教程(一)--前言

转自飞比bbs 发布: 2010-7-02 17:34 | 作者: outman | 来源: “飞比”Zigbee论坛 由于我们极力倡导“开源Zigbee”,有网友对我们的CC2530开发板项目有所误解,认为我们的开发板是用freakz而不用TI提供的ZStack。实则不然,ZStack是由Zigbee组织认证通过的“Golden unit”Zigbee平台,或者叫Zigbee中的“明星工程”。而且TI公司免费提供了一整套的开发平台及代码。我们没有理由拒绝这么优秀的平台,选择freakz作为补充,只是为了深入到协议层的学习,了解更多的“为什么”。

一个有效的学习过程,应该是由浅入深,由表面到本质。我们将ZStack的学习定位为了解“是什么”和“怎么样”的过程。从上一篇SerialApp的讲解开始,到本篇的GenericApp和后面的SampleApp, TransmitApp与SimpleApp我们都会以了解例程功能,操作与基本原理为主,深入的学习将在“奥特曼Zigbee读书日记”中进行铺开。

[注:本文源自www.feibit.com--“飞比”Zigbee论坛,为尊重劳动者成果,如需转载请保留此行,并通知作者]

其实这几个例程实现了不同的功能,方便了开发者在此基本功能上进行二次开发,以缩短项目周期,一定程序上减轻了Zigbee开发的复杂度。让我们一起来一一进行分析:

例4、ZStack的“Hello, world!”例程――GenericApp

注:本例程位于C:\\Texas Instruments\\ZStack-CC2530-2.3.0-1.4.0\\Projects\\zstack\\ Samples\\GenericApp\\CC2530DB目录下,IAR工程文件为GenericApp.eww

[一]程序功能

本例程在启动后,自动组织建立一个Zigbee网络(我们以一个协调器和终端节点组成的简单网络进行讲解),网络中的设备间通过“绑定”与“按条件搜索”两种方式,建立连接。成功之后互相发送“Hello, world!”字符信息

[二]操作说明

打开上述的工程文件,分别选择“Coordinator”与“Enddevice”两种设备进行编译、下载至两个FB2530EB板中,详细过程前文已有描述,不再重复。按Reset键后,屏幕显示如下:

如果显示信息如上图所示,则表示网络初始化成功。

此时,按下Enddevice的摇杆(Joystick)右键进行绑定申请,然后立即按下Coordinator的Joystick右键进行绑定确认。此时,两个节点的红色LED灯--LED1,同时点亮,表示绑定成功,可以开始通信。

注:绑定也可以由Coordinator发起,由Enddevice响应。

在成功建立连接后,Enddevice与Coordinator均将每5秒钟向对方发送一次“Hello World”字符串。

与前文SerialApp例程相似,建立连接的方式除了“绑定”外,还有“条件搜索”的方式。按Enddevice的摇杆(Joystick)左键发送“条件搜索”请求――即按规定的ProfileID,支持的Cluster等信息进行匹配设备查找,收到此请求后,Coordinator将会显示如下:

此信息表明Coordinator已经接收到搜索请求,并且返回了响应信息。随后,Enddevice的红色LED1亮,表示已与匹配设置建立了连接。Enddevice将发送“Hello, world”信息,从Coordinator的LCD上可以看到信息被成功接收。

[三]系统解析

下面我们一起从代码中了解下上述的过程:

在自动启动网络成功后,Coordinator与Enddevice均将执行如下代码,进行信息发送:

1. UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events ) 2. {

3. ? ?

4. case ZDO_STATE_CHANGE:

5. GenericApp_NwkState = (devStates_t)(MSGpkt->hdr.status); 6. if ( (GenericApp_NwkState == DEV_ZB_COORD) 7. || (GenericApp_NwkState == DEV_ROUTER)

8. || (GenericApp_NwkState == DEV_END_DEVICE) ) 9. {

10. // Start sending \11. osal_start_timerEx( GenericApp_TaskID,

12. GENERICAPP_SEND_MSG_EVT, 13. GENERICAPP_SEND_MSG_TIMEOUT ); 14. }

复制代码

并且由下面代码实现重复发送,每5秒种一次

1. if ( events & GENERICAPP_SEND_MSG_EVT ) 2. {

3. // Send \

4. GenericApp_SendTheMessage(); 5.

6. // Setup to send message again

7. osal_start_timerEx( GenericApp_TaskID,

8. GENERICAPP_SEND_MSG_EVT, 9. GENERICAPP_SEND_MSG_TIMEOUT ); 10.

11. // return unprocessed events

12. return (events ^ GENERICAPP_SEND_MSG_EVT); 13. }

复制代码

但此时的发送地址并不明确目标。须要如下建立连接的过程,才可将信息发送至某设备:

一、绑定方式

1、按JoyStick右键发送绑定请求:

1. if ( keys & HAL_KEY_SW_2 ) 2. {

3. HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF ); 4.

5. // Initiate an End Device Bind Request for the mandatory endpoint 6. dstAddr.addrMode = Addr16Bit;

7. dstAddr.addr.shortAddr = 0x0000; // Coordinator

8. ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(), 9. GenericApp_epDesc.endPoint, 10. GENERICAPP_PROFID,

11. GENERICAPP_MAX_CLUSTERS, (cId_t

*)GenericApp_ClusterList,

12. GENERICAPP_MAX_CLUSTERS, (cId_t

*)GenericApp_ClusterList,

13. FALSE ); 14. }

复制代码

2、另外一个节点在规定时间内按JoyStick右键进行响应,则双方完成绑定,并将先后收到End_Device_Bind_rsp,即绑定响应信号,以表示对方成功进行了应答,可以互相通讯,此时双方红色LED1先后亮起,互送“Hello, world”字符。

1. 2. 3. 4. 5.

void GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg ) {

switch ( inMsg->clusterID ) {

case End_Device_Bind_rsp:

6. if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess ) 7. {

8. // Light LED

9. HalLedSet( HAL_LED_4, HAL_LED_MODE_ON ); 10. }

复制代码

二、“条件搜索”的方式

1、Enddevice按下Joystick左键发起搜索

1. 2. 3. 4. 5. 6. 7. 8. 9.

if ( keys & HAL_KEY_SW_4 ) {

HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );

// Initiate a Match Description Request (Service Discovery) dstAddr.addrMode = AddrBroadcast;

dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR; ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR, GENERICAPP_PROFID,

GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,

10. GENERICAPP_MAX_CLUSTERS, (cId_t

*)GenericApp_ClusterList,

11. FALSE ); 12. }

复制代码

其要求条件见ZDP_MatchDescReq函数的参数。

2、Coordinator对此搜索进行处理,对于接受此要求的设备进行查找。其依据为设备在开机初始化时,如果注册为响应此类信息,则此时由Coordinator向搜索发起者进行汇报。开机注册函数如下:

1. ZDO_RegisterForZDOMsg( GenericApp_TaskID, Match_Desc_rsp );

复制代码

3、搜索发起者(Enddevice)接收到Match_Desc_rsp响应,做如下处理:

1. 2. 3. 4. 5. 6. 7.

case Match_Desc_rsp: {

ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg ); if ( pRsp ) {

if ( pRsp->status == ZSuccess && pRsp->cnt ) {

本文来源:https://www.bwwdw.com/article/7lcv.html

Top