ZigBee知识无线龙Word格式文档下载.docx
- 文档编号:22025740
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:74
- 大小:1.98MB
ZigBee知识无线龙Word格式文档下载.docx
《ZigBee知识无线龙Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《ZigBee知识无线龙Word格式文档下载.docx(74页珍藏版)》请在冰豆网上搜索。
条代码是什么意思。
除非你要做协议研究。
每个厂商的协议栈有区别,也就是函数名称和参
数可能有区别,这个要看具体的例子、说明文档。
怎么使用ZigBee协议栈?
举个例子,用户实现一个简单的无线数据通信时的一般步骤:
1、组网:
调用协议栈的组网函数、加入网络函数,实现网络的建立与节点的加入。
2、发送:
发送节点调用协议栈的无线数据发送函数,实现无线数据发送。
3、接收:
接收节点调用协议栈的无线数据接收函数,实现无线数据接收。
是不是看上去很简单啊,其实协议栈很多都封装好了,下面我们大概看看无线发送函数:
1.afStatus_tAF_DataRequest(afAddrType_t*dstAddr,
2.
afStatus_tAF_DataRequest(afAddrType_t*dstAddr,
2.endPointDesc_t*srcEP,
3.
endPointDesc_t*srcEP,
3.uint16cID,
4.
uint16cID,
4.uint16len,
5.
uint16len,
5.uint8*buf,
6.
uint8*buf,
6.uint8*transID,
7.
uint8*transID,
7.uint8options,
8.
uint8options,
8.uint8radius)
用户调用该函数即可实现数据的无线数据的发送,此函数中有8个参数,用户需要将每个参数的含义理解以后,才能熟练使用该函数进行无线数据通信的目的。
现在只讲其中最重要的两个参数,其它参数不需要死记硬背,以后用多了自然就记住了。
4.uint16len,//发送数据的长度;
5.uint8*buf,//指向存放发送数据的缓冲区的指针。
至于调用该函数后,如何初始化硬件进行数据发送等工作,用户不需要关心,ZigBee协议栈
己经将所需要的工作做好了,我们只需要调用相应的API函数即可,而不必关心具体实现细节。
看起来是不是很简单呢,是不是有动手试试的冲动。
先别急还要先安装ZigBee协议栈才能进行开发调试呢,下面就动手安装ZigBee协议栈吧。
解压..\相关资料与软件\Zigbee开发软件\ZStack-CC2530-2.3.0-1.4.0协议栈安装文
件.rar;
解压得到.exe文件,双击进行安装,路径你可以选择默认,同样你也可以选择你想
要安装的位置。
也许有人就困惑了,装完之后不是应该有个桌面图标的么?
其实所谓的安装
协议栈只是把一些文件解压到你安装的目录下。
怎么用它呢?
我们先来看看这个协议栈的目录
Components,顾名思义这个是放我们的库的文件夹,里面放了一些我们用到的ZDO,driver,
hal,zcl等库的代码
Documents,这个不用说大家都知道是放TI的开发文档的,里面很多都是讲述协议栈的API
的有空时可以看看
Projects,这个文件夹放的是TI协议栈的例子程序,一个个例子程序都是以一个个project
的形式给我们的,学好这些例子程序里面的一两个,基本你能做事情了。
Tools,这个文件夹是放TI的例子程序的一些上位机之类的程序,作为工具使用。
好了,基本明白了基本架构之后,我们以一个简单的实验开始。
先掌握一点必要的理论
再实验效果比较好。
打开工程:
..\EB2530\5.zigbee协议栈应用与组网\1.协议栈工作流程和无线收发控制
LED\ZStack-CC2530-2.3.0-1.4.0\Projects\zstack\Samples\SampleApp\CC2530DB\
SampleApp.eww,从软件开发专业角度讲建议大家复制工程到非中文目录,因为有些开发环境对中文路径支持的不好,虽然IAR支持但在实际工作中你想别人看到你的工程,认为你很专业就照着上面做吧。
我们演示就不修改,容易引起大家误会,打开工程如下图:
App:
应用层目录,这是用户创建各种不同工程的区域,在这个目录中包含了应用层的内容和这个项目的主要内容。
HAL:
硬件层目录,包含有与硬件相关的配置和驱动及操作函数。
MAC:
MAC层目录,包含了MAC层的参数配置文件及其MAC的LIB库的函数接口文件。
MT:
实现通过串口可控制各层,并与各层进行直接交互
NWK:
网络层目录,包含网络层配置参数文件网络层库的函数接口文件及APS层库的函数接口。
OSAL:
协议栈的操作系统。
Profile:
Applicationframework应用框架层目录,包含AF层处理函数文件。
应用框架层是应用程序和APS层的无线数据接口。
Security:
安全层目录,包含安全层处理函数,比如加密函数等
Services:
地址处理函数目录,包括地址模式的定义及地址处理函数。
Tools:
工程配置目录,包括空间划分及Z-Stack相关配置信息。
ZDO:
ZDO目录
ZMac:
MAC层目录,包括MAC层参数配置及MAC层LIB库函数回调处理函数。
ZMain:
主函数目录,包括入口函数及硬件配置文件。
Output:
输出文件目录,由IARIDE自动生成。
带协议栈的工程怎么这么多文件夹和文件,都有什么用啊?
后面实验接触多了自然就懂了。
1.编译协议器的程序,在Workspace下拉框中选择“CoordinatorEB-Pro”,在工程名上点
右键选择”RebuildAll”,没错误提示再下载到开发板当中。
尽量教大家用一些快捷方法。
2.编译终端设备的程序选择“EndDeviceEB-Pro”编译下载即可。
两个zigbee节点都下载好后,分别上电看效果吧。
协调器、终端上电,组网成功后D1灯闪烁。
看完后是不是在想怎么实现的?
下面我就带着大家分析协议栈工作流程:
1)zigbee工作流程
2)
看源码推荐大家使用Source_Insight,十分强大的工具,从事软件必备软件,除非你想做菜
鸟,具体使用请参考相关资料与软件\Zigbee参考资料\SourceInsight使用教程.pdf。
下
面列出实验中涉及到比较重要的函数进行详解,由于是带协议栈第一个实验,我们对源码也
进行注释,方便习惯看源码的同志学习。
我建议大家先看看下面的文章,再阅读一次源码加
深印象,后面的例子结构基本相同,所以学好此实验,再做后面的实验就得心应手了。
用户
自己添加的应用任务程序在Zstack中的调用过程:
main()--->
osal_init_system()--->
osalInitTasks()--->
SampleApp_Init()
下面我们就先从main()函数开始吧。
提示:
如果你第一次接触ZStack,第一个实验的代码看注释只须大概知道它们是做什么的,
有点印象就行了,后面实验会徐徐渐进,慢慢带领大家搞懂整个流程和代码的。
如果刚开始
就啃代码,不但效率低而且信心受损。
2)打开ZMain.c找到main函数
intmain(void)
{
osal_int_disable(INTS_ALL);
//关闭所有中断
HAL_BOARD_INIT();
//初始化系统时钟
zmain_vdd_check();
//检查芯片电压是否正常
InitBoard(OB_COLD);
//初始化I/O,LED、Timer等
HalDriverInit();
//初始化芯片各硬件模块
osal_nv_init(NULL);
//初始化Flash存储器
ZMacInit();
//初始化MAC层
zmain_ext_addr();
//确定IEEE64位地址
zgInit();
//初始化非易失变量
#ifndefNONWK
//SincetheAFisn'
tatask,callit'
sinitializationroutine
afInit();
#endif
osal_init_system();
//初始化操作系统
osal_int_enable(INTS_ALL);
//使能全部中断
InitBoard(OB_READY);
//最终板载初始化
zmain_dev_info();
//显示设备信息
#ifdefLCD_SUPPORTED
zmain_lcd_init();
//初始化LCD
#ifdefWDT_IN_PM1
/*IfWDTisused,thisisagoodplacetoenableit.*/
WatchDogEnable(WDTIMX);
osal_start_system();
//NoReturnfromhere执行操作系统,进去后不会返回
return0;
//Shouldn'
tgethere.
}//main()
看了上面的代码后,可能感觉很多函数不认识。
没关系刚开始大概了解流程即可,main函数先执行初始化工作,包括硬件、网络层、任务等的初始化。
然后执行osal_start_system();
操作系统。
进去后可不会回来了。
在这里,我们重点了解2个函数:
初始化操作系统osal_init_system();
运行操作系统osal_start_system();
3)先来看osal_init_system();
系统初始化函数,进入函数。
如果用IAR看代码可在函数名
上单击右键——gotodefinitionof…,便可以进入函数。
发现里面有6个初始化函数,
这里我们只关心osalInitTasks();
任务初始化函数,继续由该函数进入。
voidosalInitTasks(void)
uint8taskID=0;
//分配内存,返回指向缓冲区的指针
tasksEvents=(uint16*)osal_mem_alloc(sizeof(uint16)*tasksCnt);
//设置所分配的内存空间单元值为0
osal_memset(tasksEvents,0,(sizeof(uint16)*tasksCnt));
//任务优先级由高向低依次排列,高优先级对应taskID的值反而小
macTaskInit(taskID++);
//macTaskInit(0),用户不需考虑
nwk_init(taskID++);
//nwk_init
(1),用户不需考虑
Hal_Init(taskID++);
//Hal_Init
(2),用户需考虑
#ifdefined(MT_TASK)//如果定义MT_TASK则调用MT_TaskInit()
MT_TaskInit(taskID++);
APS_Init(taskID++);
//APS_Init(3),用户不需考虑
#ifdefined(ZIGBEE_FRAGMENTATION)
APSF_Init(taskID++);
ZDApp_Init(taskID++);
//ZDApp_Init(4),用户需考虑
#ifdefined(ZIGBEE_FREQ_AGILITY)||defined(ZIGBEE_PANID_CONFLICT)
ZDNwkMgr_Init(taskID++);
//用户创建的任务
SampleApp_Init(taskID);
//SampleApp_Init_Init(5),用户需考虑。
重要!
}
函数对taskID进行初始化,每初始化一个,taskID++。
大家看到了注释后面有些写着用户需
要考虑,有些则写着用户不需考虑。
没错,需要考虑的用户可以根据自己的硬件平台或者其
他设置,而写着不需考虑的也是不能修改的。
TI公司协议栈已完成。
SampleApp_Init()是我
们应用协议栈例程的必要函数,用户通常在这里初始化自己的东西。
至此,
大概了解完毕。
4)接下来看第二个函数osal_start_system();
运行操作系统。
同样用gotodefinition的
方法进入该函数。
voidosal_start_system(void)
#if!
defined(ZBIT)&
&
!
defined(UBIT)
for(;
;
)//ForeverLoop
uint8idx=0;
osalTimeUpdate();
//扫描哪个事件被触发了,然后置相应的标志位
Hal_ProcessPoll();
//轮询TIMER与UART
do{
if(tasksEvents[idx])//Taskishighestprioritythatisready.
break;
//得到待处理的最高优先级任务索引号idx
}while(++idx<
tasksCnt);
if(idx<
tasksCnt)
uint16events;
halIntState_tintState;
HAL_ENTER_CRITICAL_SECTION(intState);
//进入临界区,保护
events=tasksEvents[idx];
//提取需要处理的任务中的事件
tasksEvents[idx]=0;
//清除本次任务的事件
HAL_EXIT_CRITICAL_SECTION(intState);
//退出临界区
events=(tasksArr[idx])(idx,events);
//通过指针调用任务处理函数,关键
//进入临界区
tasksEvents[idx]|=events;
//保存未处理的事件Addbackunprocessedevents
tothecurrenttask.
#ifdefined(POWER_SAVING)
else//Completepassthroughalltaskeventswithnoactivity?
osal_pwrmgr_powerconserve();
//Puttheprocessor/systemintosleep
我们看一下events=tasksEvents[idx];
进入tasksEvents[idx]数组定义,发现恰好是
osalInitTasks()函数里面分配空间初始化过的tasksEvents。
而且taskID一一对应。
这就
是初始化与调用的关系。
taskID把任务联系起来了。
5)SampleApp_Init()用户应用任务初始化函数
voidSampleApp_Init(uint8task_id)
SampleApp_TaskID=task_id;
//osal分配的任务ID随着用户添加任务的增多而改变
SampleApp_NwkState=DEV_INIT;
//设备状态设定为ZDO层中定义的初始化状态
初始化应用设备的网络类型,设备类型的改变都要产生一个事件—ZDO_STATE_CHANGE,从字面理解为ZDO状态发生了改变。
所以在设备初始化的时候一定要把它初始化为什么状态都没有。
那么它就要去检测整个环境,看是否能重新建立或者加入存在的网络。
但是有一种情况例外,就是当NV_RESTORE被设置的候(NV_RESTORE是把信息保存在非易失存储器中),那么当设备断电或者某种意外重启时,由于网络状态存储在非易失存储器中,那么此时就只需要恢复其网络状态,而不需要重新建立或者加入网络了.这里需要设置NV_RESTORE宏定义。
//设备状态设定为ZDO层中定义的初始化状态初始化应用设备的网络类型,设备类型的改变都要产生一个事件—ZDO_STATE_CHANGE,从字面理解为ZDO状态发生了改变。
SampleApp_TransID=0;
//消息发送ID(多消息时有顺序之分)
#ifdefined(BUILD_ALL_DEVICES)
if(readCoordinatorJumper())
zgDeviceLogicalType=ZG_DEVICETYPE_COORDINATOR;
else
zgDeviceLogicalType=ZG_DEVICETYPE_ROUTER;
#endif//BUILD_ALL_DEVICES
//该段的意思是,如果设置了HOLD_AUTO_START宏定义,将会在启动芯片的时候会暂停启动流程,只有外部触发以后才会启动芯片。
其实就是需要一个按钮触发它的启动流程。
#ifdefined(HOLD_AUTO_START)
ZDOInitDevice(0);
//设置发送数据的方式和目的地址寻址模式
//发送模式:
广播发送
SampleApp_Periodic_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;
//广播
SampleApp_Periodic_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;
//指定端点号
SampleApp_Periodic_DstAddr.addr.shortAddr=0xFFFF;
//指定目的网络地址为广播地址
组播发送Setupfortheflashcommand'
sdestinationaddress-Group1
SampleApp_Flash_DstAddr.addrMode=(afAddrMode_t)afAddrGroup;
//组寻址
SampleApp_Flash_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;
SampleApp_Flash_DstAddr.addr.shortAddr=SAMPLEAPP_FLASH_GROUP;
//组号0x0001
//定义本设备用来通信的APS层端点描述符
SampleApp_epDesc.endPoint=SAMPLEAPP_ENDPOINT;
SampleApp_epDesc.task_id=&
SampleApp_TaskID;
//SampleApp描述符的任务ID
SampleApp_epDesc.simpleDesc//SampleApp简单描述符
SampleApp_epDesc.latencyReq=noLatencyReqs;
//延时策略
//向AF层登记描述符,登记endpointdescription到AF,要对该应用进行初始化并在AF
进行登记,告诉应用层有这么一个EP已经开通可以使用,那么下层要是有关于该应用的信
息或者应用要对下层做哪些操作,就自动得到下层的配合
afRegister(&
SampleApp_epDesc);
//登记所有的按键事件
RegisterForKeys(SampleApp_TaskID);
//Bydefault,alldevicesstartoutinGroup1
SampleApp_Group.ID=0x0001;
//组号
osal_memcpy(SampleApp_Group.name,"
Group1"
7);
//设定组名
aps_AddGroup(SAMPLEAPP_ENDPOINT,&
SampleApp_Group);
//把该组登记添加到APS中
#ifdefined(LCD_SUPPORTED)
HalLcdWriteString("
SampleApp"
HAL_LCD_LINE_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ZigBee 知识 无线