zigbee学习总结doc.docx
- 文档编号:3990676
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:10
- 大小:20.76KB
zigbee学习总结doc.docx
《zigbee学习总结doc.docx》由会员分享,可在线阅读,更多相关《zigbee学习总结doc.docx(10页珍藏版)》请在冰豆网上搜索。
zigbee学习总结doc
zigbee学习总结
篇一:
Zigbee协议栈学习总结
典型的智能家居网络总体结构图
智能家居系统模块整体框图
ZigBee是一种标准,该标准定义了短距离、低速率传输速率无线通讯所需要的一系列通信协议。
基于ZigBee的无线网络所使用的工作频段为868MHz、915MHz和2.4GHz,最大数据传输速率为250Kbps。
ZigBee无线网络共分为5层:
物理层(PHY),介质访问控制层(MAC),网络层(NWK),应用程序支持子层(APS),应用层(APL)。
总体而言,ZigBee技术有如下特点:
高可靠性,低成本,低功耗,高安全性,低数据速率
Zigbee网络中的设备主要分为三种:
1,协调器,协调器节点负责发起并维护一个无线网络,识别网络中的设备加入网络,一个ZigBee网络只允许有一个ZigBee协调器;
2,路由器,路由器节点支撑网络链路结构,完成数据包的转发;。
ZigBee网格或树型网络可以有多个ZigBee路由器。
ZigBee星型网络不支持ZigBee路由器。
3,终端节点,负责数据采集和可执行的网络动作。
从功能上,zigbee节点应由微控制器模块、存储器、无线收发模块、电源模块和其它外设功能模块组成。
ZigBee/IEEE802.15.4
定义了两种类型的设备:
它们是全功能设备(FFD,FullFunctionDevice)和精减功能设备(RFD,ReducedFunctionDevice)。
FFD可以当作一个网络协调器或者一个普通的传感器节点,它可以和任何其他的设备通讯,传递由RFD发来的数据到其他设备,即充当了路由的功能。
而RFD只能是传感器节点,它只能和FFD进行通讯,经过FFD可以将自己测得数据传送出去。
在ZigBee网络中大多是这两种设备,网络中结点数理论上最多可达65,536个,可以组成三种类型网络:
星型、网状型和树型。
星状网络由一个PAN协调器和多个终端设备组成,只存在PAN协调器与终端的通讯,终端设备间的通讯都需通过PAN协调器的转发。
树状网络由一个协调器和一个或多个星状结构连接而成,设备除了能与自己的父节点或子节点进行点对点直接通讯外,其他只能通过树状路由完成消息传输。
网状网络是树状网络基础上实现的,与树状网络不同的是,它允许网络中所有具有路由功能的节点直接互连,由路由器中的路由表实现消息的网状路由。
星型,如果用星型网络的话,在房间内的节点是否能够穿墙,与房间外的协调器进行正常通信。
RFD的应用非常简单,容易实现,就好像一个电灯的开关或者一个红外线传感器,由于RFD不需要发送大量的数据,并且一次只能同一个FFD连接通信,因此,RFD仅需要使用较小的资源和存储空间,这样,就可以非常容易地组建一个低成本和低功耗的无线通信网络
Zigbee2007协议栈主要应用领域有:
家庭自动化,商业楼宇自动化,自动读表系统。
IEEE802.15.4(Zigbee)工作在ISM(industrial,Scientific,medical即工业,科学,医疗)频段,定义了两个频段,2.4GHz频段和896/915MHz频段。
在IEEE802.15.4中共规定了27个信道:
在2.4GHz频段,共有16个信道,信道同学速率为250Kbps;
在915MHz频段,共有10个信道,信道通信速率为40Kbps
在896MHz频段,共有1个信道,信道通信速率为20Kbps
协议栈的工作原理,这个东西将是我们以后接触得最多的东西,从学习到项目开发,你不得不和他打交道。
由于我们的学习平台是基于TI公司的,所以讲述的当然也是TI的Z-STACK。
ZigBee协议栈已经实现了ZigBee协议,用户可以使用协议栈提供的API进行应用程序的开发,在开发过程中完全不必关心ZigBee协议的具体实现细节,要关心的问题是:
应用层的数据是使用哪些函数通过什么方式把数据发送出去或者把数据接收过来的。
所以最重要的是我们要学会使用ZigBee协议栈。
举个例子,用户实现一个简单的无线数据通信时的一般步骤:
1、组网:
调用协议栈的组网函数、加入网络函数,实现网络的建立与节点的加入。
2、发送:
发送节点调用协议栈的无线数据发送函数,实现无线数据发送。
3、接收:
接收节点调用协议栈的无线数据接收函数,实现无线数据接收。
Zigbee设备工作流程:
Zigbee协议栈采用任务轮训的方式工作,他会查找发生的事件然后调用相应的事件执行函数。
如果没有事件登记要发生,那么就进入睡眠模式
网络启动流程图
篇二:
ZigBee学习电子笔记
第二讲
1.cc2530通用I/O口有21个:
P0/P1/口个8个;P2口5个,其中,P1_0、P_1有20mA的驱动能力,其余只有
4mA
2.IO口配置相关的寄存器(3个)
PxSEL:
P0SEL、P1SEL、P2SEL,每个寄存器是1byte,分别用来设定3个口的工作模式。
IO的两种工作模式:
1.普通IO口模式:
点灯、监测按键输入
2.片上外设模式:
作为串口或者其他非普通IO口
PxDIR:
P0DIR/P1DIR/P2DIR,每个寄存器占一个字节,用来设定IO口作为输入还是输出
PxINP:
P0INP/P1INP/P2INP:
输入情况下,注意P2INP寄存器后3位的用法(见下图):
输出示例(以P0_0为例):
1)设置P0_0为普通IO口工作模式,非片上外设:
P0SEL=0xFE
2)让P0_0作为输出用,非输入监测用:
P0DIR=0x01
3)输出(如P0_0=0或P0_0=1等)。
输入示例(让P1_2作为输入):
1)设置P1_2为普通IO口工作模式,非片上外设:
P1SEL=0xfd
2)让P1_2作为输入检测用,非输出用P1DIR=0xfd
3)选择上拉、下拉或三态中的一种输入(因为上电的时候寄存器默认为0,所以IO口都默认工作在普通IO口输入、上下拉模式)
4)检测用:
If(P1_2==0or1)
{
}
Else
{
}
总结:
由此可见,当芯片上电初始化后,3组IO口默认工作在普通IO口下的输入监测、上拉输入模式。
自己编程示例:
篇三:
zigbee学习心得——实例分析
网易
新闻微博邮箱相册阅读有道摄影爱拍优惠券云笔记闪电邮手机邮印像派网易识字
更多
博客
手机博客博客搬家博客VIP服务
LiveWriter写博word写博邮件写博短信写博
群博客博客油菜地博客话题博客热点博客圈子找朋友
发现
小组
风格
网易真人搭配社区iStyle
网易真人搭配社区iStyle
网易真人搭配社区iStyle
玩摄影,玩LOFTER
玩胶片,玩LOFTER
玩绘画,玩LOFTER
创建博客登录
加关注
显示下一条|关闭
温馨提示!
由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!
立即重新绑定新浪微博》|关闭
豪醒的博客
不只是一个人的旅程
导航
首页
日志
相册
博友
关于我
日志
zigbee学习心得2——协议栈任务
Fork-VFork一张图说明区别
zigbee学习心得——实例分析(温湿度采集及控制)
2012-08-0516:
58:
58|分类:
zigbee|标签:
cc2430zigbe
e温湿度cc2430|字号大中小订阅
就像这样,先添加于温湿度传感器相关的.c和.h文件,还有串口相关的,c和.h也就是写好可以给另外的文件调用的函数了。
我这里面只用到了voidwenshi_receive;一个函数,然后将函数和其中所用到的两个变量TH,RH,分别代表温度和湿度设为全局变量。
先打开SimpleSensor.c这个小工程,用官方程序调试的时候可以看出,也就是不断地发数据到协调器,自然就要找到与发数据相关的函数:
那其实发送之前要先与协调器绑定吧,好比打电话也要先拨通电话吧。
找到与绑定相关的函数:
voidzb_BindConfirm
{
if)
{
myAppState=APP_BOUND;
//Startreportingsensorvalues
myApp_StartReporting;
}
else
{
//Continuetodiscoveracollector
osal_start_timerEx;
}
}
直接点,若绑定成功,就会返回一个ZB_SUCCESS的状态,此时方会调用myApp_StartReporting;函数,否则就继续搜索节点。
对于myApp_StartReporting;:
voidmyApp_StartReporting
{
osal_start_timerEx;
osal_start_timerEx;
HalLedSet;
}
直观地从函数看上去也就相当于添加一个周期性的任务;
从上一篇文章讲过这个TaskID的问题,也就添加一个任务嘛,回到整个工程的主函数,看看怎么回事,这里面就不详细地列出来了,有需要的读者可以一探究竟。
过程是这样的:
主函数:
ZSEGintmain——/*系统初始化*/osal_init_system;——osalInitTasks;/*任务初始化*/
——SAPI_Init;/*用户自定义任务函数,他的任务ID为taskID*/?
——
/*其中的一个等式*/sapi_TaskID=task_id;
也就是说可以通过osal_start_timerEx添加一个周期性的任务,其周期为XXXPeriod,比如片内温度采集:
myTempReportPeriod,电压测量myBatteryCheckPeriod,那XXXEVT,也就相当于一个任务Task里面一个独立的事件Event了。
那么我们也可以这么添加自己的事件:
再看看XXXEVT和XXXPeriod的定义:
//Applicationosaleventidentifiers
//Bitmaskofevents
#defineMY_START_EVT0x0001
#defineMY_REPORT_TEMP_EVT0x0002
#defineMY_REPORT_BATT_EVT0x0004
#defineMY_FIND_COLLECTOR_EVT0x0008
自己跟着做:
#defineMY_REPORT_WENDU_EVT0x0010
#defineMY_REPORT_SHIDU_EVT0x0020
这里说一下为什么要这么做
因为等下调用任务处理函数zb_HandleOsalEvent;的时候判断语句是这种形式的:
if
按位与,所以..
顺便说一下,我最初做这个东西看漏了这条语句,传输过程会突然断开连接,这个bug搞了我十多天。
。
周期时间:
(对照范例)
staticuint16myStartRetryDelay=10000;//milliseconds
staticuint16myTempReportPeriod=5000;//milliseconds
添加:
staticuint16myWENDUReportPeriod=6000;//milliseconds
staticuint16mySHIDUReportPeriod=7000;//milliseconds
这样子(这里的周期是毫秒级的,比如5000代表的就是5秒传一次MCU的温度)
再回到刚才的myApp_StartReporting添加:
osal_start_timerEx;
osal_start_timerEx;
这样就添加好了自己读取温湿度信息的任务了,然后具体怎么实现这两个任务:
接下来:
而Sensor.c里面有一个Handle函数用于处理时间的:
见介绍和实体:
/*****************************************************************************
*@fnzb_HandleOsalEvent
*
*@briefThezb_HandleOsalEventfunctioniscalledbytheoperating
*systemwhenataskeventisset
*
*@paramevent-Bitmaskcontainingtheeventsthathavebeenset
*
*@returnnone
*/
voidzb_HandleOsalEvent
{
uint8pData[2];//用于存放数据和分类信息的
if
{
zb_StartRequest;
}
if
//这不就是从上面介绍的osal_start_timerEx;函数set的事件么?
!
{
//Readandreporttemperaturevalue
pData[0]=TEMP_REPORT;
//类型存放在pData[0]里面
pData[1]=myApp_ReadTemperature;
//读出来的温度值存到pData[1],myApp_ReadTemperature;是读取温度值的函数
zb_SendDataRequest;
//发送出去
osal_start_timerEx;
//再设这样一个时间,无限循环
}
------------------------------------------------------------------------------------------------------------------------------
这里再说一下发送的过程,首先从刚才osal_start_timerEx;设一个发送温度值的系统事件,在一个myTempReportPeriod的周期之后,通过zb_HandleOsalEvent的调用,再通过if的条件判断执行温度值发送的事件pData[0]用于告诉协调器是温度报告,pData[1]用于告诉协调器节点报告出来的温度值是多少,再通过zb_SendDataRequest函数发送出去,而发送的形式是通过0xFFFE,绑定的形式发送字长为2个unsignedchar类型,发送完毕后再继续调用osal_start_timerEx添加一个相同的温度采集系统事件,不断地重复这个过程。
------------------------------------------------------------------------------------------------------------------------------
if//道理和上面一样
{
//Readbatteryvalue
//Ifbatterylevellow,reportbatteryvalue
pData[0]=BATTERY_REPORT;
pData[1]=myApp_ReadBattery;
zb_SendDataRequest;
osal_start_timerEx;
}
if
{
//Findandbindtoacollectordevice
zb_BindDeviceNULL);
}
}
先添加自己刚设的事件:
if
{
//Readandreporttemperaturevalue
pData[0]=WENDU_REPORT;
//相当于添加一个可以让协调器识别你发过去的是什么的标签
receive;
//调用wenshi.c里面的全局函数receive;wenshi.c是我自己写的一个C
pData[1]=TH;
//代表温度
zb_SendDataRequest;
osal_start_timerEx;
//回调
}
这样子
额,pData[0]=WENDU_REPORT;,既然说这个是要让协调器识别的,那么协调器里面也要有相同的参数。
#defineTEMP_REPORT0x01
#defineBATTERY_REPORT0x02
#defineWENDU_REPORT0x04
#defineSHIDU_REPORT0x08
再分析回原来的事件处理部分:
都有调用zb_SendDataRequest;函数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- zigbee 学习 总结 doc