2024年1月25日发(作者:)
第二章 嵌入式系统
2.1 嵌入式系统概述
嵌入式系统是一种对对象进行自动控制而使其具有智能化并可嵌入对象体系中的专用计算机系统。对象体系又称为嵌入式系统的宿主对象系统,如移动电话,数字电视,家用电器,医疗设备,工业自动化产品等。
从功能上看,嵌入式系统是对宿主对象进行控制的控制器;从结构上看,它是集软硬件于一体的,可独立工作的计算机系统。嵌入式系统的外观像一个可编程的电子器件;其硬件部分包括处理器、存储器、外设器件和I/O端口等,软件部分包括操作系统软件和应用软件[24]。
与通用的计算机系统相比,嵌入式系统具有以下特点:
通常面向某个特定的应用,因此其硬件是针对特定用户群来设计的,具有某种专用性的特点
软件一般固化在存储器芯片上,而不是存储于磁盘载体中,加上结构精简的操作系统,可快速响应外部时间,系统的实时性和可靠性好
用户可以根据实际需要对嵌入式系统的硬件和软件进行精简,去除冗余,降低产品成本,系统的可裁剪性好
将半导体技术、电子技术和计算机技术相结合,具有集成度高,体积小,功耗低的特点
2.2
嵌入式微处理器
作为嵌入式系统的核心部件,嵌入式微处理器(Micro Processor Unit, MPU),是由通用计算机的CPU演变而来,具有较高的性能。在实际应用中,一般只保留和特定应用紧密相关的功能硬件,去除其他冗余的功能元件,将微处理器及其存储器、总线、外围接口等安装在一块电路板上,大大降低了系统的成本和占用空间。
嵌入式微处理器一般就具备如下特点:
具有可扩展的处理器结构,能迅速开发出符合应用要求的嵌入式系统
对实时多任务有很强的支持能力,能完成多任务且中断响应时间较短,有效降低内部代码和实时操作系统的执行时间。
具有强大的存储区保护功能,能有效避免在软件模块之间出现错误的交叉作用,同时也有利于软件诊断。
具有功耗低的特点,尤其适用于便携式的无线及移动的计算和通信设备中靠电池供电的嵌入式系统。
嵌入式微处理器品种众多,几乎所有半导体制造商都生产嵌入式处理器,目前全世界嵌入式处理器流行的体系结构有三十多个,产品有上千种,主要包括ARM、MC68K、MIPS、Power PC等。其中ARM微处理器以其卓越的性能和显著优点成为嵌入式微处理器的代名词,是嵌入式领域使用最为广泛的RISC(Reduced Instruetion Set
Computer)处理器。
ARM(Advanced RISC Machines)技术知识产权的拥有者就是ARM公司,该公司主要出售芯片设计技术的授权,本身不生产芯片,到目前为止,基于ARM技术的处理器已经占了整个嵌入式处理器70%以上的份额,ARM处理器已遍及通信系统、无线系统、网络系统、工业控制、消费电子等各类产品市场。
ARM处理器具有体积小、功耗低、性能高、成本低的特点,它支持Thumb(16位)/ARM(32位)双指令集,同时能很好的兼容8位/16位器件。ARM处理器包括有ARM7、ARM9、ARM9E、ARM10、SecurCore等系列。其中ARM7是低功耗的32位处理器,非常适合应用于对价格和功耗敏感的产品。
2.3嵌入式操作系统
嵌入式操作系统是嵌入式系统的软件组成部分,它运行于嵌入式硬件平台上,其功能是对整个系统及其部件、装置等资源进行统一协调、管理和控制。嵌入式操作系统除了提供操作系统内核服务外,通常还包括硬件驱动接口、通信协议、图形用户界面(Graphic User Interface,GUI)和文件系统等[25]。
按对外部时间的响应能力来分类,嵌入式操作系统分为分时操作系统和实时操作系统。分时操作系统是按任务数量把处理器分成若干时间片,CPU按时间片轮流执行这些任务。而在许多应用场合,系统能及时快速地响应外部事件常常是第一要求,系统的计算必须在预定周期内完成,这类嵌入式操作系统称实时操作系统。为了提高系统的实时性,实时操作系统应满足如下条件:
必须是支持多任务的系统;
系统的内核是可剥夺型的;
任务的切换时间和系统中的任务数量无关;
中断延时时间可以预知并且尽可能短。
目前,市场上嵌入式操作系统分为商用型和免费型,商用型包括Plam OS、pSOS、VxWorks、WinCE等,商用内核的性能优越,但价格昂贵。除此之外,在工程应用中被广泛使用的还有基于Linux的实时操作系统(μCLinux、RTLinux和ARMLinux等)、μC/OS-II、eCos等一些开放源码的免费内核[26]。
2.3.1 μC/OS-II操作系统简介
μC/OS-II是由Jean J. Labrosse编写的免费公开源代码、结构小巧、具有可剥夺实
时内核的实时操作系统。其内核提供任务调度与管理、任务间同步与通信、时间管理、内存管理和中断服务等功能,由于其内核是可剥夺型的,在实时性上表现优秀[27]。
μC/OS-II大部分的代码是用ANSI的C语言编写,也包含一小部分汇编代码,具有很强的可移植性。目前μC/OS-II已在40种以上不同架构的微处理器上成功移植,并且在世界范围内得到广泛应用。
μC/OS-II操作系统具有如下特点:
μC/OS-II是可剥夺型的实时内核,即已经准备就绪的较高优先级的任务可以剥夺正在运行的较低优先级任务的CPU使用权。任务调度算法优秀,任务实时性比不可剥夺型内核要好。
μC/OS-II采用的是优先级调度法,每个任务都必须有不同的优先级,操作系统总是运行进入就绪状态中的优先级最高的任务,所以在编写应用程序时,需要合理划分任务,按任务的重要性来分配优先级。
μC/OS-II对共享资源提供了保护机制,针对多任务在执行过程中可能同时向内核申请共享资源(如串行口)的使用权,提供了信号量和互斥两种内核服务,保证共享资源在前一个任务释放后才能被另一个任务使用。
μC/OS-II是可裁剪的,用户可以根据系统的实际需求和存储空间的大小,只使用应用程序需要的系统服务,这样就可大大减少操作系统所占用的空间。
2.3.2 μC/OS-II操作系统移植
由于不同厂家的处理器往往架构不一样,需要对μC/OS-II操作系统进行移植,使其能在不同架构的微处理器或微控制器上运行。大部分μC/OS-II的代码是用C语言编写的,但是在编写与处理器硬件相关的代码时仍需要使用汇编语言。移植的主要工作就是编写与处理器架构相关的代码。
要使μC/OS-II移植后能正常运行,必须满足以下条件[26][27]:
处理器支持中断,并且能产生定时中断
系统采用的编译器能产生可重入函数,并且用C语言就可以打开和关闭中断
处理器有足够的RAM空间作为硬件堆栈
处理器有向堆栈中存储和读取处理器寄存器及堆栈指针的汇编指令
μC /OS-II操作系统的文件结构如图2-1所示,在移植中需要修改的文件有三个,OS_CPU.H、OS_CPU_C.C、OS_CPU_
用户应用程序μC /OS-II与处理器无关的代码
QS_________MUTEX.CμCOS_II.CμCOS_II.HμC /OS-II与处理器相关的代码(移植时需要修改)软 件硬 件CPU定时器μC /OS-II与应用程序相关的代码OS___CPU__CPU_
图2-1 μC /OS-II体系结构
Fig 2-1 μC/OS-II Architecture
移植工作主要包括以下几方面内容:
在OS_CPU.H中定义与处理器类型无关的统一的数据类型
在OS_CPU.H中定义堆栈增长方向和中断操作方式
在OS_CPU.H中定义C语言和汇编语言的接口函数
在OS_CPU_C.C中编写任务堆栈初始化函数
在OS_CPU_中编写必须用汇编语言实现的相关函数
移植完毕后可以在不加载任何应用程序来测试内核自身的工作情况,μC/OS-II会自动建立一个空闲任务进行32位计数器的自增操作。若在测试过程中出现错误,这种方法可以确定故障是由于内核移植不正确所致,方便开发人员修改移植代码。若μC/OS-II能正常运行,则可根据实际对象来添加应用程序。
2.4 本章小结
本章首先阐述了嵌入式系统的概念,分析了嵌入式控制器的种类和特点,然后介绍了嵌入式实时操作系统的机制和特点。在此基础上,介绍了源码公开的嵌入式实时操作系统μC/OS-II,并说明了μC/OS-II的移植条件和移植思路。
第三章 无线组网技术
3.1 无线通信技术概述
无线网络灵活度高、扩展性好,省去了花在布线上的费用和时间,而且也符合家庭网络通信的要求。因此,智能家居系统采用无线组网方式是未来的发展趋势。目前主要的无线组网技术包括红外线、蓝牙、Wi-Fi、UWB和ZigBee、GPRS等[28]。
红外技术(IrDA)通过红外线进行点对点的数字信号交换,它是最早出现的一种无线连接技术,普及程度和技术成熟度远远超过其他无线技术。红外技术价格低廉,连接方便,兼容性强,但由于红外线波长较短,对障碍物衍射能力差,所以只能以小范围、窄角度对准方式连接,并且通信双方之间不能有阻隔物,位置也必须固定,无法灵活地构成网络[29]。
IEEE 802.15.1标准技术又称蓝牙(Bluetooth),工作于2.4GHz的ISM开放频段。它采用跳频扩谱技术,抗干扰能力强;支持点对点、点到多点通信,有一定的组网能力,设备有自动同步、自动连网功能。蓝牙技术是完全开放的,而且实现了芯片化,适于嵌入式应用。但蓝牙的通信距离很近,一般不超过10米(借助功率放大器能达100米),所以目前一般用于便携式的电子产品和设备的无线互联[30][31]。
IEEE802.11系列是企业无线局域网的标准技术,而其中的802.11b是使用最广泛的技术,又名Wi-Fi(Wireless Fidelity),数据传输速率最高可达11Mbit/s,适合传输数据量大的信号。它工作于2.4GHz频段,采用直接序列扩谱技术,抗干扰和防窃听能力比起其他2.4GHz的无线技术要差。对于普通家庭设备而言其实现成本较高,且协议栈容量大,不适合嵌入到设备中[32]。
超宽带(Ultra Wide Band,UWB)是一种宽频率的脉冲通信技术。它采用跳时扩频信号,带宽从1GHz到数GHz,具有传输速率极高(几百Mbit/s)、功耗低、多径分辨率高、抗干扰能力强、与现有其他无线通信系统共享频谱等特点,被认为有望取代蓝牙[28]。但UWB技术的无线传输距离只有10米左右,这也大大限制了其适用领域。
ZigBee/IEEE 802.15.4是一种新兴的低复杂度、低功耗、低数据速率、短距离无线通信技术。其工作频率为868MHz、915MHz和2.4GHz,与现有的其他无线技术相对比,ZigBee是功耗和成本最低的技术之一[33][34]。ZigBee协议栈紧凑简单,实现要求低,扩展功能强,网络节点可多达65 000个,通信距离50-100米,适合家庭内部组网,可嵌入各种设备中,同时还支持地理定位功能[35]。
以上各种技术均用于短距离无线通信,而要实现远距离无线控制并且不增加网络设备成本,最好的方法就是利用现有的移动通信网络,选择GPRS/GSM网络来实现远距离数据传输即为一种很好的方案。
各种无线通信技术的性能参数及特点比较如表3-1所示:
表3-1 无线通信技术比较
Table 3-1 The Comparison of Wireless Communication Technologies
IrDA Bluetooth Wi-Fi UWB ZigBee GPRS/GSM
名称
3.1GHz~ 868/915MHz 900/1800
2.4GHz 2.4GHz
工作频段
820nm
10.6GHz /2.4GHz /1900MHz
4MB 720Kbps 11Mbps 1Gbps 250Kbps 128Kbps
传输速率
5m 10m 10~100m 10m 10~100m
传输距离 整个网络
2 7 32 1 255/65000 1
网络容量
10mW 10mW 1W 1mW 1mW~3mW 1W
功耗
成本 低 高 高 高 低 低
红外遥控 便携式
图像/Web
环境监测 超远距离
应用领域 多媒体
数据传输 电子产品
设备控制 声音/数据
从表中可以看出,每种通信技术优势各不相同,需针对不同领域和应用要求来使用合适的通信技术,也可以同时使用几种技术取长补短,达到更满意的效果。
本系统选择的方案为远距离与短距离无线通信相结合的方式,远程无线通信利用现有的GPRS/GSM网络,通过手机短消息来实现对家用设备及家居环境的远程监控,短距离无线通信利用ZigBee技术组建网络,实现家庭内部设备通信数据的无线传输。
3.2 GSM/GPRS技术
全球移动通信系统即GSM(Global System For Mobile Communication)系统,又称“全球通”,是目前移动通信体制中应用最广泛的一种系统。我国已建成的覆盖全国的GSM数字蜂窝移动通讯网,是公众最普遍的移动通信方式,主要提供短消息、话音等多种业务。
通用无线分组业务即GPRS(General Packet Radio Service),也称作“2.5G”,是实现第二代移动通信GSM向第三代移动通信(3G)的过渡技术。它以GSM网络为基础进行无线分组数据传输,GSM现有基站子系统从一开始就可提供全面的GPRS覆盖。目前市场上大多数GPRS模块同时支持GSM网络各种服务[36]。
3.2.1 AT指令集
20世纪90年代初,为了通过通讯软件(如超级终端)控制调制解调器(Modem)的各项操作,通讯设备厂商Hayes制定了一套协议,命令均以“AT”字符开头,因此被称为“AT指令”。当时,AT指令仅被用于Modem,此后AT指令作为一套比较方便易用的通讯接口,在无线网络时代不断被各大移动电话生产厂商改进完善,成为GSM通信领域实际的标准,并被加入GSM07.05以及之后的GSM07.07标准。
AT指令是以AT开头,以回车字符结束的字符串,它从终端设备(TE)或数据终端设备(DTE)向终端适配器(TA)或数据电路终端设备(DCE)发送的,用户可以通过AT指
令进行呼叫、短信、电话本、数据业务、传真等方面的控制,其中也包含了对短消息服务的控制说明。利用GSM/GPRS模块(Modem)的串行接口,向其发送一系列的AT命令,就能实现控制模块收发短消息。
AT指令的响应数据包由Modem的串口回发给控制方,每个指令执行成功与否Modem都有相应的返回信息,对于非输入控制指令的模块自身状态信息(如检测到外部拨号、收到新短消息、网络无信号等),模块也有对应的提示信息从串口输出,接收端可依此做相应的处理。
AT指令作为一个通讯接口标准,有一定的命令格式,每条指令都以“AT”或“at”开头,回车符
1. 读取命令:用来查询该命令设置的参数表和数值范围,
格式为:AT[+/&]
2. 写入指令:对终端设备进行操作,设置指令可定义的参数值,
格式为:AT[+/&]
3. 执行指令:对终端设备进行操作,设置其的工作模式,
格式为:AT[+/&]
4. 帮助命令:用来列出该命令的可供设置参数,
格式为:AT[+/&]
AT指令发出后,终端设备会返回相应信息给发送端,不同指令返回不同的数据信息,对于大多数操作,返回为OK或ERROR,其格式为:
3.2.2短消息服务
短消息业务(Short Messaging Service,SMS)是GSM/GPRS、CDMA等数字移动通信系统中乃至3G系统提供的一种移动终端之间通过SMS中心进行远程无线文字信息收发服务。其特点如下:
短消息不是从发送方直接到达接收方的,它必须通过SMS中心存储和转发。
可以和 GSM 语音同步进行,即在通话的情况下仍可接收短消息。如果接收方处于未连接或关机状态,则短消息会暂存在SMS中心,一旦接收方开机或再次连入GSM网络时就会立刻发送短消息。
充分利用了GSM/GPRS网络覆盖广的特点,具有良好的移动性。全网覆盖的优势使开通了短消息服务的无线终端终端手机在网内任何位置都可以获得服务。
支持多种编码方式,单条短消息的数据量最大为160个字符。
常用的与SMS收发控制相关的AT指令如表3-2所示,各指令的具体参数设置和返回值可查阅相关AT指令手册[37]。
表3-2 短消息相关AT指令
Table 3-2 Related AT Command of SMS
AT 指令 功 能
AT+CMGD
删除SIM卡内存的短消息
AT+CMGF
选择短消息信息格式
AT+CMGR
读短消息
AT+CMGS
发短消息
AT+CNMI
显示新收到的短消息
AT+CSCA
短消息中心地址
AT+CSCB
选择蜂窝广播消息
AT+CSCS
设置短消息编码方式
AT+CSMP
设置短消息文本模式参数
AT+CSMS
选择短消息服务
3.2.3短消息收发模式
短消息收发模式有三种:
(1) Block Mode
最初AT指令仅被用于Modem的操作,当时没有统一的短消息文本标准,因此出现了一种SMS Block Mode协议,通过移动终端来控制SMS收发。Block Mode模式需要Modem生产厂家提供驱动支持,目前已很少使用了。
(2) PDUMode
PDU(Protocol Data Unit)模式下,短信息经过十六进制编码后被传送。PDU作为一种数据单元,除了短消息正文字符外,还包括其他全部相关信息,如源地址、目的地址、有效时间、数据格式、协议类型,它们都是十六进制数据。
PDU模式发送短消息支持各种字符集,不同厂家生产的终端(TE)模块支持的字符集也不相同,目前常见的字符集有三种编码方式:
7-bit编码,用于发送ASCII字符,如英文字母、数字、特殊符号,单条短消息可发送最大字符为160个;
8-bit编码,通常用于发送数据消息,如图片和铃声等,单条短消息可发送最大字符为140个;
16-bit编码,即UCS2(Unicode Character Set 2)编码,用于发送Unicode字符。中文字符就属于Unicode字符,单条短消息可发送最大字符为70个。
(3) Text Mode
Text Mode是纯文本方式,此模式不能用于发送数据消息,实现比较简便。向模块发送AT+CMGS=“手机号码”指令后,等待模块返回提示符”>”,然后输入要发送消息的字符集,并以回车符结束,即可直接发送出短消息。
3.3 ZigBee技术
3.3.1 ZigBee技术特点
ZigBee命名来源于蜜蜂通过跳Z字形舞来告知同伴,传递花粉的方向、距离、位置等信息。这种技术以前又称作HomeRFLite、RF-EasyLink或FireFly无线电技术,主要用于近距离无线通信,目前统一称为ZigBee技术或紫峰技术。
ZigBee从诞生到现在只有几年时间,最初在2002年由英国Invensys、美国摩托罗拉、荷兰飞利浦、日本三菱电气等几家公司联合成立了ZigBee联盟,合力推动ZigBee技术。2004年12月,ZigBee1.0版标准(即ZigBee2004)正式发布;到了2006年,ZigBee联盟已经由最初十多家公司发展到全世界150多家知名厂商加盟的商业团体,其标准版本也升级到ZigBee1.1(即ZigBee2006);2007年10月,ZigBee联盟又推出的ZigBee Pro(即ZigBee2007),这也是目前ZigBee技术的最新标准[38]。
ZigBee技术具有以下特性:
低速率,短时延。最大传输速率为250kbps,搜索设备时延30ms,信道接入延时15ms,休眠激活时延15ms,适用于对延时要求苛刻的无线控制应用。
低功耗。节点在非工作模式时可休眠,模式切换延时短,且技术协议中对电池使用作了优化。一般采用电池供电方式可工作半年至数年。
低成本。由于协议栈相对于蓝牙、Wi-Fi要精简得多,对通信控制器的要求低,大大降低了器件的成本。并且协议栈为免专利费用,进一步降低软件成本。
大容量网络。一个ZigBee网络支持255个设备,通过网络协调器最多可支持65000多个ZigBee网络节点,非常适合大面积传感器网络的布建需求。
近距离通信。由于低功耗特点,设备发射功率小,两个节点间的通信距离为10~100米,加大发射功率后,可达1~3千米。通过相邻节点的连续通信传输,能建立设备的多跳通信链路,使实际通信距离大幅增加。
自组织自配置。协议中加入了关联和分离功能,协调器能自动建立网络,节点设备可随时加入和退出,是一种自组织、自配置的组网模式。
3.3.2 ZigBee协议架构
ZigBee协议是基于IEEE802.15.4无线标准研制开发的,属于IEEE无线个人区域(Personal Area Network,PAN)的一项标准,但此标准仅仅定义了实体层和介质访问层,不足以保证不同设备间可以进行对话,于是全球各大企业便成立了ZigBee联盟以制定发布技术标准,确定不同制造商之间共享的应用纲要。
ZigBee协议以开放式系统互连参考模型(OSI/RM)为基础,对那些涉及到ZigBee的层进行定义。IEEE802.15.4标准定义了最下面两层:物理层(Physical
Layer,PHY)、媒体访问控制层(Medium Access Control Sub-Layer,MAC);ZigBee联盟提供了网络层(Network Layer,NWK)框架、应用层(Application Layer,APL)框架以及安全服务提供 (Security Service Provider,SSP) 框架的设计。其中应用层框架又包括应用支持子层(Application Support Sub-Layer,APS)、应用框架(Application
Framework,AF)和ZigBee设备对象(ZigBee Device Object,ZDO)。各层之间通过服务接入点(SAP)来传递信息。图3-1为ZigBee协议的结构体系[39]。
应用层(APL)应用框架(AF)应用对象240Endpoint 240APSDE-SAPZDO公共接口„„应用对象1Endpoint 1APSDE-SAPZigBee设备对象(ZDO)Endpoint 0APSDE-SAPAPSME-SAPMLDE-SAP应用支持子层(APS)安全服务提供(SSP)APS安全管理NLDE-SAPAPS信息管理响应信息管理NLME-SAP网络层(NWK)安全管理MLDE-SAP信息管理路由管理网络管理MLME-SAP媒体访问控制层(MAC)PD-SAPPLME-SAP2.4GHz物理层(PHY)868/915MHzZDO管理平台
图3-1 ZigBee协议结构体系
Fig 3-1 ZigBee Protocol Architecture
PHY层提供物理射频的基本通信能力;MAC层提供的服务保证了设备间单跳链路的可靠通信;NWK层提供了构建不同网络的拓扑所需要的路由和多跳功能;APL层包括APS子层、ZDO和各种应用,ZDO负责整个设备的管理,APS子层为ZDO和ZigBee应用提供服务[40]。
在通信的发送方,用户需要传递的数据 包按照从高层到低层的顺序依次通过各个协议层,每一层的实体按照最初预定消息格式向数据信息中加入自己的信息,比如每一层的头信息和校验等终抵达最低的物理层,变成数据位流,在物理连接间传递。在通信的接收方数据包依次向上通过协议栈,每一层的实体能够根据预定的格式准确的提取需要在本层处理的数据信息, 最终用户应用程序得到最终的数据信息进行处理。
ZigBee协议每层都为其上层提供了两种特定的服务:(1)数据实体提供的数据传输服务;(2)管理实体提供的全部其他服务。每一个服务实体通过服务接入点(SAP)为其上层提供服务接口,而每个SAP都提供了一系列基本的服务指令来完成相应功能。这
种指令就称作原语,一种服务可能包括有一个或多个原语,每个原语又可以包含多个参数,参数表示了提供服务的信息,通过描述服务原语和其特征参数就可以指定某种服务。原语的和服务层次的关系如图3-2所示,它描述了两个通信的用户N1、N2和它们的相连的服务提供者N子层对等协议实体之间的关系[41]。
服务用户(N1-User)请求确认服务提供者(N-Layer)服务用户(N2-User)指示响应
图3-2 服务原语
Fig 3-2 Service Primitive
OSI/RM规定了四种类型的服务原语:
请求(Request):请求启动一项服务,此原语由用户服务层指向服务提供层。
指示(Indication):告知相关的服务提供层事件信息,此原语由服务提供层指向服务用户层。
响应(Response):完成之前的指示原语调用的过程,此原语由服务用户层指向服务提供层。
确认(Confirm):传递之前的相关服务请求的结果,此原语由服务提供层指向服务用户层。
针对不同层,ZigBee协议定义了相应的服务原语,例如对于物理层提供了两种服务:数据服务(PD-SAP)和管理服务(PLME-SAP),而对于物理层的数据服务PD-SAP又定义了三种原语:t、m、tion。协议各层的服务原语见附表1,各原语的具体参数参看文献[39]。
3.3.3 ZigBee各层规范
(1) 物理层(PHY)
根据标准的定义,物理层实现了如下功能:激活和关闭无线射频收发器、信道的能量检测、信道频率选择、空闲信道评估、数据的发送和接收、对收到的包进行链路质量指示等。
IEEE 802.15.4在进行物理层设计时,采用的工作频率868MHz、915MHz、2.4GHz均是免费开放的,可使用的信道分别有1、10、16个,其传输范围介于10至100米之间。信道的频率如表3-3所示:
表3-3 ZigBee信道频率分配
Table 3-3 The Frequency Partition of ZigBee Channel
信道编号
k0
中心频率
(MHz)
868.3
信道带宽 频率下限 频率上限
(MHz) (MHz) (MHz)
0.6
2
5
868.0
902.0
2400.0
868.6
928.0
2483.5
k1,2,...,10
9062(k1)
k11,12,...,26
24055(k11)
各个频段都基于DSSS直接序列扩频技术,即用具有高码率的扩频码序列扩展信号的频谱,大大提高了通信抗干扰能力。
868MHz是欧洲的ISM频段,915MHz是美国和澳大利亚等国的ISM频段,分别提供20kbps、40kbps的传输速率,引入这两个频段的可以避免在2.4GHz附近其他无线通信设备的相互干扰。
2.4GHz波段是全球统一的免费ISM频段,可大大降低ZigBee设备的推广和生产成本,其物理层通过采用高阶调制技术可提供250kbps的传输速率,能够获得更高的吞吐量、更短的工作周期和更小的通信时延,因此也更加省电。
三种频段除了在工作频率、传输速率、调制技术、扩频码片长度方面存在差别之外,使用的均为相同的物理层协议数据单元(PPDU)。物理层协议数据单元由三部分组成:同步头(SHR)允许接收设备同步并锁定比特流;物理层帧头(PHR)的内容是帧长信息;有效载荷部分即物理层要发送的数据包。物理帧格式如表3-4所示[42]:
表3-4 物理帧结构
Table 3-4 The Structure of PHY Frame
4字节 1字节 1字节 可变长度
引导序列 帧开始符 帧长(7位) 预留(1位) 物理层服务数据单元(PSDU)
同步头(SHR) 物理层帧头(PHR) 物理层有效载荷
(2) 媒体访问控制层(MAC)
MAC层主要的负责以下几项任务:一方面协调器产生并发送网络信标帧,另一方面普通设备根据协调器的信标帧与协调器同步;使用CSMA-CA机制共享物理信道;支持无线信道通信安全;支持PAN网络的关联和解关联操作;支持处理和维护保证时隙(Guaranteed Time Slot,GTS)机制;能在两个对等的MAC实体之间提供可靠的数据链路。
IEEE 802.15.4的MAC层定义了四种基本的帧类型:
1)信标帧:此类帧供协商者使用;
2)数据帧:此类帧承载所有的数据;
3)确认帧:此类帧用于确认数据已顺利传送;
4)MAC命令帧:此类帧用于处理MAC层对等实体间的控制传送。
MAC帧,即MAC协议数据单元(MPDU),通常包括三部分:MAC头、MAC有效载荷和MAC尾。MAC头分三部分:帧控制字段、帧序号字段和地址信息域;MAC有效载荷部分的长度可变,其内容由帧的类型决定;MAC尾是帧头和负载数据的16位CRC帧校验序列(FCS)。MAC帧的一般格式如表3-5所示[42]:
表3-5 MAC帧结构
Table 3-5 The Structure of MAC Frame
2字节 1字节 可变长度 可变长度 2字节
帧控制域 帧序号 地址域 帧有效载荷 帧效验(FCS)
MAC头(MHR) MAC有效载荷 MAC尾(MFR)
在MAC子层中设备地址信息有两种类型:64位物理地址和16位网络地址。64位物理地址是全球惟一的,通常也叫作MAC地址或者扩展地址(Extended address),由IEEE提供,设备在出厂前就由制造商分配设定了;16位网络地址也叫做短地址或者逻辑地址(Logical address),是设备与PAN网络协调器关联时,由协调器分配的网内局部地址,只能保证在此PAN网络内部的惟一性,所以在使用16位短地址通信时,还必须结合16位PAN网络标识符才有效。
由于物理地址和网络地址所包含的信息长度不同,从而导致MAC帧头长度也是可变的,用帧控制域的内容来指示帧使用的地址类型。从表3-5中可以看到在MAC帧结构中没有表示帧长度的字段,这是由于物理层的帧已经含有表示物理帧长度的字段,而物理帧有效载荷就是MAC层帧的全部内容。因此MAC有效载荷长度可以通过物理层帧长和MAC帧头的长度计算得出。
(3) 网络层(NWK)
ZigBee网络层的主要功能是设备的发现和配置、网络的建立与维护、路由的选择以及广播通信,并具有自我组网与自我修复功能。
网络层(NWK)帧即网络协议数据单元(NPDU),由2个基本部分组成:NWK头和NWK有效载荷。NWK头部分包含帧控制、地址和序号信息;NWK有效载荷部分包含的信息因帧类型的不同而不同,长度可变。其一般格式如表3-6所示[43]:
表3-6 NWK帧结构
Table 3-6 the structure of NWK frame
2字节 2字节 2字节 1字节 1字节 可变长度
目的地址 源地址 半径域 序号
帧控制域 帧有效载荷
路由域
NWK头 NWK有效载荷
网络层定义了两种类型的设备:全功能设备(Full function device,FFD) 和简化功能设备(Reduced function device,RFD)。FFD作为网络的协调器,支持各种拓扑结构的网络的建立,也可以和任何设备进行通信;而RFD只能和FFD进行通信,功能和结构比较简单,可以有效地降低成本和功耗[44]。
网络层支持的网络拓扑结构有三种:星型结构(star)、树型结构(Cluster tree)和网状结构(Mesh)。三种网络拓扑结构如图3-3所示:
协调器FFDRFD星型网络树形网络网状网络
图3-3 ZigBee网络拓扑结构
Fig 3-3 The Network Topology of ZigBee
星型网络为主从结构,由单个网络协调器和多个终端设备组成,网络的协调者必须是FFD,由它负责管理和维护网络;
树形网络可以看成是扩展的单个星型网或者相当于互联的多个星型网络;
网状网络中的每一个FFD同时还可以作为路由器,根据网络路由协议来优化最短和最可靠的路径。
一个ZigBee网络的形成,必须先由一个全功能设备FFD作为网络协调器,用于扫描搜索一个未用的最佳信道来建立网络,然后其它的FFD或是RFD才能加入这个网络。
(4) 应用层(APL)
应用层包括应用支持子层(APS)、应用框架(AF)、ZigBee设备对象(ZDO)。除了提供一些必要的函数以及服务接口外,应用层的另一个重要功能就是可以根据具体应用的需要在此层基础上开发用户自己的应用对象。
应用支持子层提供了网络层和应用层之间的接口,通过数据服务和管理服务把两者连接起来。APS的作用是维护设备绑定表,在绑定的设备间传输信息,同时能发现在工作范围内操作的其它设备。
每个APS帧(APDU)包括两个基本部分:APS帧头和APS有效载荷。帧头由帧控制信息和地址信息组成;有效载荷是与帧相关的有效信息,长度可变,APS帧结构一般格式如表3-7所示[43]:
表3-7 APS帧结构
Table 3-7 The Structure of APS Frame
1字节 0/1字节 0/1字节 0/2字节 0/1字节 可变长度
目的端点 簇标识 配置文件标识 源端点
帧控制域 帧有效载荷
地址域
APS帧头 APS有效载荷
ZDO的作用是是定义网络内其它设备的角色、发起或回应绑定请求、在网络设备间建立安全机制等。ZigBee定义了3种类型的ZOD设备:
网络协调者(Coordination),全功能设备,扫描搜索,以未使用的信道建立新网络,分配网络位置;
路由器(Router),全功能设备,允许其他设备连接,负责转送信息包,同时
负责找寻、建立和修复信息包的路由路径;
终端设备(End Device),精简功能设备,不具备路由功能,只能选择加入已经形成的网络,可以收发信息,但不能转发信息。
应用框架是应用对象和ZigBee设备连接的环境,应用对象处于应用层的顶部,由设备制造商所决定,每个应用对象通过相应的端点寻址,最多可定义从1到240个不同的端点号,端点241-254保留以作将来的应用,端点0是当前对象的数据接口,端点255是向整个网络所有应用对象的广播数据接口[45]。
(5) 安全服务规范
ZigBee提供的安全服务包括帧保护、设备管理、密钥建立、密钥运输的方法。这些服务是对802.15.4安全规范的补充和增强,它们共同构成了ZigBee设备的安全体系。安全服务涉及到协议栈中的三层:MAC、NWK和APS层,分别负责各自帧的安全传输,此外APS子层还提供安全关系建立和维护的服务,ZDO管理一个设备的安全规定和安全配置。
通过以上ZigBee协议各层规范分析,可知其结构是由下往上逐层包含的,数据信息经过层层打包、依次传递,最终由物理层实现无线收发。物理层有效载荷部分的最大长度是127字节,如果数据包的长度大于8字节,那么物理层服务数据单元(PSDU)将包含MAC层的帧内容,物理层有效载荷即为MAC帧。同样,MAC有效载荷即为NWK帧,NWK有效载荷即为APS帧。为方便协议栈移植和应用层开发,根据协议规范对ZigBee各层帧的格式进行归纳整理,如附表2所示,此表格清楚地表明了ZigBee无线数据包整体帧结构。
3.3.4 ZigBee开发平台
ZigBee虽然提供了标准化的网络和应用框架,但标准化框架并不能直接应用于实际产品开发。ZigBee产品的核心是多信道无线通信装置和微控制器,外围接上阻容和晶振等原件,再连接一些A/D、D/A、I/O接口及控制电路,即组成了诸如各种智能控制节点,无线传感器网络节点的核心控制模块。除硬件电路之外,还需要加载合适的无线通信软件(协议栈)和控制程序,才能组成完整的控制模块。
为了兼容ZigBee的各种应用,各大芯片厂商提供了各种硬件及软件解决方案,开发了相关产品,包括微控制芯片、RF收发器、仿真器、协议分析仪、专用协议栈和应用开发工具等。因此开发人员可以在一整套硬件、软件平台上直接建立自己的应用。
目前市场上ZigBee主要的芯片提供商(2.4GHz)主要有:TI/Chipcon、Ember(ST)、Jennic(捷力)、Freescale及Microchip。硬件平台提供方式有三种:
(1)RF+微控制芯片。如TI的CC2420+MSP430、Freescale的MC13XX+GT60、Ember的EM2420RF+AVR、Microchip的MJ2440+PIC。
(2)单芯片集成片上系统SoC。如TI的CC2430/CC2431、Freescale的MC13213
及Ember 的EM250。
(3)单芯片内置ZigBee协议栈+外挂芯片,如Jennic的SoC+EEPROM、Ember的EM260+MCU。
此外,各大厂商对自己开发ZigBee芯片都提供了相应的协议栈,包括 TI公司的Figure 8Wireless ZigBee Protocol Stack协议栈Z-Stack,Freescale公司 的SMAC、IEEE802.15.4MAC和BeeStack,Ember的ZNET、microchip的MPZBEE,Jennic的JenNet堆栈等。
基于可靠性和兼容性角度考虑,底层协议使用提供从物理层、网络层、传输层直到ZigBee类的一套完整协议栈,这样可以在开发时集中精力于应用开发上,而不必过多关注网络内部工作机理;用户应用程序部分采用各厂商提供的API函数,可实现应用程序初始化、各种系统事件处理和用户事件处理等各种功能,从而可以减小开发周期和调试复杂度。
本系统选用的是TI的CC2430单芯片集成系统方案,配合Z-Stack协议栈来实现家庭内部组网。
3.4 本章小结
本章分析各种无线组网技术的特点和优势,指出家庭内部网络的发展方向是无线技术,重点介绍了基于GPRS/GSM网络的短消息服务和ZigBee无线技术的特点,协议规范、数据格式、网络结构及开发平台相关内容。
第四章 系统硬件设计
4.1 家居控制系统设计方案
4.1.1系统实现目标及功能
本课题实现的目标是将远程无线监控和现场无线控制相结合,设计一个基于嵌入式的家居无线控制系统,在现场,能通过人机接口实现对系统的控制及自动报警;在远端,能通过手机短消息对终端节点进行控制和信息反馈。
根据以上要求,要结合ARM、嵌入式操作系统、GPRS网络、ZigBee无线技术等,提出一种较为完善的智能家庭控制系统方案,完成系统的硬件、软件设计工作,并验证所设计系统的有效性和实用性。
本课题设计智能家居系统的具体功能如下:
ARM控制器连接GPRS模块,能让用户通过通过手机短信息进行终端设备远程控制、家庭环境模式选择和监控,同时能在异常情况下将报警信息发送到预先设置的手机号码;
ARM控制器连接ZigBee无线模块,采用ZigBee协议栈构建家庭内部短距离无线网络,实现与ARM控制器的通信以及家庭各设备之间的数据交换和智能控制。
现场提供人机接口,用户通过键盘输入、液晶屏GUI界面显示,可设置和修改系统参数,包括环境参数,安防报警,手机号码等,同时可对家庭环境和设备的工作状态进行现场级监控。
4.1.2系统总体结构
智能家居系统总体结构分为硬件和软件两部分,硬件部分主要包括各种功能的实现模块,软件部分主要包括嵌入式操作系统、设备驱动程序、ZigBee协议栈和应用程序。
为了使智能家居系统具有很好的兼容性和可扩展性,整个系统的硬件结构应是结构化和模块化的,既可使不同厂商的设备综合在一个系统中,又可使系统在今后能方便的扩展升级,接入其他的设备。
整个智能家居系统从硬件结构上可以分为五个部分:
(1) 嵌入式控制器模块:整个系统的控制核心采用ARM32位RISC处理器加外围电路构建嵌入式平台,完成整个系统的调度及控制;
(2) 输入输出模块:通过键盘及液晶显示屏,实现家庭内部的输入控制和输出显示,同时可以实时显示家居环境状态和接收短消息的相关情况。同时通
过RS232串行通信接口与GPRS模块及ZigBee模块连接,进行数据处理和传输;
(3) GPRS模块:通过SMS协议可实现短信息收发,实现整个系统的远程无线监控;
(4) ZigBee模块:构建家庭内部短距离无线通信网络,主节点与ARM控制器连接,从节点与终端设备连接,实现各个设备终端的数据收发和状态监控;
(5) 终端监控模块:在各个ZigBee节点的I/O口扩展控制电路,实现各种功能,包括了灯光控制、开关控制、温度检测和安防检测等。
整个系统的结构如图4-1所示。
显示屏手机移动通信网络GPRS模块ARM控制器键盘ZigBee模块家庭内部无线网络ZigBee节点灯光控制家电开关ZigBee节点温度传感器ZigBee节点安防报警
图4-1 智能家居控制系统结构
Fig 4-1 The Structure of Smart Home Control System
4.2 嵌入式控制器模块
考虑到系统的模块较多,主控制器部分选择集成了电源接口,时钟电路、复位电路、存储器电路等外围器件组成的嵌入式平台MAGICARM2200构建嵌入式主控制器,此开发板上带有丰富的存储资源,同时具有CF卡接口、LAN接口、Modem接口,PS/2接口以及USB接口,方便以后扩展升级和二次开发。
核心板上主芯片选择飞利浦公司的LPC2210处理器,配置2M字节的NOR
FLASH(BootLoader)、8M字节的RAM、16M字节的NAND FLASH 和256字节的E2PROM的存储单元[46]。
LPC2210是基于一个支持实时仿真和嵌入式16/32位ARM7TDMI-STM CPU的微处理器,其主要特性如下:
16/32位144脚ARM7TDMI-S微控制器
16K字节片内静态RAM,无片内FLASH,通过外部存储器接口可将存储器配置成4组每组的容量高达16Mb数据宽度为8/16/32位
2个32位定时器(带4路捕获和4路比较通道)、6路输出PWM单元、8路10位A/D转换器、实时时钟和看门狗
多个串行通信接口:包括2个同步串行接口(SPI)、2个16C550工业标准异步串行接口(UART)和高速I2C接口(400 kbit/s)
串行boot装载程序通过UART0来实现系统下载和编程
Embedded ICE-RT接口使能断点和观察点,嵌入式跟踪宏单元(ETM)支持对执行代码进行无干扰的高速实时跟踪。
多达76个通用I/O口(可承受5V电压),9个边沿或电平触发的独立外部中断引脚,向量中断控制器可配置优先级和向量地址
2个低功耗模式:空闲和掉电,通过外部中断将处理器从掉电模式中唤醒
片内晶振频率范围1~30 MHz,通过锁相环(PLL)可实现CPU最大的操作频率为60MHz
由于LPC2210的144脚封装体积小、功耗低,通过配置总线最多可提供76个GPIO和 9个外部中断,所以特别适用于工业、医疗、交通等各种监测控制领域;同时由于内置了宽范围的串行通信接口,因此也非常适合于嵌入式软MODEM、协议转换器、数据通信网关以及其它各类型的应用。
4.3 输入输出模块
系统要实现数据的无线传输,同时能进行现场级的监控,必须具备各模块之间的通信接口和人机接口,考虑到串行通信接口的通用性,采用ARM处理器的UART0串口与ZigBee模块之间数据通信,UART1串口与GPRS模块通信,人机接口采用键盘和液晶屏来实现现场的输入输出控制操作。
按键输入模块采用4×4键盘的驱动芯片ZLG7290,通过I2C总线接口与处理器连接。ZLG7290是一款功能强大的键盘驱动芯片,I2C接口传输速率可达32kbit/s,最多支持64个按键,可检测每个按键的连击次数,提供数据译码和循环移位段寻址等控制。
本系统的16个按键分别与ZLG7290芯片的SEGA、SEGB引脚连接,这样得到的键盘扫描值是连续的,即S1到S16按键的扫描值分别对应从1(0x01)到16(0x10),方便应用程序的设计。ZLG7290的键盘中断输出端与LPC2210的中断引脚P0.30/EINT3连接,当有按键按下时,ZLG7290将会输出中断信号通知处理器。
MAGICARM2200开发板配置有5.2英寸的LFUBK9111彩色点阵图形液晶屏,色彩为256色,点像素为320×240,内嵌驱动器及电源电路。由于此液晶模块本身没有集成液晶控制器,LPC2210也没有液晶控制功能模块,因此需要外接一个彩色液晶控制器S1D13503来驱动该液晶屏[47]。
LPC2210带有两个串行通信接口,UART0是3线的TTL电平接口,UART1提供一个完整的调制/解调器(Modem)接口。对于嵌入式系统,TTL电平逻辑0为小于0.4V,逻辑1为3V~5V,而RS-232串口标准电平采用负逻辑,逻辑0为+5 V~+15
V,逻辑1为-5V~-15V,因此要实现两者之间的通信,必须进行电平转换。开发板使用了SP3232和SP3243芯片进行串口电平转换,实现UART0与ZigBee模块通信,UART1与GPRS模块通信。
4.4 GPRS通信模块
本系统采用的GPRS通信模块是BENQ公司的M23模块。其主要特性如下[48]:
支持三个工作频段GSM900/DCS1800/PCS1900
支持GSM语音、短消息、传真及GPRS数据传输,内嵌TCP/IP协议
支持标准AT指令(3GPP27.07/27.05),
工作模式有通话、空闲、省电、数据模式等
工作电压:3.3V~4.2V,SIM卡工作电压3V
提供天线接口、SIM卡接口、模拟音频接口、异步串行接口
串口波特率自适应,支持1200bps~115200bps全部标称波特率。
M23模块的内部结构如图4-2所示,主要由基带处理器、闪存、供电模块、射频模块、音频模块、天线接口、SIM卡接口、串行通信接口等组成。基带处理器(BASEBAND PROCESSOR)是M23的核心,主要用于处理GSM/GPRS终端收发的数据和语音信号,并涵盖了蜂窝射频设备中的全部模拟及数字功能。
射频接口闪存AUDIOSIMLEDVBAT基带处理器天线UARTUART2BUGPIO电源
图4-2 M23模块内部结构
Fig4-2 Internal Structure of M23 Module
4.4.1引脚接口电路
M23模块的引脚数量为44个,引脚接口包括了M23与外部连接的所有信号,包
括电源部分、音频部分、数据通信部分、状态指示部分。本系统中不涉及到音频通话,实现的主要功能就是数据通信,即远程用户手机与GPRS模块上SIM卡的通信以及GPRS模块与ARM处理器之间RS232串口通信。模块的接口电路如图4-3所示:
图4-3 M23接口电路
Fig 4-3 Circuit of M23 Interface
M23模块采用3.3V电压供电,电源正极输入端为VBATT,分别连接模块的引脚1电源电压输入端(VBATBB)和引脚41、42、43射频功率放大器电压输入端(VBATRF),引脚44为电源负极接地,引脚38是启动复位引脚(PWON),引脚11、12、13和23为模块和SIM之间的通信接口,管脚29到34是串口通信接口,包括串口数据收发端RXD、TXD,和握手信号端RTS、CTS、DSR、DTR。
另外,为了实时指示模块的工作状态,在6脚LEDA端接入发光二极管,M23可以自动控制LED的闪烁频率以表征其工作状态,在正常上电后,M23若检测到SIM卡以及网络,LEDA引脚将控制发光二极管以1次/秒的频率闪烁;当有外部数据收发时,LED会以2次/秒的频率亮灭。
4.4.2 SIM卡接口电路
SIM卡是通过卡面上的接口来实现卡内逻辑电路和GPRS模块间的连接的,SIM卡芯片上有八个触点,通常用到其中的六个,其具体接口定义如图4-4所示:
数据I/O口可编程口接地端时钟CLK复位RST电源VCC
图4-4 SIM卡接口定义
Fig 4-4 Definition of SIM Card Interface
M23为SIM卡接口预留了6个引脚,SIM卡与M23模块的接口电路如图4-5所示:
图4-5 SIM卡接口电路
Fig 4-5 Circuit of SIM Card Interface
4.4.3 串行通信接口电路
GPRS模块与LPC2210的串口UART1相连,UART1提供了一个完整的9线制MODEM接口,因此除了GPRS模块的RXD、TXD两个引脚外,RTS、CTS、DSR、DTR、DCD、RI引脚数据信号都经过串口传送,选用8路TTL-RS232电平转换芯片ICL3238,芯片支持3~5.5V电压供电,串行通信接口电路如图4-6所示:
图4-6 GPRS模块串口通信电路
Fig4-6 Serial Communication Circuit of GPRS Module
4.5 ZigBee通信模块
本课题设计的ZigBee模块采用CC2430作为控制芯片,组建家庭内部短距离无线
通信网络,可有效地降低成本和外围电路的复杂度。
CC2430是TI公司开发的全球首款单芯片集成片上系统ZigBee解决方案,其内部集成一个增强型8051MCU内核和一个符合IEEE802.15.4规范的2.4GHz无线收发器。芯片内部具有8kB的RAM,32/64/128kB可编程Flash存储单元,包括AD转换器、定时器、看门狗、睡眠定时器、AES128协处理器等[49]。该芯片具有高度集成性和丰富的硬件资源,使得外围电路的设计变得十分简单。
CC2430主要特性如下:
体积小,采用7mm×7mm 的QLP封装;
接收灵敏度高,抗干扰能力强;
电源电压范围宽(2.0~3.6V);
电流消耗小,休眠模式下电流消耗仅0.9μA,待机模式下电流消耗小于0.6μA,外部中断或实时时钟(RTC)能唤醒系统;
硬件支持载波侦听多点接入/避免冲撞(CSMA/CA)功能;
支持数字化接收信号强度指示器/链路质量指示(RSSI/LQI);
带有1个通用的16位定时器和2个8位定时器,以及1个IEEE802.15.4规范的媒体存取控制(MAC)定时器;
2个支持多种串行通信协议的USART,DMA功能强大;
支持硬件调试,开发工具灵活
CC2430内部结构如图4-7所示:
复位32kHz晶体32.768kHz晶体调试界面看门狗定时器高速RC振荡器32kHzRC振荡器时钟管理内存管理电源管理掉电复位睡眠定时器睡眠模式管理32/64/128 kBFlash8 kB RAM写 FlashVDD(2.0~3.6V)DCOUPLDMA存储器I/O接口8051微控制器8输入8~14位ADCAES-128安全协处理器中断控制无线处理寄存器CSMA/CA处理器无线数据分析界面解调器射频接收AGC频率合成器调制器射频发送串行通信接口1串行通信接口216位定时器1MAC定时器28位定时器38位定时器4FIFO及结构管理控制RF_PRF_N
图4-7 CC2430结构图
Fig.4-7 CC2430 Block Diagram
4.5.1引脚接口电路
CC2430芯片共有48个引脚,按照功能可以分为三类:电源线引脚、I/O口引脚和控制线引脚。电源线引脚为模拟电路、数字电路、I/O口提供2.0~3.6V工作电压,同时片上稳压器为芯片内部其他功能电路提供1.8V电压。I/O口引脚有21个,全部具有响应外部中断的能力,通过软件编程设置,可使这些引脚作为普通的I/O口或者作为连接定时器、ADC、USART等部件的外围设备I/O口使用。控制线引脚包括芯片的晶振引脚,复位引脚和射频信号引脚。
CC2430的应用电路如图4-8所示。
图4-8 CC2430应用电路
Fig 4-8 CC2430 Application Circuit
ZigBee模块的电源部分采用2节1.5号电池经过开关S20给芯片供电,同时在P1.0、P1.2、P1.3、P2.0口连接4个发光二极管以指示模块的工作状态,在P0.1口接入一个按键S21方便扩展应用功能。电源及LED电路如图4-9所示:
图4-9 ZigBee模块电源电路
Fig 4-9 Power Circuit of ZigBee Module
4.5.2串行通信接口电路
ZigBee模块主节点与LPC2210的串口UART0连接实现数据通信,CC2430的P0.2 、P0.3脚可设置为串口通信的RX、TX引脚,其输出为TTL电平。由于ARM开发板UART0口输出的为RS232电平,必须进行TTL-RS232串口电平转换。选用MAX3232芯片设计串口电路,芯片支持3~5.5V电压供电,直接从ZigBee模块的3V电池供电接口取电即可满足芯片工作需要[50]。串行通信接口电路如图4-10所示:
图4-10 ZigBee串行通信接口电路
Fig 4-10 Serial Communication Circuit of ZigBee Module
4.6 终端监控电路
ZigBee从节点作为家庭内部网络的终端节点,一方面负责接收主节点的指令并控制家电设备,另一方面负责检测家居环境温度、安防情况等并向主节点回发数据。根据其实现的不同功能,终端监控电路分为三部分:温度检测电路、家电控制电路和安防检测电路。
4.6.1温度检测电路
系统温度采集元件选用单总线数字温度传感器DS18B20,其引脚有3个: 数据端DQ,电源端VCC,接地端GND,支持3~5V供电[51]。它与处理器的连接方式有两种:一种是寄生电源方式,此方式下VCC和GND引脚均接地,DQ脚与处理器I/O口相连,直接从I/O口取电,同时必须在温度转换期间给DQ线提供一个强上拉高电平;另一种是外部供电方式,VCC和GND分别连到外接电源正负极,这种方式不需要DQ总线强上拉,允许在温度转换期间总线上其他数据传输。系统采用第二种连接方式,I/O口选择P0.6口,电路连接图4-12所示。
图4-11 温度检测电路
Fig 4-11 Temperature Detecting Circuit
4.6.2家电控制电路
本系统中设计了5路输出的开关控制电路,CC2430的I/O输出引脚设置为P1.1、P1.4、P1.5、P1.6、P1.7。控制方式采用继电器的开关触点与电器或插座连接,可用于控制电灯、空调、热水器、窗帘等各种常见的家电设备。由于CC2430的各I/O引脚的电流为4mA,不足以驱动继电器,因此先分别经过Q1~Q5三极管放大后,再连接到继电器的控制端。继电器控制端采用12V电压供电, 并反接一个续流二极管,防止继
电器在开断瞬间产生的反向电动势击穿三极管。
图4-11 终端家电控制电路
Fig.4-11 Terminal Appliance Control Circuit
4.6.3安防检测电路
系统采用RE200B型被动式热释电红外传感器(PIR)作为安防检测装置,它能以非接触形式检测出人体辐射的红外光波,并将其转化为微弱的电信号。RE200B有三个引脚:电源端(D)、信号端(S)、接地端(G)。红外传感器直接检测距离小于1m,在其上方增加一个菲涅尔透镜聚焦,可使其检测距离达到8m左右。
RE200B的输出电压为毫伏级,若直接输入到CC2430的I/O不能识别为电平信号,必须先滤波,放大和比较后再输出。系统采用BIS0001芯片设计放大电路,芯片内部具有2级运算放大器和1个电压比较器,并且可以通过引脚连接器件设置检测封锁时间、延时时间和重复触发模式。
RE200B的S端连接BIS0001的1IN+引脚,作为第一级运放的输入端,检测信号经过内部电路处理后,从芯片VO引脚输出。当没有检测异常时,VO引脚输出低电平,当检测到红外光波时,会输出一个持续时间可调的电平信号。CC2430的P0.7脚与VO引脚连接,安防检测电路如图4-13所示。
图4-13 安防检测电路
Fig 4-13 Security Detection Circuit
4.7 本章小结
本章首先介绍了智能家居控制系统的实现目标和总体结构,提出了系统整体设计方案,基于LPC2210的嵌入式开发平台,扩展了输入输出、GPRS、ZigBee各种功能模块,并对各模块的硬件电路进行了设计。
第五章 系统软件设计
5.1系统软件结构
系统的软件是建立在硬件的基础上的,良好的软件设计是实现系统功能的重要环节,也是提高系统性能的关键所在。软件设计的首要任务按照功能和结构把软件分成独立的模块,分别加以实现,最后通过接口函数把各部分连接起来。
本系统的软件设计主要包括两部分:(1)以LPC2210为核心的嵌入式控制器软件设计;(2)以CC2430为核心的ZigBee节点的协议栈及应用程序的编写。
嵌入式控制器的软件部分可分为三层结构:硬件层、操作系统层、应用程序层。其结构如图5-1所示。
应用程序任务调度信号量消息队列邮箱管理中断服务μC/OS-II操作系统GPRSZigBeeLCD键盘硬件驱动
图5-1 嵌入式控制器软件结构图
Fig 5-1 Software Block Diagram of Embedded Controller
硬件驱动层提供外部设备的函数接口,通过驱动程序来操作硬件;应用程序层根据具体应用定义用户函数;操作系统提供任务调度、时间管理、消息管理、中断管理内核服务,同时也是底层硬件和上层应用程序的中间纽带,通过内核各种服务调用应用程序层的各种函数进行数据处理和传输,处理外部中断,提供用户图形界面接口(GUI),完成人机交互等。
本系统中嵌入式控制器软件部分的工作主要包括操作系统移植、任务划分、外部设备模块驱动开发、人机界面和应用程序编写。
ZigBee网络的实现是建立在ZigBee协议栈的基础上的,通过对协议栈进行修改移植,然后下载到各节点的芯片中。本系统采用TI公司开发的Z-Stack协议栈,其软件框图如图5-2所示。由于协议栈采用分层结构,移植的主要工作包括针对CC2430芯片修改硬件配置文件、建立应用层用户任务、配置网络层相关参数,同时还要编写数据无线收发程序和主从节点应用程序。
高MAC任务NWK任务任务优先级HAL任务APS任务ZDApp任务低用户任务任务组OSAL操作系统硬件驱动CC2430硬件
图5-2 Z-Stack协议栈框图
Fig 5-2
Block Diagram of Z-Stack
5.2 操作系统移植及任务划分
μCOS-II操作系统的移植条件第二章已作介绍,本系统嵌入式处理器采用LPC2210芯片,支持定时器时钟中断,支持硬件堆栈,可以方便地使用C语言开关中断,符合移植条件。
嵌入式系统软件开发环境采用ADS(ARM Developer Suite),其最新版本为1.2。它是ARM公司推出的用于取代SDT的新一代编译、链接、调试集成开发系统,是目前国内ARM开发平台的一款主流编译器。ADS编译效率高,并且能产生可重入函数,能够进行μCOS-II移植。ADS1.2开发环境如图5-3所示:
图5-3 ADS开发环境
Fig 5-3 ADS Development Environment
5.2.1 OS_CPU.H的移植
(1)自定义数据类型
对于不同类型的8/16/32位处理器,编译器对C语言中的short,int,double等数据类型的长度定义并不一致,因此μC/OS-II中重新定义了统一的数据类型,以便在操作系统的移植过程中需要修改的代码量减为最少[52]。定义如下:
typedef unsigned char BOOLEAN; // 布尔型数据
typedef unsigned char INT8U; // 无符号8位整型数据
typedef signed char INT8S; // 有符号8位整型数据
typedef unsigned short INT16U; // 无符号16位整型数据
typedef signed short INT16S; // 有符号16位整型数据
typedef unsigned int INT32U; // 无符号32位整型数据
typedef signed int INT32S; // 有符号32位整型数据
typedef float FP32; // 单精度浮点数(32位)数据
typedef double FP64; // 双精度浮点数(64位)数据
typedef INT32U OS_STK; // 堆栈入口宽度
(2)定义堆栈增长方向和中断操作方式
μC/OS-II使用OS_STK_GROWTH定义处理器堆栈增长方向,0表示从低地址向高地址增加,1表示从高地址向低地址减小。由于ADSv1.2编译器只支持满递减堆栈,因此OS_STK_GROWTH配置为1。
μC/OS-II使用OS_CRITICAL_METHOD定义处理器开关中断的方式,其值可设置为三个。1表示直接开关中断,不保存处理器的中断状态;2表示关中断操作前将处理器的中断状态保存到堆栈,开中断操作后再从堆栈中恢复原来的中断状态;3表示中断状态保存在局部变量中。在实际移植中OS_CRITICAL_METHOD配置为2
(3)定义汇编语言接口函数
μC/OS-II中有四个软件中断程序,均为汇编语言编写。为了能使用C语言调用中断函数,ADS编译器采用软中断指令SWI定义接口函数。当一个函数被调用时,处理器会根据软件中断号自动跳转到对应的中断服务程序的入口地址。接口函数定义如下:
__swi(0x00) void OS_TASK_SW(void); // 任务级任务切换函数,中断号为0
__swi(0x01) void _OSStartHighRdy(void); // 运行最高优先级任务,中断号为1
__swi(0x02) void OS_ENTER_CRITICAL(void); // 禁止中断,中断号为2
__swi(0x03) void OS_EXIT_CRITICAL(void); // 允许中断,中断号为3
5.2.2 OS_CPU_C.C的移植
(1)任务堆栈初始化函数
μC/OS-II中任务堆栈初始化函数定义为OSTaskStkInit( ),作用是初始化任务堆栈,当该任务由于某种原因被挂起时,程序状态寄存器CPSR和当前任务相关的寄存
器信息都保存到堆栈中。针对LPC2210处理器,包括通用寄存器R0~R12,链接寄存器(LR)、程序计数器(PC)。函数定义如下:
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;
opt = opt; // 避免编译器警告
stk = ptos; // 获取堆栈指针,采用满递减堆栈
* stk = (OS_STK) task; // PC
*--stk = (OS_STK) task; // LR
*--stk = 0; // R12
*--stk = 0; // R11
*--stk = 0; // R10
*--stk = 0; // R9
*--stk = 0; // R8
*--stk = 0; // R7
*--stk = 0; // R6
*--stk = 0; // R5
*--stk = 0; // R4
*--stk = 0; // R3
*--stk = 0; // R2
*--stk = 0; // R1
*--stk = (unsigned int) pdata; // 第一个参数使用R0传递
*--stk = (USER_USING_MODE|0x00); // spsr,允许中断IRQ、FIQ
*--stk = 0; // 关中断计数器OsEnterSum
return (stk);
}
(2)Hook函数
μC/OS-II为了扩展一些系统服务的功能以满足用户的特殊需求而预留了9个Hook函数以方便用户添加自己的代码到系统服务中去,一般这9个函数定义为空函数即可。
5.2.3 OS_CPU_A.S的移植
在μC/OS-II中原始文件为OS_CPU_,由于ADS编译器规定的汇编语言文件后缀名为S,因此其改名为OS_CPU_A.S,移植过程需要编写如下汇编语言函数:最高优先级就绪任务函数OSStartHighRdy( )、任务级任务切换函数OSCtxSw( )、中断级任务切换函数和OSIntxSw( )和时钟节拍中断服务函数OSTickISR( )。
OSStartHighRdy( )由OSStart( )函数调用,以实现系统进入多任务环境使就绪任务中优先级最高的任务得以运行,其对应的汇编语言函数形式为__OSStartHighRdy( )。由于在初始化任务堆栈结构时,已将相关寄存器的初始化数据压入堆栈,所以OSStartHighRdy( )函数只需要得到任务的堆栈指针并将保存的数据从堆栈中恢复即可。
OSCtxSw( )与OSIntxSw( )函数均用来实现任务的切换,不同的是,OSCtxSw( )函数必须先将处理器寄存器值存入堆栈,然后才能挂起任务;OSIntxSw( )函数由于是中断级任务切换,是在ISR中被调用的,因此处理器寄存器值都已经被保存到了被中断
任务的堆栈中了,不需要再次保存。两者大部分汇编代码相同,OSIntxSw( )可通过跳转到OSCtxSw( )中相同代码处来实现[24]。
5.3人机接口软件设计
要完成现场级的控制,提供人机交互功能,必须编写人机接口软件,分键盘输入和液晶屏输出两部分来实现。
5.3.1 键盘驱动设计
本系统中的4×4键盘采用与ZLG7290键盘驱动芯片连接的方式来实现按键键值译码。ZLG7290采用I2C总线与处理器连接,通过串行时钟线(SCL)和串行数据线(SDA)即可实现对芯片的控制[24] [53]。
根据I2C总线协议,主从机通信过程由起始条件、结束条件、发送数据、应答信号构成。由于键盘是输入设备,嵌入式处理器只能从总线上读取其键值数据,而不能写入数据,因此I2C总线驱动相关函数包括:总线初始化I2C_Init、中断处理I2C_Exception、读取一字节数据I2CRcvByte、和读取多字节数据I2CrcvString。调用I2CrcvString函数可以读取ZLG7290检测到的按键键值。
由于按键是以中断方式触发,ZLG7290中断引脚/INT与LPC2210外部中断EINT3连接,系统中断初始化时必须使能EINT3并设置为下降沿触发,并在IRQ.S文件中添加中断句柄EINT3_Handler HANDLER EINT3_Exception,在中断处理程序EINT3_Exception( )中发送检测到按键信号量keysem。人机接口任务TaskKEYGUI ( )收到此信号量就会调用key_gui( )函数对键值解码并进行界面切换。
5.3.2 人机界面设计
图形用户界面GUI(Graphics User Interface)是用于提高人机交互易操作性和友好性的计算机程序。针对特定显示设备编写驱动程序,应用任务调用GUI的接口函数进行显示,并可根据用户不同输入进行界面切换,引导用户一步一步进行各种操作[54]。
为了降低硬件平台的处理器负荷,保证系统实时性要求,本系统采用能与μC/OS-II完全兼容的ZLG/GUI图形软件包。与Qt/Embedde和MiniGUI等图形界面相比,ZLG/GUI系统复杂度低,执行效率大大提高,对处理器资源占用和硬件开销要小得多,非常适合移植到LPC2210。
ZLG/GUI支持单色、灰度、彩色显示设备,提供基本的画点、线、图形、圆弧、多边形及填充功能,并支持ASCII字符、汉字、窗口、菜单显示。所有图形显示操作均通过调用驱动接口函数来实现,因此实际应用中必须针对不同显示设备编写驱动程序。
本系统中采用的LFUBK9111液晶显示屏,其显示控制芯片为S1D13503,根据此
芯片数据手册编写初始化及相关画图函数。函数定义在lcddriver.c文件中,包括芯片初始化函数S1D13503_Init( ),液晶显示模块初始化LCD_Initialize( ),液晶模块填充LCD_FillAll( ),刷新指定点LCD_UpdatePoint( )等。以这些函数作为液晶屏驱动,可以编写ZLG/GUI的接口函数,函数名称及功能如表5-2所示。
表5-2 GUI主要接口函数
Table 5-2 Main Interface Functions of GUI
函数名称
GUI_Initialize()
GUI_FillSCR (color)
GUI_ClearSCR( )
GUI_Point(x,y,color)
GUI_CopyColor(*color1,color2)
功能
初始化LCM和缓冲区
全屏填充
以背景色清屏
在指定位置画点
色彩数值复制
参数
无
color表示填充的色彩数值
无
x和y表示指定点所在行和列
color表示填充的色彩数值
将color2色彩值赋给color1
在loadbit.c文件中的GUI_PutHZ(x, y, *dat, hno, lno) 函数实现汉字显示功能,参数x和y表示汉字起始位置,*dat表示汉字点阵的内存首地址指针,hno和lno表示此点阵的长宽像素值。此外要使此函数能被调用,还必须在gui_config.h中把参数GUI_PutHZ_EN设置为1。
ZLG/GUI本身并不带汉字字库,为了精简程序代码,本系统中没有加入全部汉字字库,而只对智能家居用户界面中出现的汉字编写字库文件HZlib.c以实现汉字显示。
表5-3 系统用户界面配置
Table 5-3 System User Interface Configuration
界面
切换主界面
系统参数设置
gui_state
GUI_MAIN
GUI_CONFIG
界面显示函数
maingui()
configgui()
controlgui()
modesetgui()
功能
开机界面,显示各子界面选项
手机号码设置及其他扩展设置
多个家电设备开关控制等
四种家居模式选择
家电设备控制
GUI_CONTROL
家居模式选择
GUI_MODESET
家居环境检测
手机号码设置
GUI_ENVIR
GUI_TELSET
OSSemPost(envguisem)
发送信号量给TaskENVLOOP ( )任务
telsetgui()
newmsggui()
设置短信息发送目的手机号码
显示收到的短消息内容及相关信息 新短消息接收
GUI_NEWMSG
驱动程序和接口函数只是保证操作系统能调用GUI函数在液晶屏上正确显示,在实际应用中还必须设计各种用户界面,并编写按键解码和界面切换函数来实现人机交互。本系统中使用的用户界面配置如表5-3所示。
每个界面都有GUI显示函数,通过定义gui_state标识符来切换。每一个显示界面gui_state对应不同的有效键值,当键值无效时,保持原来界面不变,当检测到的键值在当前界面下有效时,则key_gui( )函数会先调用GUI_ClearSCR( )清屏,然后调用guidisplay( )函数切换到按键操作指定的界面。
5.4 GPRS模块软件设计
GPRS模块与ARM接口通过UART1串口连接,工作方式相当于MODEM,各种操作通过串口发送的AT指令来执行,AT指令在第三章已经详细介绍了,在此不再赘述。为了使GPRS模块的控制命令更简洁清晰,在操作系统中编写了GPRS模块的串口驱动,即UART1串行通信接口函数,包括有发送多字节数据ModemWrite( ),发送AT指令字符串并接收返回字符ModemCommand( ),接收一字节数据ModemGetch( ),接收所有字符GetAllChar( ),各函数代码不一一列出,参见gprs.c文件。
函数返回参数ModemState表示GPRS模块的工作状态,NOT_FIND_MODEM 表示模块未启动,MODEM_CLOSE表示模块未被占用处于空闲状态。
初始化完毕后,GPRS模块开始正常工作,系统通过TaskSMSCHECK任务和TaskMSGdecode任务来检测短消息并对其进行解码,执行对应操作。短消息接收和发送流程如图5-4所示:
开始UART1数据检测否开始UART1发送AT+CMGS=”手机号码”延时否收到+CMTI:”SM”,n是UART1发送AT+CMGR=nUART1接收短消息数据包数据包解码否收到返回字符 >是发送短消息UNICODE码延时收到返回字符 OK调用函数执行对应操作是发送失败发送成功
图5-4 短消息收发流程图
Fig 5-4 The Flow Chart of Massage Receiving and Sending
下面分别介绍系统中SMS短消息接收和发送的实现步骤:
(1)接收短消息
当接收到手机发来的短信息后,模块会向UART1发出字符串+CMTI:”SM”,n (n表示此条短消息在SIM卡中的序号)。系统检测到串口到有数据发来,即触发中断。系统通过短消息检测任务TaskSMSCHECK,给模块发送读取短信命令AT+CMGR=n,读取SIM卡内序号为n的短消息,模块返回的数据包格式如下:
+CMGR:消息状态,源地址,短信服务中心收到消息的时间,地址类型,TPDU首字节,协议标识符,编码方式,短信中心号码,短信实体长度,
数据包是由GPRS模块发送给ARM处理器的,根据数据包的固定格式,可编写函数将其分割成若干小段,分别提取各段的数据信息,并对短消息实体内容做解码处理。
(2)发送短消息
在初始化函数中,系统已经设置了GPRS模块收发短信的模式、编码及其他相关参数,这里只需直接输入AT+CMGS=”手机号码”即可进行短消息的发送。
当家居模式处于监控状态时,系统会检测家居环境,若出现安防或者温度异常情况,则控制器会主动向GPRS模块发出AT指令,控制其向指定的手机号码发送短消息,报告当前家居环境状况。
5.5 Z-Stack协议栈的移植
ZigBee无线网络的实现,必须建立在协议栈的基础上,ZigBee协议栈的结构及功能在第三章已作详细介绍,在此不再赘述。软件开发平台采用IAR集成开发环境。
图5-5 IAR开发环境
Fig 5-5 IAR Development Environment
Z-Stack以工程模板的形式装载在IAR开发环境里,根据IEEE 802.15.4和ZigBee标准分为以下几层:APP(Application Programming),HAL(Hardware Abstract
Layer),MAC(Media Access Control),NWK(Zigbee Network Layer),OSAL(Operating System Abstract System),Security,Services,ZDO(Zigbee Device
Objects)等。打开工程后即可查看和修改整个协议栈各层的文件内容。
硬件抽象层(HAL)提供各种CC2430硬件模块的驱动,包括定时器Timer,通用
I/O口GPIO,通用异步收发传输器UART,模数转换器ADC等。操作系统抽象层OSAL是一个操作系统平台,通过时间片轮转函数实现任务调度,提供多任务处理机制[55]。
协议栈的工作流程如图5-6所示,大致可分为系统启动,驱动初始化,OSAL初始化和启动,进入任务轮询几个阶段。
开始关中断初始化Stack RAM初始化board I/O口初始化HAL驱动初始化NV FLASH分配64位IEEE地址读取NVITEMS初始化OSAL开中断否设置TIMER所有事件
执行完毕?是否有事件发生?是优先级比较高调用事件处理程序低初始化MAC层OSAL任务轮询
图5-6 Z-Stack协议栈工作流程图
Fig5-6 The Flow Chart of Z-Stack Working
系统上电后,首先执行ZMain.c文件中的主函数ZSEG int main( )实现初始化,具体函数包括:关总断osal_int_disable(INTS_ALL)、初始化硬件设置HAL_BOARD_INIT( )、初始化I/O口InitBoard(OB_COLD)、初始化HAL层驱动HalDriverInit( )、初始化非易失性存储器osal_nv_init( )、初始化MAC层ZMacInit( )、分配64位地址zmain_ext_addr( )、初始化NV项目osal_nv_item_init( )、初始化操作系统osal_init_system( )等。
其中硬件初始化需要根据HAL文件夹中的hal_board_cfg.h文件配置CC2430内核寄存器。TI发布的Z-Stack默认硬件配置是针对TI官方开发板的,本系统是自行设计的PCB板,因此则需根据原理图修改hal_board_cfg.h文件参数配置,例如LED和按键的I/O引脚、通用I/O口方向以及ADC、DMA、UART使能控制参数等。
顺利完成上述初始化后,协议栈将执行osal_start_system( )函数开始运行OSAL系统,操作系统一旦启动就将无限循环地运行下去。
OSAL操作系统是整个Z-Stack协议栈的核心,采用事件轮询机制,通过任务的事件触发来实现任务调度,这种软件构架可以有效地降级系统功耗。循环体不断地调用任务事件查询函数osalNextActiveTask( ),按照优先级检测各个任务是否就绪,同时返回任务的事件状态activeTask。每个任务都包含若干个事件,每个事件都对应一个事件号。当一个事件产生时,所属任务的events参数就被设置为相应的事件号,使任务处
于就绪状态,系统将调用task_event_processor( )函数去处理该事件。如果有多个事件同时发生,则比较优先级,由高到低依次处理事件。如果执行完所有就绪的任务,则可以使处理器进入睡眠状态,从而实现低功耗。
Z-Stack各子层上的全部操作均作为OSAL任务事件触发执行,每个任务由任务初始化函数和事件处理函数两部分组成。因此要开发智能家居系统的用户程序,除了在操作系统中添加各子层的任务外,还必须添加用户任务。在应用层程序文件夹APP中增加用户的操作系统文件OSAL_SmartHomeApp.c。
5.6 无线组网及数据通信
OSAL操作系统主要负责各层之间任务的管理和协调,对于ZigBee网络的构建,必须设置NWK层中的相关参数,调用各层相关服务原语来完成。
5.6.1 网络结构和参数设置
在网络初始化之前,在网络层nwk_globals.h和nwk_globals.c文件可以设置组建网络的相关参数,包括网络结构、深度、路由数量、节点数量、是否开启安全服务,安全服务等级等。
STACK_PROFILE_ID为协议栈的模式配置参数,针对不同应用场合的预设了5种参数整体配置方案,本系统设置为HOME_CONTROLS。具体网络参数可进一步修改。
NWK_MODE为网络拓扑结构,可以设置为三种类型:星型(NWK_MODE_STAR)、树形(NWK_MODE_TREE)、网状(NWK_MODE_MESH)。
NWK_MAX_DEVICES是整个网络中可拥有设备的最大数量,其值不能直接修改,等于NWK_MAX_DEVICE_LIST + 1。而NWK_MAX_DEVICE_LIST是网络协调器的设备列表允许接入的最大值,必须通过修改它来间接配置NWK_MAX_DEVICES。
MAX_NODE_DEPTH是协调器支持的网络最大深度,默认设置为5层网络结构。此参数在路由和终端节点数量的定义中也用到。
CskipRtrs[]数组表示网络中每一层的父节点允许接入的路由子节点最大数量,数组元素的总个数为MAX_NODE_DEPTH+1,由低到高表示各层。因为协调器节点处于最顶层,所以第0层没有路由器,其余5层数值可以根据实际应用修改。数组定义如下:
byte CskipRtrs[MAX_NODE_DEPTH+1] = {5,5,5,5,5,0};
CskipChldrn[]数组表示网络每一层的父节点允许接入的终端子节点最大数量,数组元素的含义与CskipRtrs[]中的类似,定义如下:
byte CskipChldrn[MAX_NODE_DEPTH+1] = {5,5,5,5,5,0};
5.6.2 网络的建立和加入
一个ZigBee网络的形成过程包括以下步骤:信道分配,协调器建立网络,路由器或终端发现网络并加入网络。
(1) 信道分配
信道设置通过mac_radio.c文件中的macRadioSetChannel(x)函数实现,此函数首先判断所请求的信道是否合法,然后调用macRadioUpdateChannel( )函数进行信道变换,最终通过MAC_RADIO_SET_CHANNEL(x)来设置信道,其中x表示信道的编号,2.4GHz频段编号范围为11~26。MAC_RADIO_SET_CHANNEL(x)函数定义在mac_radio_defs.h文件里,其代码如下:
#define MAC_RADIO_SET_CHANNEL(x) st (FSCTRLL= FREQ_2405MHZ+5*((x)-11); )
(2) 建立网络
协调器设备通过应用层向网络层发出t原语来启动一个新的网络的建立过程,网络层收到此信号后,将首先向MAC层发出信道扫描请求t,扫描结果通过m原语返回给网络层。扫描过程分两次,通过设置扫描类型参数,首先进行信道的能量扫描,然后进行主动扫描,以选择建立网络的最佳信道。如果找到合适的信道,则网络层将为这个新网络选择一个PAN标识符,并向MAC层发出t原语将这个值写入MAC层的macPANId属性。如果找不到合适的信道或者PAN标识符,则网络层将终止建网,同时向应用层发送原语m报告建立网络失败信息,其状态参数为STARTUP_FAILURE。
在文件中可以设置扫描信道和PAN标识符,
DDEFAULT_CHANLIST表示待扫描信道,范围从11~26;DZDAPP_CONFIG_PAN_ID表示网络PAN标识符,范围从0~0x3FFFF,如果设置为0xFFFF,则表示随机选择一个数值作为新建网络的PAN标识符。
当新网络拥有了一个PAN标识符,则网络层管理实体将分配给此协调器一个0x0000的16位短地址,并通过发送t原语给MAC层请求启动此网络,网络的启动状态参数通过m原语返回到网络层,然后再通过NLME-NETWORK-FORMATION. Confirm传递给应用层,以报告网络建立成功。
Z-Stack协议栈中,服务原语封装成库的形式,并提供了对应的接口函数。建立网络的接口函数在t标准原语定义的5个参数的基础上增加了一个参数PanId,在NWK层的NLMEDE.h文件中其定义如下:
ZStatus_t NLME_NetworkFormationRequest( uint16 PanId, uint32 ScanChannels,
byte ScanDuration, byte BeaconOrder,
byte SuperframeOrder, byte BatteryLifeExtension );
PanId是建立网络的标识号,范围是0~0x3FFF;
ScanChannels是信道编号,从11~26;
ScanDuration是每个信道的扫描时间;
BeaconOrders是网络层信标帧命令传输周期;
SuperframeOrder是网络层超帧命令活动周期;
BatteryLifeExtension 是否支持电池寿命延长模式。
(3) 发现网络
协调器建立网络成功后,必须通过t原语设置参数才能允许其他子设备与此网络连接,在Z-Stack协议栈中其函数形式定义为ZStatus_t
NLME_PermitJoiningRequest( byte PermitDuration); 参数PermitDuration决定该协调器建立的网络是否允许设备连接,0x00表示禁止设备加入,0x01~0xFE之间数值表示一定时间范围才允许设备加入,0xFF表示不限定时间,始终允许设备加入。
子设备通过t原语搜索存在的网络,其接口函数定义为间。
网络层收到该原语后,将发送t原语扫描信道,扫描结果通过m原语返回给网络层,再通过m返回应用层,返回的参数包括ZigBee版本号、堆栈结构、网络标识符(PANId)、逻辑信道和是否允许连接的信息。若发现存在ZigBee网络,则子设备会把此网络的相关信息存入设备邻居关联表(neighbor table)中,以备加入网络。
(4) 加入网络
子设备发现网络后,将调用t原语在邻居关联表里选择一个合适的父设备以加入网络,如果有多个设备可选,则选择到协调器深度最小的一个设备。如果深度相同的设备有多个,则可以任选一个作为父设备。
选定父设备后,子设备的网络层将向MAC层发送t原语,请求连接到该父设备以加入网络,连接状态通过m返回网络层。如果连接成功,则返回原语中包含一个该网络分配的唯一的16位的短地址,将作为子设备以后无线通信的地址。如果本次连接失败,并且邻居关联表中存在多个父设备,则子设备将重复以上的步骤,直到与网络连接成功或者尝试完所有可连接的父设备为止。加入网络的接口函数是:
NLME_JoinRequest( uint8 *extendedPANID, uint16 PanId, byte Channel, byte CapabilityInfo);
ZStatus_t NLME_NetworkDiscoveryRequest( uint32 ScanChannels, byte
scanDuration);参数ScanChannels是待扫描的信道, scanDuration是每个信道扫描的时另一方面,对于父设备,在收到子设备发出的连接请求后,其MAC层会向网络层发出tion原语。父设备的网络层会根据该子设备的64 位扩展地址判断其是否已经在网络中,若已存在则不用重新分配地址,否则为新设备分配一个16 位短地址。同时父设备在邻居表中为增加一个表项以保存新加入的子设备信息,调用tion原语,告知有一个新设备加入到网络中。
以上为关联(associatin)方式加入网络的流程。此外还有一种直接方式加入网络,这种方式父节点和子节点信息均只在本设备内部处理,不会互发无线数据。节点采用直接方式加入网络流程介绍如下:
父设备调用t原语,目的地址参数设置成要求加入网络设备的IEEE地址,然后在网络层判断该子设备是否已经加入网络。如果邻居表中已有该设备,将终止操作;如果没有找到匹配的,则为子设备新分配一个16位网络地址,并在邻居表中为其创建一个表项,调用m原语告诉应用层加入成功。
同时子设备以孤点方式加入网络,这种方式也是子设备脱离网络,变成孤点后重新加入网络的方式。子设备调用t原语,并将设置rejoin network参数为真,然后网络层对MAC发出t原语对孤点设置的信道进行扫描,扫描结果由原语m返回。然后网络层再将向应用层发出m原语告知是否加入网络成功。
在Z-Stack协议栈中,父设备直接将子设备加入网络的接口函数定义为:
ZStatus_t NLME_DirectJoinRequest( byte *DevExtAddress, byte capInfo );
子节点以孤点方式加入网络的接口函数定义为:
ZStatus_t NLME_OrphanJoinRequest( uint32 ScanChannels, byte ScanDuration );
(5) 设备启动
在网络的组建和加入过程中,不同类型设备的工作原理和功能各不相同,在网络层所调用的函数也不相同,为了简化上层操作,便于统一管理协调器、路由器及终端三种设备,在协议栈的应用层设备对象(ZDO)部分使用ZDO_StartDevice( )函数来启动三种类型的设备,该函数在ZdApp_event_loop事件处理函数中被调用,即通过ZDO任务管理来启动设备实现组网入网。
设备启动函数为void ZDO_StartDevice( byte logicalType, devStartModes_t startMode,
byte beaconOrder, byte superframeOrder )
其中logicalType表示设备类型,可设置为协调器(NODETYPE_COORDINATOR)、路由器(NODETYPE_ROUTER)、终端(NODETYPE_DEVICE);
startMode表示设备启动模式,分为硬件启动(MODE_HARD)、加入网络(MODE_JOIN)、恢复原状态(MODE_RESUME)、重新加入网络(MODE_REJOIN);
BeaconOrder信标帧命令传输周期,SuperframeOrder超帧命令活动周期。
具体函数代码见协议栈ZDO文件夹下ZDObject.c源文件,函数通过条件编译语句,判断设备类型是协调器还是路由器或终端,然后设置启动模式,根据设备状态分别调用
NLME_NetworkFormationRequest,NLME_NetworkDiscoveryRequest,NLME_JoinRequest,NLME_OrphanJoinRequest等函数自动启动设备。
协调器建立网络的状态信息通过回调函数ZDO_NetworkFormationConfirmCB( )返回以指示网络是否建立成功,路由或终端加入网络的状态信息通过回调函数ZDO_JoinConfirmCB( )返回以指示是否加入成功[38][55]。
5.6.3 数据的无线收发
(1)数据发送
只有已经连入网络的设备才能发送数据帧,若设备未连网,收到发送数据帧请求时,将丢弃该帧并报告错误。数据是按分层打包传递的方式发送的,源设备的应用层将要传送的数据打包成应用层协议数据单元(APDU),通过原语t发送给网络层,网络层将收到的数据包打包成一个网络层协议数据单元(NPDU),通过原语t继续向下发送给MAC层,MAC层再打包成MPDU(MAC层协议数据单元)传给物理层,最后物理层将整个数据包打包成物理层数据单元(PPDU)发送给目的设备。
Z-Stack中,应用层提供了数据发送的接口函数,其函数格式定义为:
afStatus_t AF_DataRequest(afAddrType_t *dstAddr, endPointDesc_t *srcEP,uint16 cID,
uint16 len,uint8 *buf,uint8 *transID,uint8 options,uint8 radius)
此函数参数有8个,*dstAddr是数据要发送到的目的设备afAddrType_t类型结构体指针,包括目的设备的网络地址,目的地址模式,endPoint注册参数;*srcEP是指向终端描述符的指针,操作系统任务参数,要在指定的任务中注册;cID是串ID,发送数据的标识,接收节点以此区分不同数据,来执行对应的函数;len是待发送数据的字节数;*buf是待发送数据缓冲区首地址指针;*transID是任务传送ID,操作系统任务参数;options是路由发现模式;radius是网络层数据帧里的半径域,其值设置为网络深度MAX_NODE_DEPTH 的2倍。
不同数据发送方式对应于不同目的地址模式参数,数据包的发送分以下三种方式:
单点发送(unicast):只发送给一个指定地址的设备,地址模式为Addr16Bit
多点发送(multicast):发送给某一个指定组内的设备,地址模式为AddrGroup
广播发送(broadcast),发送给整个网络的所有节点,地址模式为AddrBroadcast
(2)数据接收
对于目的设备而言,检测到空中发出的数据包后,会触发是用户任务的一个事件,由OSAL操作系统调用用户任务事件处理函数来接收这个数据包,本系统中调用
的函数是SmartHome_ProcessEvent ( )。任务事件种类有一共有15种,采用switch case条件分支语句来判断当前事件,接收到空中数据的事件标识为AF_INCOMING_MSG_CMD,收到消息后,会调用SmartHomeApp_ProcessMSGCmd( afIncomingMSGPacket_t *pkt )函数来处理收到的数据包。*pkt是收到的数据包的首地址指针。
数据包是一个afIncomingMSGPacket_t结构体,其定义如下:
typedef struct
{
osal_event_hdr_t hdr;
uint16 groupId;
uint16 clusterId;
afAddrType_t srcAddr;
byte endPoint;
byte wasBroadcast;
byte LinkQuality;
byte SecurityUse;
uint32 timestamp;
afMSGCommandFormat_t cmd;
} afIncomingMSGPacket_t;
//操作系统事件头
包括了事件号,组ID、簇ID,源地址类型,发送模式,安全设置等相关参数。
5.7 ZigBee节点应用程序设计
本系统构建的是星型结构网络,因此ZigBee节点只分为主节点(协调器)和从节点(终端),无路由器设备。主从节点程序设计均在同一个IAR工程中完成,只是通过选择Coordinator或者EndDevice类型对程序进行编译并下载到芯片来决定节点的类型。
主节点工作流程图如图5-7(a)所示,从节点工作流程图如图5-7(b)所示:
协调器初始化终端节点初始化建立网络否否加入网络建立网络成功?是 加入网络成功?是收到广播数据包UART收到数据数据打包广播方式发送数据包收到终端节点数据包数据包解码UART发送数据温度采集数据包解码I/O控制I/O检测给协调器发送返回数据包
(a)主节点工作流程图 (b)从节点工作流程图
图5-7 主从节点工作流程图
Fig 5-7 The Flow Chart of Master Node and Slave Node
网络建立和加入的过程上节已作详细介绍,以下是针对本系统的用户任务部分的应用程序设计。
5.7.1 主节点应用程序设计
主节点是整个ZigBee网络的协调器,除了承担网络的建立和管理的任务之外,还负责从节点与ARM控制器之间数据的无线通信。主节点的串口连接LPC2210的UART0,一方面接收ARM发送的串口数据,并以广播方式发送给各从节点;另一方面接收从节点返回的数据包,并通过串口回发给ARM控制器。
主节点用户任务的初始化函数为SmartHomeApp_Init( ),包括设备终端注册,目的地址、发送方式,串口参数设置等。
在硬件层定义了两个串口操作函数:串口发送字符串HalUARTWrite( )和串口接收字符串HalUARTRead( ),代码详见hal_uart.c文件。同时在应用层服务程序里定义了一个串口接收数据回调函数rxCB,当协调器串口检测到有数据发来,即触发串口回调函数rxCB,在此函数中调用HalUARTRead读取串口的数据内容和长度,并对其打包,然后设置数据无线发送事件标志SERIALAPP_MSG_SEND_EVT,执行用户任务事件处理函数SmartHomeApp_ProcessEvent,调用SerialApp_SendData函数将数据发送给从节点。
主节点发送的数据包簇ID定义为SERIALAPP_CLUSTERID1,控制指令分三种:报告状态(各家电状态、安防情况),控制家电(5个I/O口),采集温度,分别设置其数据包头的标识字符为0xBB、0xCC、0xDD。
当协调器接收到从节点返回数据包时,OSAL会设置AF_INCOMING_MSG_CMD
事件标识,用户任务事件处理函数SmartHomeApp_ProcessEvent( )会调用消息处理函数SmartHomeApp_ProcessMSGCmd(MSGpkt),对接收到的数据包进行解码处理,并调用HalUARTWrite从串口转发给ARM控制器。
消息处理函数对于接收到的消息数据包进行处理时,通过数据包结构体中的簇ID(cluster Id)来区分数据包的类型,以switch语句调用对应函数。
5.7.2 从节点应用程序设计
为精简程序代码,从节点初始化任务函数与主节点定义为同一个函数,其大部分代码相同,只需要更改要发送目的地址和模式并取消了串口参数设置部分即可,不同的部分使用条件编译来实现,SerialApp_Init( )修改如下:
#if defined (ENDDIVICE)
SerialApp_ddr =
0;
SerialApp_de = (afAddrMode_t)
Addr16Bit;
#endif
通过I/O口的操作完成的,应用程序根据实现功能分为三部分:
(1) 温度采集程序
DS18B20是数字式温度传感器,可设定9~12位的分辨率,本系统采用12位分辨率,8位整数,4位小数,因此转换精度为2-4即0.0625℃,转换温度信号所需最长时间为750ms。 温度数据由2字节组成,以符号扩展的二进制补码形式存储,最低4位是小数部分,中间7位是整数部分,1位符号位。
DS18B20内部RAM由9个字节的高速缓存器和E2PROM组成,前2个字节即为温度数据。通过复位指令、ROM和RAM功能命令,即可完成对指定DS18B20温度数据的采集和读取,所有读写操作都是通过与CC2430的I/O口连接的DQ引脚完成[51]。
DQ数据线操作函数有三种:复位:init_1820( ) ;写入一字节:write_1820( ); 读取一字节:read_1820( )。对ROM,RAM的读写操作都由这三个函数完成。由于DS18B20有严格的读写时间隙,因此对其读写操作的函数中各条语句执行的时间间隔必须非常精确。
(2) 家电控制
终端家电控制开关由对应I/O口的输出的电平高低决定,系统设置了5个I/O作为输出控制,由协调器发送控制家电设备数据包(0xCC)来进行控制,数据包第2字节到第6字节,每字节代表一个IO口输出状态,0x00表示输出低电平,0x01表示输出高电平,同时设置了IO口状态数组,检测当前IO口输出的电平,可向协调器发送返回数据包,报告各I/O家电当前状态。
由于终端节点要接入多种传感器和家电开关等设备,因此对于设备的操作实际是
(3) 安防报警
红外传感器的S引脚为数据脚,直接连接CC2430的P0.7端口,以外部中断方式工作,其硬件电路连接图设置为边沿触发,因此外部中断方式也设置为边沿触发模式。CC2430检测到0.7口电平变化,就其状态字写入家电状态数据包的第7字节,并立即发送给协调器。
5.8 本章小结
本章首先分析了系统软件结构,介绍了将μC/OS-II移植到LPC2210的过程,然后详细讲解了系统中各个功能模块的软件实现方案,包括人机接口,GPRS模块,短距离无线网络实现和ZigBee主从节点的软件设计。
第六章 系统软硬件调试
6.1 系统调试平台与环境
系统的调试是整个智能家居系统开发的最后环节,调试工作集中于系统的硬件调试以及软硬件联合测试。该工作不仅是对整个系统设计正确性的验证,同时也测试了系统的性能和可靠性,为今后提高系统的稳定性和完善系统的功能提供了依据。
系统调试的平台环境主要分为硬件平台环境和软件平台环境两部分,硬件调试平台主要包括:万用表、稳压电源,PC机、串口转换接头、ARMJTAG硬件仿真头,CC2430仿真调试器SmartRF04EB。其主要功能是提供整个家居控制系统运行和测试的硬件环境,包括家庭内部网无线数据的传输以及对各个硬件功能模块输出信号的测试等。
软件调试环境主要包括几个部分: ADS1.2集成开发环境,IAR编译调试工具,串口调试助手,TI公司的ZigBee抓包分析软件Packet Sniffer。
6.2 硬件调试
根据第四章各模块硬件电路原理图布线并制成PCB板,系统各部分硬件如下所示:图6-1是整个系统实物图片,图6-2是GPRS模块,图6-3是ZigBee模块。
图6-1 系统连接实物图
Fig 6-1 Picture of actual system
图6-2 GPRS模块图片
Fig 6-2 Picture of GPRS Module
图6-3 ZigBee节点图片
Fig 6-3 Picture of ZigBee Module
经过上电实际测试,系统各部分均可正常工作,将GPRS模块串口和ZigBee模块串口分别与PC机的串口连接测试,发送和接收若干字节的数据,串口通信均正确无误。
6.3 软硬件联调
将各部分对应的程序分别下载到LPC2210和ZigBee节点芯片,硬件正确连接后,进行系统整体调试。通过键盘输入对GUI界面进行操作,发送指令来控制各种家电设备,经检验,家电设备的启停功能均符合控制指令,终端执行器继电器动作正确、迅速,达到了设计要求。对家居环境温度和安防情况实时监测功能进行测试,温度传感器测量数据精确、灵敏,温度数据的无线收发迅速,主控制器液晶显示实时性高;红外线传感器检测灵敏,报警准确,实现了家居安防功能。同时GPRS模块远距离短消息的读取和发送都准确无误,实现了远程监控功能。
系统的各个GUI界面如图6-4到图6-9所示。
更多推荐
网络,设备,系统
发布评论