项目二 ZigBee无线传感器网络入门
本章目标
知识目标
- 掌握ZigBee无线传感器模块的芯片选型和硬件资源。
- 了解ZigBee无线传感器网络的协议栈选型和软件资源。
- 了解Z-Stack协议栈的应用。
技能目标
- 掌握ZigBee无线传感器网络的协议栈选型和软件资源。
- 了解Z-Stack协议栈的修改。
随着现代微电子、微机电系统(Micro-Electro-Mechanical System,MEMS)、SoC、纳米材料、无线通信技术、信号处理技术、计算机网络技术等的进步以及互联网的迅速发展,传感器信息获取技术从独立的单一化模式向集成化、微型化,进而向智能化、网络化方向发展,成为信息获取最重要和最基本的技术之一。
ZigBee传感器网是集传感器、数据处理单元和通信模块的微小节点随机分布,并通过自组织方式构成的网络,借助节点中内置的形式多样的传感器测量周边环境中热、红外、声呐、雷达、射频和地震波等信号,从而探测包括温度、湿度、噪声、光强度、压力、气体成分及浓度、土壤成分、移动物体大小、速度和方向等众多感兴趣的物质现象。在通信方式上,可以采用有线、无线、红外、超声波和光等任意一种或多种方式。
2.1 需求分析
2.1.1 各层功能简介
根据物联网的服务类型和节点等情况,物联网的体系结构主要由物理层、媒体接入控制层、网络/安全层和应用层组成。
1.物理层
物理层定义了无线信息和MAC子层之间的接口,提供物理层数据服务和物理层管理服务,主要是在驱动程序的基础上,实现数据传输和管理。物理层数据服务从无线信道上收发数据,管理服务包括信道能量监测(Energy Detection,ED)、链接质量指示(Link Qualily Indicator,LQI)、载波检测(Carrier Sense,CS)和空闲信道评估(Clear Channel Assessment,CCA)等,维护一个由物理层相关数据组成的数据库。
2.介质访问控制层
介质访问控制层提供了MAC层数据服务和MAC层管理服务。前者保证MAC层协议数据单元在物理层数据服务中的正确收发,而后者从事MAC层的管理活动,并维护一个信息数据库。
3.网络/安全层
网络/安全层负责设备加入和退出网络,申请安全结构、路由管理,在设备之间发现和维护路由,发现邻设备、存储邻设备信息。
4.应用层
应用层包括应用支持子层(Application Support Layer,APS)和ZigBee设备对象(ZigBee Device Object,ZDO)。其中,APS负责维持绑定表,在绑定的设备之间传送消息;而ZDO定义设备在网络中的角色,发起和响应绑定请求,在网络设备之间建立安全机制。
2.1.2 最低需求估算
数据在通信设备之间传输时,其传输过程均是由上层协议到底层协议,再由底层协议到上层协议。相比于常见的无线通信标准,ZigBee协议套件紧凑而简单,并且其实现的要求很低。以下是ZigBee协议套件的最低需求估算。
(1)硬件需要8位处理器,如80C51。
(2)软件需要32KB的ROM,最小软件需要4KB的ROM,如CC2430芯片具有8051内核、内存可选择从32~128KB的 ZigBee无线单片机系统。
(3)网络主节点需要更多的RAM,以容纳网络内所有节点的设备信息、数据包转发表、设备关联表以及与安全有关的密钥存储等。
根据需求分析和估算,我们采用粤嵌科技推出的用于ZigBee传感器网络研究演示平台的实验节点GEC WSN ZigBee。GEC WSN ZigBee节点主要包含具备无线收发功能的微处理器、传感器和标准通信接口,其中微处理器采用的是TI公司的 CC2530,外围元件包含一颗32MHz晶振和一颗32.768kHz晶振及其他一些阻容器件。
2.2 硬件资源
ZigBee是一种短距离的无线通信技术,其应用系统由硬件和软件组成,本章主要讲解ZigBee芯片和ZigBee协议栈。
2.2.1 节点芯片选型
单片机按照CPU处理数据的位宽可分为4位、8位、16位和32位单片机。其中8位单片机由于内部构造简单、体格小、成本低等优势,应用最为广泛。4位单片机主要应用于工业控制领域,随着工艺的发展,由于性能较低,逐步退出市场。而16位和32位单片机虽然性能比8位单片机强得多,但由于成本和应用场合的限制,尤其是近年来ARM嵌入式技术的发展,导致它的应用不如8位单片机那么广泛。而16位和32位单片机主要应用于视频采集、图形处理等方面。
目前,世界各大电子电器公司基本上都有自己的单片机系列产品。如三星公司的KS86和KS88系列8位单片机、Philips公司的P89C51系列8位单片机、Atmel公司的AT89系列8位单片机等。目前,在物联网领域应用较为广泛的有TI公司的MSP430系列,Atmel公司的AVR系列、51系列,Microchip公司的PIC系列等。除了单片机含有的外设和数量存在一定的差异外,处理器核的差异是体现这些单片机性能差异的主要原因。本系统采用TI公司的8位单片机CC2530作为核心芯片进行阐述。
进行ZigBee无线传感器网络的二次开发硬件支持主要包括核心板硬件资源和底板硬件资源两部分。
2.2.2 核心板硬件资源
1.CC2530简介
CC2530 是用于 IEEE 802.15.4 ZigBee 和 RF4CE 应用的一个真正的SoC解决方案。它能够以非常低的总材料成本建立强大的网络节点。CC2530 结合了领先的 RF收发器的优良性能、业界标准的增强型 8051 CPU、系统内可编程闪存及8KB RAM 和许多其他强大的功能。CC2530有4种不同的闪存版本即CC2530F32/64/128/256,分别具有 32/64/128/256KB 的闪存。CC2530具有不同的运行模式,使得它尤其适应超低功耗要求的系统,运行模式之间的转换时间短,进一步确保了低能源消耗。
CC2530F256结合了TI公司在业界领先的黄金单元ZigBee 协议栈(Z-StackTM),提供了ZigBee 解决方案。
CC2530F64 结合了TI公司的黄金单元 RemoTI,更好地提供了完整的ZigBee RF4CE 远程控制解决方案。
图2.1是CC2530的方框图,图中模块大致可以分为3类:CPU和内存相关的模块,外设、时钟和电源管理相关的模块,以及无线电相关的模块。
图2.1 CC2530方框图
(1)CPU和内存
CC2530芯片系列中使用的8051CPU内核是一个单周期的8051兼容内核。它有3种不同的内存访问总线:特殊功能寄存器(Special Function Register,SFR)、数据(DATA)和代码/外部数据(CODE/XDATA)。它包括一个调试接口和一个18输入扩展中断单元。
CC2530使用单周期访问SFR、DATA和主SRAM。
中断控制器总共提供18个中断源,分为6个中断组,每个中断组与4个中断优先级之一相关。当CC2530处于空闲模式时,任何中断都可以将CC2530恢复到主动模式。某些中断还可以将CC2530从睡眠模式唤醒(供电模式1~3)。
内存仲裁器位于系统中心,因为它通过SFR总线把CPU和DMA控制器和物理存储器以及所有外设连接起来。内存仲裁器有4个内存访问点,每次访问可以映射3个物理存储器之一:8-KB SRAM、闪存存储器和XREG/SFR寄存器。它负责执行仲裁,并确定同时访问同一个物理存储器之间的顺序。
8-KB SRAM映射到DATA存储空间和部分XDATA存储空间。8-KB SRAM是一个超低功耗的SRAM,即使数字部分掉电(供电模式2和3)也能保留其内容。这是对于低功耗应用来说很重要的一个功能。
CC2530的Flash容量可以选择,有32 KB、64 KB、128 KB、256 KB,这就是CC2530的在线可编程非易失性程序存储器,并且映射到CODE和XDATA存储空间。除了保存程序代码和常量之外,非易失性程序存储器允许应用程序保存必须保留的数据,这样设备重启之后可以使用这些数据。使用这个功能,例如可以利用已经保存的网络具体数据,就不需要经过完全启动、网络寻找和加入过程,系统再次上电后就可以直接加入网络中。
(2)时钟和电源管理
数字内核和外设由一个1.8V低差稳压器供电。它提供了电源管理功能,可以实现使用不同供电模式的长电池寿命的低功耗运行。CC2530有5种不同的复位源来复位设备。
(3)外设
CC2530包括许多不同的外设,允许应用程序设计者开发先进的应用。
调试接口执行1个专有的两线串行接口,用于内电路调试。通过这个调试接口,可以执行整个闪存存储器的擦除、控制哪个振荡器、停止和开始执行用户程序、执行8051内核提供的指令、设置代码断点,以及内核中全部指令的单步调试。使用这些技术,可以很好地执行内电路的调试和外部闪存的编程。
设备含有闪存存储器以及存储程序代码。闪存存储器可通过用户软件和调试接口编程。闪存控制器处理写入和擦除嵌入式闪存存储器。闪存控制器允许页面擦除和4字节编程。
I/O控制器负责所有通用I/O引脚。CPU可以配置外设模块来控制某个引脚,或它们是否受软件控制。如果是的话,每个引脚配置为一个输入输出,是否连接衬垫里的1个上拉或下拉电阻。CPU中断可以分别在每个引脚上使能。连接到I/O引脚的外设可以在2个不同的I/O引脚位置之间选择,可以确保在不同应用程序中的灵活性。
系统可以使用一个多功能的5通道DMA控制器,使用XDATA存储空间访问存储器,因此能够访问所有物理存储器。每个通道(触发器、优先级、传输模式、寻址模式、源和目标指针和传输计数)用DMA描述符在存储器任何地方配置。许多硬件外设(AES内核、闪存控制器、USART、定时器、ADC接口)通过使用DMA控制器在SFR或XREG地址和闪存/SRAM之间进行数据传输,获得高效率操作。定时器1是一个16位定时器,具有定时器/PWM功能。它有一个可编程的分频器、一个16位周期值和5个各自可编程的计数器/捕获通道,每个都有一个16位比较值。每个计数器/捕获通道都可以用作一个PWM输出或捕获输入信号边沿的时序。它还可以配置在IR产生模式,计算定时器3的周期,输出和定时器3的输出相与,用最小的CPU互动产生调制的消费型IR信号。
MAC定时器(定时器2)是专门为支持IEEE 802.15.4 MAC或软件中其他时槽的协议设计。定时器有一个可配置的定时器周期和一个8位溢出计数器,可以用于保持跟踪已经经过的同期数。一个16位捕获寄存器也用于记录收到/发送一个帧开始界定符的精确时间,或传输结束的精确时间,还有一个16位输出比较寄存器可以在具体时间产生不同的选通命令(开始RX、开始TX等)到无线模块。定时器3和定时器4是8位定时器,具有定时器/计数器/PWM功能。它们有一个可编程的分频器、一个8位的周期值、一个可编程的计数器通道,具有一个8位的比较值。每个计数器通道都可以用作一个PWM输出。
睡眠定时器是一个超低功耗的定时器,计算晶振或32kHz RC振荡器的周期(XOSC_Q1和XOSC_Q2之间采用32MHz晶振,32k_Q1和32k_Q2之间采用32.768kHz晶振)。睡眠定时器在除了供电模式3的所有工作模式下不断运行。这一定时器的典型应用是作为实时计数器,或作为一个唤醒定时器跳出供电模式1或2。
ADC支持7~12位的分辨率,带宽频率为30kHz或4kHz。DC和音频转换可以使用高达8个输入通道(端口0),输入可以选择作为单端或差分。参考电压可以是内部电压、AVDD或是一个单端或差分外部信号。ADC还有一个温度传感输入通道。ADC可以自动执行定期抽样或转换通道序列的程序。
随机数发生器使用一个16位LFSR来产生伪随机数,这可以被CPU读取或由选通命令处理器直接使用。例如,随机数可以用作产生随机密钥,增强安全性。
AES加密解密内核允许用户使用带有128位密钥的AES算法加密和解密数据。这一内核能够支持IEEE 802.15.4 MAC安全、ZigBee网络层和应用层要求的AES操作。
一个内置的看门狗允许CC2530在固件挂起的情况下复位自身。当看门狗定时器由软件使用,它必须定期清除;否则,当它超时就复位设备。或者它可以配置用作一个通用32kHz定时器。
串口1(USART 0)和串口2(USART 1)每个被配置为一个SPI主/从或一个UART。它们为RX和TX提供了双缓冲,以及硬件流控制,因此非常适合于高吞吐量的全双工应用,每个都有自己的高精度波特率发生器,可以将普通定时器空闲出来用作其他用途。
2.无线设备
CC2530具有一个IEEE 802.15.4兼容无线收发器。RF内核控制模拟无线模块。另外,它提供了MCU和无线设备之间的一个接口,从而可以发出命令、读取状态,自动操作和确定无线设备事件的顺序。无线设备还包括一个数据包过滤和地址识别模块。
继CC2530后,TI公司又相继推出了针对不同应用的CC2531、CC2533等IC。表2.1是它们之间的功能差异描述表,供选型时参考。
表2.1 CC2530、CC2531和CC2533差异描述表
功 能 配 置 | CC2530 | CC2531 | CC2533 |
---|---|---|---|
2.4GHz IEEE 802.15.4标准射频收发器 | 有 | 有 | 有 |
射频调制模式 | DSSS | DSSS | |
最大可编程输出功率 | +4.5dBmW | +4.5dBmW | +4.5dBmW |
内置FLASH空间(Byte) | 32k/64k/128k/256 | 128k/256k | 32k/64k/96k |
内置RAM空间 | 8k | 4k/6k | |
USB接口(FULL SPEED) | 无 | 有 | 无 |
ADC | 有 | 无 | |
电池低电压监控 | 不支持 | 支持 | |
I2C | 不支持 | 支持 | |
待机消耗电流(UA) | 1 | <1 | |
封装 | QFN40 | QFN40 | QFN40 |
IEEE 802.15.4 | 支持 | 支持 | 支持 |
标准RF 4CE协议栈 | 支持 | 支持 | 支持 |
标准TIMAC协议栈 | 支持 | 支持 | 支持 |
标准SimpliciTI协议栈 | 支持 | 支持 | 支持 |
标准Z-Stack协议栈 | 支持 | 支持 | 不支持 |
在基于ZigBee协议的无线传感器网络构建过程中,天线及巴伦匹配电路的设计对射频通信距离和系统功耗等都有较大的影响。天线设计可以使用PCB天线,如倒F天线、螺旋天线等,也可使用SMA接口的杆状天线,根据不同的应用来选择。
采用板载PCB天线设计和巴伦匹配电路,接收灵敏度可达-97dB。采用DIP2.54mm扩展接口,更加方便用户的扩展,甚至可以用万用板扩展。在开阔的马路边上,其可视通信距离为200m,室内非混凝土墙可穿透3堵,距离可达到10m左右,视测试条件的不同略有变化。巴伦可以使用低成本的分立电感和电容实现,天线及巴伦匹配电路设计如图2.2所示。如果使用了诸如折叠偶极子这样的平衡天线,则巴伦可以忽略。
图2.2 天线及巴伦匹配电路设计示意图
2.2.3 底板硬件资源
1.底板电源电路设计
GEC CC2530F256节点考虑两种供电方式:AA电池供电和USB供电。两节AA电池电压为3V,因而节点不需要专门的升压/降压芯片为IC供电。USB供电方式的电压为4.5~5V,节点采用TI公司的 TPS60211升压为其他IC提供3.3V电压。TPS60211输出电流可达400mA,输出100mA时所需最低压降为120mV。电源电路图如图2.3所示。
图2.3 电源电路示意图
2.LED电路设计
LED主要用于指示电路的工作状态,如加入网络、网络信号良好、正在传输数据等信息。LED电路图如图2.4所示。
图2.4 LED电路示意图
3.传感电路设计
GEC CC2530F256节点的传感器包括温湿度传感器和光敏电阻、温敏电阻。温湿度传感器采用AOSONG公司的DHT11。DHT11将温度检测、湿度检测、信号转换、A/D转换和加热等功能集成到一个芯片上。DHT11通过单线串行通信协议与微处理器通信。光敏电阻、温敏电阻通过处理器的AD转换功能,采集当前温度、光照度。温湿度传感电路设计图、光敏传感电路设计图分别如图2.5和图2.6所示。
图2.5 温湿度传感电路设计图
图2.6 光敏传感电路设计图
4.按键电路设计
按键应用人机交互方法,主要用于复位功能、灯的开关等功能的实现。按键电路设计图如图2.7所示。
图2.7 按键电路设计图
2.3 软件资源
2.3.1 ZigBee协议栈选型
常见的ZigBee协议栈分非开源的协议栈、半开源的协议栈和开源的协议栈3种。
1.非开源的协议栈
常见的非开源的协议栈的解决方案包括Freescale解决方案和Microchip解决方案。
Freescale解决方案中最简单的ZigBee解决方案就是SMAC协议,是面向简单的点对点应用,不涉及网络的概念。Freescale完整的ZigBee协议栈为BeeStack协议栈,也是最复杂的协议栈,看不到具体的代码,只提供一些封装的函数直接调用。
Microchip解决方案提供的ZigBee协议栈为ZigBeePRO和ZigBee RF4CE,均是完整的协议栈,但收费较高。
2.半开源的协议栈
TI公司开发的是一个半开源的ZigBee协议栈,是一款免费的ZigBee协议栈,它支持ZigBee和ZigBeePRO栈,并向后兼容ZigBee 2006和ZigBee 2004。Z-Stack内嵌了OSAL操作系统,标准的C语言代码,使用IAR开发平台,比较容易学习,是一款适合工业级应用的ZigBee协议栈。
3.开源的协议栈
Freakz是一个彻底开源的ZigBee协议栈,配合contiki操作系统,contiki的代码全部由C语言编写,对于初学者来说比较容易上手。Freakz适合用于学习,对于工业应用,Z-Stack比较适用。
根据应用需求,我们选用TI公司提供的ZigBee 2007协议栈和IAR平台作为软件工具进行二次开发。
开源即单击该函数的右键,选择“Go to definition of 函数名称”,能够跳转到源函数定义,查看源程序。
2.3.2 IAR集成开发环境的安装
对于单片机的开发环境,软件方面涉及对编程语言、编辑编译和调试环境的选择问题。根据应用对象的特点选择合适的开发编程语言和工具,是解决问题的首要任务。
单片机的编程环境一般有两种:汇编语言和C语言。无论是采用C语言,还是汇编语言,都是各有利弊。虽然对汇编语言的娴熟使用需要一定的时间,而且调试起来困难很大,但其程序执行效率高是不争的事实。C语言虽易学易用,但对于一些底层和重复性的操作,采用C语言实现起来效率偏低。所以在开发过程中,推荐采用C语言和汇编语言相结合的编程方式,以充分发挥这两者的优势。例如,通常用汇编语言编写底层的对硬件的操作,把与硬件无关或相关性较小的部分用C语言实现。当然,要充分发挥这两者的性能优势,需要对C编译器有一定的了解,并注重平时的积累。
1.ZigBee开发环境简介
我们的实验平台选用IAR Embedded Workbench作为ZigBee的开发环境。IAR Embedded Workbench(简称 EW)的C/C++交叉编译器和调试器是目前世界上最完整和最容易使用的专业嵌入式应用开发工具之一。EW对不同的微处理器提供相同的直观用户界面。EW今天已经支持35种以上的8位/16位/32位的微处理器结构。
EW包括嵌入式C/C++优化编译器、汇编器、连接定位器、库管理员、编辑器、项目管理器和C-SPY调试器。IAR编译器使代码更加紧凑和优化,节省硬件资源,最大限度地降低产品成本,提高产品竞争力。
IAR Embedded Workbench集成的编译器主要产品特征如下。
① 高效PROMable代码。
② 完全兼容标准C。
③ 内建对应芯片程序速度和大小的优化器。
④ 目标特性扩充。
⑤ 版本控制和扩展工具支持良好。
⑥ 便捷的中断处理和模拟。
⑦ 瓶颈性能分析。
⑧ 高效浮点支持。
⑨ 内存模式选择。
⑩ 工程中相对路径支持。
IAR Systems的C/C++编译器可以生成高效、可靠的可执行代码,并且应用程序规模越大,效果越明显。
忽略项目的最终期限,开发者需要依靠一些可靠的开发工具来完成任务。未能按时完成进度会给项目带来不便,而恶性循环将会导致所有进度安排的拖延,后果会十分严重。IAR Embedded Workbench被认为是一款稳定、可靠、高效的开发工具,可以提高项目开发效率。
IAR Embedded Workbench 是一套完整的集成开发工具集合:包括从代码编辑器、工程 建立到C/C++编译器、连接器和调试器的各类开发工具。它和各种仿真器、调试器紧密结合, 使用户在开发和调试的过程中,仅仅使用一种开发环境界面,就可以完成多种微控制器的开发工作。
2.ZigBee开发环境的安装
IAR Embedded Workbench的安装如同Windows操作系统其他软件一样,单击setup.exe进行安装,出现如图2.8所示的界面。
图2.8 IAR软件安装起始界面图
单击“Next”按钮至下一步,分别填写你的名字、公司以及认证序列,如图2.9所示。注:认证序列(license number)和lisence key由注册机生成,如图2.10所示。
图2.9 IAR软件安装界面
图2.10 IAR注册机
正确填写后,单击“Next”按钮至下一步,填写由本计算机的机器码和认证序列生成的序列密钥,如图2.11所示。
输入正确的信息后,单击“Next”按钮到下一步。如图2.12所示,可以选择完全安装或是典型安装,这里我们选择完全安装。
图2.11 输入安装信息界面
图2.12 选择安装类型界面
单击“Next”按钮到下一步,这里可以查证之前输入的信息是否正确,如图2.13所示。如果需要修改,单击“Back”按钮返回修改。
图2.13 安装信息确认界面
单击“Next”按钮正式开始安装,可以看到安装进度,如图2.14所示。这将需要几分钟的时间,请耐心等待。
图2.14 安装进度界面
当进度条读到100%时,显示如图2.15所示的界面。可选择查看IAR的介绍以及是否立即运行 IAR开发集成环境,并单击“Finish”按钮来完成安装。
图2.15 安装完成界面
完成安装后,可以从“开始”菜单找到刚刚安装的IAR软件,如图2.16所示。
图2.16 运行IAR 软件
2.3.3 安装仿真器驱动程序
1.自动安装仿真器的驱动程序
成功安装IAR软件后,由于IAR的安装软件中含有仿真器的驱动,所以连接仿真器与PC后可以自动安装仿真器的驱动程序。具体操作如下。
将仿真器通过附带的USB电缆连接到PC机,在Windows XP系统下,系统发现新硬件后弹出提示对话框,在该对话框中选择“是,仅这一次”选项,单击“下一步”按钮,如图2.17所示。
图2.17 硬件安装向导
系统识别出仿真器,选择“自动安装软件”选项,如图2.18所示。
图2.18 自动安装示意图
向导会自动搜索并复制驱动文件到系统,如图2.19所示。
图2.19 安装驱动文件
系统安装完驱动后弹出对话框提示安装完成,单击“完成”按钮退出安装,如图2.20所示。
图2.20 仿真器驱动安装完成
2.手动安装仿真器的驱动程序
如果向导未能自动搜索到驱动文件,驱动程序可以在IAR的安装文件中找到。选择“从列表或指定位置安装”选项,如图2.21所示。
图2.21 手动安装
选择“在搜索中包括的位置”选项,如图2.22所示。
图2.22 搜素位置示意图
选择“浏览”选项,如图2.23所示。
在IAR的安装路径中找到Texas Instruments文件夹,按系统提示直至完成安装,如图2.24所示。
图2.23 搜索位置路径示意图
图2.24 完成安装
注:如果电脑中没有安装IAR或者是仿真器的驱动丢失,可以直接安装仿真器驱动,运行ebinstaller.exe即可,即完成了仿真器驱动的安装。
安装完成后,重新拔插仿真器,在设备管理器里找到 Chipco SR,说明驱动安装完成,如图2.25所示。
图2.25 仿真器驱动安装成功示意图
2.3.4 安装物理地址烧写软件
打开物理地址烧写软件安装程序Setup_SmartRFProgr_1.6.2.exe(物理地址烧写软件的目录位置:“\工具软件”),显示如图2.26所示的界面。
单击“Next”按钮继续,选择安装路径(默认即可),显示如图2.27所示的界面。
继续单击“Next”按钮,显示如图2.28所示的界面。
图2.26 物理地址烧写软件安装
图2.27 安装路径
图2.28 安装界面
单击“Next”按钮,显示如图2.29所示的界面;再单击“Install”按钮,开始安装。
图2.29 安装界面
安装完成,显示如图2.30所示的界面。
图2.30 物理地址烧写软件安装完成
单击“Finish”按钮,退出安装程序。在开始菜单中选择Texas Instruments→SmarRF FIash Programmer作为物理地址烧写软件的位置,如图2.31所示。
图2.31 物理地址烧写软件的位置
2.4 软件应用
2.4.1 IAR的使用
1.新建一个工程
打开IAR Embedded Workbench软件,选择“Project”→“Create New Project”,如图2.32所示。
选择“Empty project” 默认配置,如图2.33所示。
图2.32 新建一个工程
图2.33 选择配置
单击“0K”按钮弹出“另存为”对话框,如图2.34所示。
此时我们选择将其保存在之前已在桌面上建立的一个名为“project”的文件夹中,并将项目也取名为“project”,会产生一个ewp文件。
然后选择“File”→“Save Workspace”,如图2.35所示,保存工程,弹出保存工程对话框,如图2.36所示。
图2.34 “另存为”对话框
图2.35 选择保存工程
输入工程文件名,单击“保存”按钮退出,系统将产生一个以eww文件。这样,我们就建立了IAR的一个工程文件。
2.参数设置
接下来,我们对这个工程加入一些特有的配置。选择“Project”→“Options”,如图2.37所示。
显示工程选项页面,如图2.38所示。
工程选项页面中需要设置很多必要的参数,下面我们针对CC2531来配置这些参数。
图2.36 保存工程对话框
图2.37 打开工程选项
(1)General Options 设置
将“General Options”→“Target”选项中的“Device” 选择为CC2530,如图2.39和图2.40所示(由于ZigBeePRO协议栈是以CC2530为基准的,所以这里我们将Device选择为CC2530,CC2531与CC2530区别很小)。
图2.38 工程选项页面
图2.39 找到 Texas Instruments 文件夹
图2.40 选择需要的芯片
在“General Options”菜单的“Target”选项卡中,“Data model”选项选择为“Large”,“Calling cinvention”选项选择为“XDATA”,如图2.41所示。
(2)C/C++ Compiler设置
在“C/C++ Compile”菜单的“Preprocessor”选项卡中有两个很重要的选项,它们分别是 “Include paths”和“Defined symbols”。“Ignore Standard include directories”表示是否忽略在工程中包含文件的路径(选择默认不勾选即可),“Defined symbols”表示在工程中的宏定义,如图2.42所示。
图2.41 修改Calling cinvention
图2.42 C/C++ Compiler 设置
① 在定义包含文件路径的文本框中,定义包含文件的路径有两种很重要的语法如下所示。
一是$TOOLKIT_DIR$。这个语法表示包含文件的路径在IAR安装路径的8051文件夹下,也就是说如果IAR安装在C盘中,那么它就表示C:\Program Files\IAR Systems\Embedded Workbench 4.05 Evaluation version\8051这个路径。
二是$PROJ_DIR$。这个语法表示包含文件的路径在工程文件中,也就是和eww文件和 ewp文件相同的目录。我们刚才建立的project项目中,如果使用了这个语言,那么就表示现在这个文件指向了C:\Documents and Settings\Administrator\桌面\project 这个文件夹。
和这两个语言配合使用的还有两个很重要的符号,这就是“\..”和“\文件夹名”。 “\..”表示返回上一级文件夹。“\文件夹名”表示进入名为“文件夹名”的文件夹。
我们来具体看两个例子。
$TOOLKIT_DIR$\inc\:这句话的意思是包含文件指向C:\Program Files\IAR Systems\Embedded Workbench 4.05 Evaluation version\8051\inc。
$PROJ_DIR$\..\Source:这句话的意思是包含文件指向工程目录的上一级目录中的 Source文件夹。例如,假设我们的工程放在D:\project\IAR中,那么$PROJ_DIR$\..\就将路径指向了D:\project,再执行\Source,就表示将路径指向了D:\project\Source。
继续回到我们的工程,下面通过上面的方法设定一些必要的路径,如图2.43所示。$TOOLKIT_DIR$\INC\中存放了CC2531的h文件,$TOOLKIT_DIR$\inc\clib\中有很多常用的h文件。一般这两个路径是必须要添加的。还有$PROJ_DIR$\include,是一个包含在工程中的include文件夹,这个文件夹需要自己在工程文件中创建,一般自定义的头文件可以放在这个文件夹中,编程时只要在main函数中用#include声明即可。
图2.43 设置工程路径
② 在宏定义文件的文本框中,是用于用户自定义的一些宏定义,它的功能和#define 相似,这里不再赘述,在后面的应用中,会根据具体情况给出使用方法。
(3)Linker设置
在“Linker”菜单的“Output”选项卡中可以进行输出文件格式的设置。选择如图2.44所示的选项即可实现IAR的在线调试。
图2.44 “Output”选项卡
在“Linker”菜单的“Config”选项卡中,“linker command file”选项选择“lnk51ew_CC2530.xcl”,如图2.45所示。
(4)Debugger 设置。在“Debugger”菜单的“Setup”选项卡中,“Driver”选项选择“Texas Instruments”,如图2.46所示。
图2.45 设置linker command file
图2.46 设置Debugger
到此,对于整个项目的基本设置就完成了,现在开始第一个项目开发。
3.第一个项目
新建一个C文件,选择New菜单中的“File”选项并保存,如图2.47和图2.48所示。
输入文件名后单击保存,如果是C文件请务必添加“c”后缀,否则会以文本文件存档,如图2.49所示。
图2.47 新建一个文件
图2.48 保存文件
图2.49 输入文件名并保存
右键单击所建的工程“project”,在弹出的工具栏中选择“Add Group”,创建一个文件组,如图2.50所示。
输入文件组名,如图2.51所示。
图2.50 创建一个文件组
图2.51 输入文件组名
右键单击刚创建的文件组“main”,在弹出的工具栏中选择“Add Files”,加入”first.c”文件,如图2.52~图2.54所示。
图2.52 加入文件
图2.53 选择新建的C文件
图2.54 打开文件
接下来,在“first.c”中加入第一个代码,如图2.55所示。这个代码的意思是将P1口设置为输出,将P1口置0,在模块和开发板中有小灯在P1口上,当执行这个代码时,小灯会点亮。
图2.55 代码
在实际的使用中如果IAR的工程路径有中文路径,有可能在调试的时候,设置断点不能生效。所以,为了方便在线调试,我们将建立的工程复制到磁盘根目录中。然后打开工程执行“Project”菜单的“Make”命令,如图2.56所示。
图2.56 编译
可以通过“Make”编译,也可以通过“Rebuild All”全部编译(用“Make”只会编译修改过的文件)。编译后只要没有错误就可以使用了,一般警告可以忽略。有关错误和警告的提示信息如图2.57所示。
图2.57 提示信息
在编译没有错误后,就可以下载程序了,单击“Debug”按钮,执行下载程序。下载程序完成后,软件进入在线仿真模式,如图2.58所示。
图2.58 Debug示意图
图2.58 Debug示意图(续)
Reset:复位。
Break:停止运行。
Step Into:执行内部函数或子程序的调用。
Step Over:每步执行一个函数调用。
Step Out:跳出内部函数或子程序的调用。
Next statement:每次执行一个语句。
Run to Cursor:运行到光标位置。
Go:全速运行,快捷键为F5。
Stop Debuggring:结束调试。
在仿真模式中,可以对这个文件设置断点,断点的设置方法是首先选择需要设置断点的 行,然后单击“Toggle Breakpoint”设置断点。设置好以后,这行代码会变为红色,这样就表示断点设置已经完成,如图2.59所示。
然后,执行全速运行,当执行到断点处会停止,如图2.60所示。
图2.59 设置断点示意图
图2.60 运行示意图
接着,用鼠标选中“P1DIR”,单击右键,选择“Add to Watch”或者“Quick Watch”,如图2.61所示。
图2.61 Watch查看
此步骤的作用是查看该寄存器中的值,如果是一个变量的话,就可以查看一个变量的值。该值在Watch中可以看到,如图2.62所示。
图2.62 查看寄存器值
一个模块中包含两个文件,一个是h文件,另一个是c文件
h文件是一个接口描述文件,其文件内部一般不包含任何实质性的函数代码,主要对外提供接口函数或接口变量。头文件的构成原则:不该外界知道的信息就不应该出现在头文件里,而供外界调用的模块内部接口函数或接口变量所必需的信息就一定要出现在头文件里。
c文件的主要功能是对h文件中声明的外部函数进行具体实现,对具体实现方式没有特殊规定,只要能实现其函数的功能即可。
4.IAR中标记行号和字体
IAR中可以设置字体大小、关键字的颜色及行号显示。选择“tools”菜单中的“Options”选项进入设置。在“tools”菜单的“Options”选项中,“Editor”勾选“Show line number ”便可以显示行号,如图2.63所示。
在“tools”菜单“Options”选项的“Editor Colors and Fonts”中便可以设置字体,如图2.64所示。
图2.63 行号示意图
图2.64 字体标记示意图
2.4.2 协议栈的安装
为了从整体上认识Z-Stack架构,我们拟选用TI公司推出的ZigBee 2007协议栈进行剖析。从TI官方网站上下载Z-Stack-CC2530-2.3.0-1.4.0.exe,进行协议栈的安装,默认安装到C盘根目录下,即C:\Texas Instruments\ZStack-CC2530-2.3.0-1.4.0\Projects\zstack\Samples。TI公司提供了GenericApp.eww、SampleApp.eww和SimpleApp.eww,3种例程。他们的实现功能各有区别。
协议栈GenericApp实现设备互相绑定传送信息(hello world);SampleApp主要实现设备发送和接收LED灯信息;SimpleApp主要实现温度和灯开关,和智能家居结合使用的have Profile。
本教程以SampleApp.eww为例进行讲解。在路径C:\Texas Instruments\ZStack-CC2530- 2.3.0-1.4.0\Projects\zstack\Samples\SampleApp\CC2530DB下找到SampleApp工程路径,如图2.65所示。
图2.65 SampleApp工程路径
协议栈Z-Stack-CC2530-2.3.0-1.4.0.exe和协议栈Z-Stack-CC2530-2.5.0虽然都针对CC2530开发,功能稍有差别。采用哪个协议栈开发的软件必须在哪个协议栈下使用。
打开SampleApp工程文件,如图2.66所示。其文件布局中有许多文件夹,如App、HAL、MAC等,这些文件夹对应着ZigBee协议中不同的层,使用ZigBee协议栈进行应用程序的开发一般只需要修改App目录下的文件即可。
图2.66 SampleApp工程文件布局示意图
(1)App应用层目录(Application Programming Interface,API)
当要创建另外一个新项目时,也只需要主要换掉目录里的文件。一般我们都是在App应用层目录下编写自己的应用程序源代码。本次实验也是在该目录之下编写SampleApp的源代码,如图2.67所示。
图2.67 App应用层目录
(2)硬件层目录(Hardware Abstract Layer,HAL)
下层Commmon目录下的文件是公用文件,基本上与硬件无关,其中hal_assert.c是测试文件,用于调试;hal_drivers.c是驱动文件,抽象出与硬件无关的驱动函数,包含有与硬件相关的配置和驱动及操作函数。目录下主要包含各个硬件模块的头文件,而Include目录下的文件是跟硬件平台相关的。include硬件平台头文件包含层,Target 具体相关平台的硬件驱动可能看到有两个平台,分别是CC2530DB平台和CC2530EB平台。后面的DB和EB表示的是TI公司开发板的型号,其实还有一种类型是BB的。BB(Battery Board)、 DB(Development Board)和EB(Evaluation Board)分别对应TI公司开发的3种板型,其功能按以上顺序依次变强。参看“Z-Stack User's Guide for CC2530”的图片可以获得更直观的认识,如图2.68所示。
图2.68 HAL应用层目录
Target 下主要包含CC2530具体硬件平台,其相关文件如图2.69所示。
图2.69 Target具体硬件目录
(3)介质访问控制层(Media Access Control,MAC)
MAC层分为High Level和Low Level两个目录表示MAC层的高层和底层,如图2.70所示。Include目录下包含MAC层的参数配置文件及基MAC的LIB库函数接口文件,这里MAC层的协议是不开源的,以库的形式给出。
图2.70 MAC层的高层与底层
在Low Level层又分为Common层与System层,其中System层包含对硬件的操作,如图2.71所示。
图2.71 Low Level的System层
(4)监控调试层目录(MonitorTest,MT)
该目录下的文件主要用于调试目的,即实现通过串口调试各层,与各层进行直接交互,如图2.72所示。
图2.72 MT层
(5)网络层目录(Network Layer,NWK)
网络层配置参数文件、网络层库的函数接口文件,及APS层库的函数接口,如图2.73所示。
图2.73 NWK层
(6)协议栈的操作系统(Operating System Abstraction Layer,OSAL)
该层主要是Z-Stack 协议栈的操作系统对硬件的管理和封装,如图2.74所示。
图2.74 OSAL操作系统
(7)应用框架层目录(Application Farmework,AF)
Profile文件夹下包含AF层处理函数接口文件,例如,开发常用到的数据的收、发及终端管理等函数。AF层处理函数接口文件如图2.75所示。
(8)安全层目录
Security文件夹下包含安全层处理函数接口文件,如图2.76所示。
图2.75 AF层处理函数接口文件
图2.76 安全层处理函数接口文件
(9)ZigBee和802.15.4设备的地址处理函数目录
Services文件包括地址模式的定义及地址处理函数,如图2.77所示。
(10)工程配置目录
Tools文件包括空间划分及Z-Stack相关配置信息,其目录下的文件如图2.78所示。
图2.77 Services文件包含的处理函数接口文件
图2.78 Tools文件包含的目录文件
注意:灰色表示在当前工作空间(workspace)中不参加编译。其设置方法是选择相应的文件,然后单击鼠标右键,选择“Options”出现如图2.79所示的界面,勾选“Exclude form build”。
(11)ZigBee设备对象(ZigBee Device Objects,ZDO)
它是一种公共的功能集,方便用户用自定义的对象调用APS子层的服务和NWK层的服务,其目录下的文件如图2.80所示。
图2.79 不参与编译设置
(12)Z-Stack MAC移植层目录(Z-Stack MAC,ZMAC)
它提供了Z-Stack中关于MAC操作的接口函数;zmzc.c是Z-Stack MAC层导出层接口文件,zmac_cb.c是ZMAC需要调用的网络层函数,相关文件如图2.81所示。
图2.80 ZDO文件包含的服务
图2.81 ZMac 层相关文件
(13)ZigBee协议栈的主程序(ZigBee Main,ZMain)
ZMain.c主要包含了整个项目的入口函数main(),在OnBoard.c中包含对硬件开发平台各类外设进行控制的接口函数,如图2.82所示。
(14)输出文件目录
Output文件是IDE自动生成的。协议栈提供EndDeviceEB(终端设备)、CoordinatorEB(协调器设备)和RouterEB(路由设备)3种设备工作空间,如图2.83所示。
图2.82 ZMain 层相关文件
图2.83 创建不同设备的工作空间
使用IAR打开工程文件SampleApp.eww后,即可查看到整个协议栈从HAL层到APP层的文件夹分布。该协议栈可以实现复杂的网络链接,在协调器节点中实现对路由表和绑定表的非易失性存储,因此网络具有一定的记忆功能。
协议栈布局窗口中出现“*”只表示文件没有保存,文件保存后就不会出现“*”标记。
2.4.3 协议栈的移除和增加文件
ZigBee协议栈实现了ZigBee协议,该协议栈为用户提供了API函数接口,在开发过程中用户不必去关心ZigBee协议是怎么实现的,只需关心程序的数据从哪里来然后到哪里去。
下面以SampleApp.eww为例讲解在APP文件夹下如何移除和增加文件。
我们先进行协调器的编程,鼠标右键单击“SampleApp.c”,在弹出的下拉菜单中选择“Remove”即可,然后以同样的方法删除SampleApp.h,如图2.84所示。
图2.84 移除文件操作示意图
单击“File”,在弹出的下拉菜单中选择“New”,再选择“File”,并文件,并将文件保存为“Coordnator.c”,然后以同样的方法建立一个“Coordnator.h”文件。
最后,将Coordnator.c和Coordnator.h添加到工程中,方法是右键单击App,在弹出的下拉菜单中选择“Add”,然后选择“Add Files”,添加完这个文件后,SampleApp工程文件布局如图2.85所示。
图2.85 添加完文件的SampleApp工程文件布局示意图
可见,Coordinator.c和Coordinator.h还是空白的。
2.4.4 协议栈的基本操作
(1)查看函数或者宏定义
我们知道,Z-Stack是TI公司提供的半开放的ZigBee协议栈,而这个协议栈对于我们开发使用者来说一般只要关心APP文件夹下的文件即可。我们自己写的驱动等文件也是挂载到这个文件目录下的,APP文件下的主执行文件,需要关注的就是SampleApp.c或者Enddevice.c文件及ZMain.c文件,ZMain.c就是初始化功能了。而SampleApp.c或者Enddevice.c文件里面就包含了我们用户要做的事情。
打开OSALSampleApp.c文件找到SampleApp_ProcessEvent定义的宏,它规定了SampleApp事件。我们要查找一个函数或者宏定义的出处时,可以先选择要查找的内容,弹出如图2.86所示的内容,选择“Go to definition of ...”就可以直接找到定义之处了。
图2.86 查看函数定义的源程序
函数定义代码具体如下。
/*********************************************************************
* @fn SampleApp_ProcessEvent
*
* @brief Generic Application Task event processor. This function
* is called to process all events for the task. Events
* include timers, messages and any other user defined events.
*
* @param task_id - The OSAL assigned task ID.
* @param events - events to process. This is a bit map and can
* contain more than one event.
*
* @return none
*/
uint16 SampleApp_ProcessEvent(uint8 task_id, uint16 events)
{
afIncomingMSGPacket_t *MSGpkt;
(void)task_id; // Intentionally unreferenced parameter
if (events & SYS_EVENT_MSG)
{
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(SampleApp_TaskID);
while (MSGpkt)
{
switch (MSGpkt->hdr.event)
{
// Received when a key is pressed
case KEY_CHANGE:
SampleApp_HandleKeys(((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys);
break;
// Received when a messages is received (OTA) for this endpoint
case AF_INCOMING_MSG_CMD:
SampleApp_MessageMSGCB(MSGpkt);
break;
// Received whenever the device changes state in the network
case ZDO_STATE_CHANGE:
SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
if ((SampleApp_NwkState == DEV_ZB_COORD)
|| (SampleApp_NwkState == DEV_ROUTER)
|| (SampleApp_NwkState == DEV_END_DEVICE))
{
// Start sending the periodic message in a regular interval.
osal_start_timerEx(SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT);
}
else
{
// Device is no longer in the network
}
break;
default:
break;
}
(2)信道选择和修改网络ID号
展开工程目录下面的Tools目录,如图2.87所示。
图2.87 配置文件
f8w2530.cxl:该文件包含了CC2530单片机的链接控制指令,包括堆栈的大小、内存分配等,一般情况下我们不需要修改。
f8wConfig.cfg:该文件包含了信道选择、网络ID号等有关的链接命令。例如,我们的信道默认为-DDEFAULT_CHANLIST=0x00000800 // 11 - 0x0B,建立网络ID的默认ID为-DZDAPP_CONFIG_PAN_ID=0xFFFF,所以我们要建立不同的网络信道及网络ID的时候就可以在这里修改。
f8wCoord.cfg:配置无线网络中的协调器设备类型及CPU的运行频率。例如,下面的代码就定义了该设备具有协调器和路由器的功能。
/* Coordinator Settings */
-DZDO_COORDINATOR // Coordinator Functions
-DRTR_NWK // Router Functions
注意:协调器是建立网络的设备,在网络建立好以后,其实它在上位机与终端节点之间也是起到路由的作用了。
f8wEndev.cfg:配置无线网络中的终端节点CPU的运行频率及MAC设定。
f8wRouter.cfg:配置无线网络中的路由设备的CPU运行频率、MAC设定、路由设定等。
(3)设置ZigBee网络的拓扑结构
在ZigBee协议栈的NWK目录中的 nwk_globals.h文件中,找到NWK_MODE的设置模式,如图2.88所示。
图2.88 设置网络的拓扑结构示意图
将NWK_MODE_MESH改成NWK_MODE_STAR(NWK_MODE_MESH为网状网、NWK_MODE_STAR为星型网、NWK_MODE_TREE为树状网,这里设置为最简单、最稳定的星型网)。
项目小结
(1)ZigBee是一种短距离的无线通信技术,其应用系统由硬件和软件组成。
(2)单片机按照CPU处理数据的位宽可分为4位、8位、16位和32位机。其中,8位单片机由于内部构造简单、体格小、成本低等优势,应用最为广泛;4位单片机主要应用于工业控制领域,随着工艺的发展,由于性能较低,逐步退出市场;而16位和32位单片机主要应用于视频采集、图形处理等方面。
(3)CC2530芯片系列中使用的8051CPU内核是一个单周期的8051兼容内核。它有3种不同的内存访问总线:特殊功能寄存器(SFR)、数据(DATA)和代码/外部数据(CODE/XDATA)。
(4)常见的ZigBee协议栈分为非开源的协议栈、半开源的协议栈和开源的协议栈3种。
主要概念
片上系统、CC2530、半开源的协议栈、中断。
实训项目
任务 无线点灯网络部署
[任务目标]
(1)熟悉IAR Embedded Workbench IDE 开发环境的使用。
(2)熟悉ZigBee射频板的硬件设备以及相应的封装函数。
(3)熟悉基于IEEE 802.15.4协议的Basic RF网络部署,实现点对点传输功能。
[内容与要求]
(1)熟悉ZigBee射频板的硬件设备以及相应的封装函数。
(2)熟悉基于IEEE 802.15.4协议的Basic RF网络部署,实现点对点传输功能。
实训考核
任务 组网成功点灯实验
考核要素 | 评价标准 | 分值 (分) | 评分(分) | ||||
---|---|---|---|---|---|---|---|
自评(10%) | 小组(10%) | 教师(80%) | 专家(0%) | 小计(100%) | |||
熟悉ZigBee射频板的硬件设备以及相应的封装函数 | ① 熟悉ZigBee射频板的硬件设备以及相应的封装函数,实现点灯 | 40 | |||||
Basic RF网络部署 | ② Basic RF网络部署,理解协议栈 | 30 | |||||
分析总结 | 30 | ||||||
合计 | |||||||
评语(主要是建议) |
实训参考
任务 无线点灯部署
一、实验设备
实 验 设 备 |
数量 |
备 注 |
---|---|---|
ZigBee Debugger仿真器 |
1 |
下载和调试程序 |
CC2530节点 |
2 |
调试程序 |
USB线 |
2 |
连接PC机、网关板、调试器 |
RS232串口连接线 |
1 |
调试程序 |
SmartRF Flash Programmer软件 |
1 |
烧写物理地址软件 |
电源 |
5 |
供电 |
Z-Stack-CC2530-2.3.0-1.4.0 |
1 |
协议栈软件 |
LCD显示屏模块 |
2 |
可选 |
CC2530 BasicRF.rar |
1 |
BasicRF源代码 |
二、实验基础
注意:本次实验是脱离Z-Stack协议栈,而实现简单的点对点传输通信的。本次实验不区分协调器、路由器、终端节点,只是将设备简单地视为“开关”Switch与“灯”Light。
1.IEEE 802.15.4与ZigBee的关系
ZigBee是建立在802.15.4标准之上,它确定了可以在不同制造商之间共享的应用纲要。IEEE802.15.4是美国电子电机工程师学会(Institute of Electrical and Electronics Engineers,IEEE)确定的低速率、无线个域网标准。
2.Basic RF
Basic RF是由TI公司提供的,它包含了IEEE 802.15.4标准的数据包的收发。这个协议只是用来演示无线设备是如何进行数据传输的,不包含完整功能的协议。但是它采用了与802.15.4 MAC兼容的数据包结构及ACK包结构,其功能限值如下。
① 不提供“多跳”“设备扫描”及Beacon。
② 不提供不同种的网络设备,如协调器、路由器等。所有节点同级,只实现点对点传输。
③ 传输时会等待信道空闲,但不按802.15.4 CSMA-CA要求进行两次CCA检测。
④ 不重传数据。
Basic RF软件文件夹架构如图2.89所示。
docs文件夹:文件夹里面仅有一个名为CC2530_Software_Examples的PDF文档,文档的主要内容是介绍Basic RF的特点、结构及使用,如果读者有TI的开发板的话阅读这个文档就可以做Basic RF里面的实验了,从中我们可以知道,里面Basic RF包含3个实验例程:无线点灯、传输质量检测、谱分析应用。
Ide文件夹:打开文件夹后会有3个文件夹及1个cc2530_sw_examples.eww工程,其中这个工程是上面提及的3个实验例程工程的集合,当然也包含了我们无线点灯的实验工程。在IAR环境中打开,在workspace看到以下文件夹。
Ide\Settings文件夹:是在每个基础实验的文件夹里面都会有的,它主要保存有读者自己的IAR环境里面的设置。
Ide\srf05_CC2530文件夹:里面放有 3 个工程,即light_switch.eww、per_test.eww和spectrum_analyzer.eww。如果读者不习惯几个工程集合在一起看,也可以在这里直接打开想要用的实验工程。
source文件夹:文件夹里有apps文件夹和components文件夹。
Source\apps文件夹:存放BasicRF 3个实验的应用实现的源代码。
Source\components文件夹:包含着Basic RF的应用程序使用不同组件的源代码。
Basic RF的软件框架如图2.90所示。
图2.89 BasicRF软件文件夹架构
Hardware层:对应物理实体,放在底层,是实现数据传输的基础。
HardwareAbstraction层:对应hal_rf.c,它提供了一种接口来访问TIMER、GPIO、UART、ADC等,这些接口都通过相应的函数进行实现。
Basic RF层:对应basic_rf.c,它为双向无线传输提供一种简单的协议。
Application层:对应light_switch.c,是用户应用层,它相当于使用Basic RF层和HAL的接口,也就是说我们通过Application 层就可以使用封装好的Basic RF层和HAL函数了。
图2.90 BasicRF的软件框架示意图
3.实验中的重要函数
(1)无线数据的组网建立
在basic_rf.h代码中可以找到basicRfCfg_t的数据结构体,该结构体定义如下。
typedefstruct {
uint16 myAddr; //16位的短地址(就是节点的地址)
uint16 panId; //节点的PANID
uint8 channel; //RF通道(必须在11~26)
uint8 ackRequest; //目标确认就置true
#ifdef SECURITY_CCM //是否加密,预定义里取消了加密
uint8*securityKey;
uint8*securityNonce;
#endif
} basicRfCfg_t;
想要在两个设备之间建立通信就得使用该结构体创建变量,并对其初始化指定节点自己的地址,以及通信之间的网络标识等(PANID)、通信信道(Communication Channel)和目标确认(Ask in request)。
(2)无线数据的发送
创建一个buffer,把payload放入其中。Payload最大允许位为103个字节。然后调用basicRfSendPacket()函数发送,其返回值为发送多少字节数,在basic_rf.c中可以找到。
uint8 basicRfSendPacket(uint16 destAddr, uint8* pPayload, uint8 length)
destAddr:目的短地址。
pPayload:指向发送缓冲区的指针。
length:发送数据长度。
(3)无线数据的接收
上层通过basicRfPacketIsReady()函数来检查是否收到一个新数据包。该函数在basic_rf.c中可以找到。
uint8 basicRfPacketIsReady(void)。调用basicRfReceive()函数,把收到的数据复制到pRxData中。代码可以在basic_rf.c中可以找到。
uint8basicRfReceive(uint8* pRxData, uint8 len, int16* pRssi)
pRxData:接收数据存放的缓冲区。
len:收到的数据长度。
pRssi:信号强度。
4.Basic_rf的工作过程
整个过程的原理如下。
控制端:如果检测到有按钮按下,就发送数据。
受控端:如果检测到有数据来,就接收数据,改变led的灯开关状态。
Basic_rf的工作过程:启动、发射、接收。
(1)启动
首先在basic_rf.h文件中创建一个basicRfCfg_t的数据结构,并初始化其中的成员。接着调用basicRfInit()进行协议的初始化,在basic_rf.c代码中可以找到。
Uint8 basicRfInit(basicRfCfg_t*pRfConfig)。
函数功能:对basicRf的数据结构初始化,设置模块的传输通道、短地址和PAD ID。
(2)发送
创建一个buffer,把payload放入其中。Payload最大为103个字节。调用basicRfSendPacket()函数发送,并查看其返回值在basic_rf.c中可以找到。
uint8 basicRfSendPackeet(uint16 destAddr,uint8 *pPayload,uint8 length)
destAddr:表示目的地址。
pPayload:指向发送缓冲区的指针。
length:发送数据长度。
函数功能:给目的短地址发送指定长度的数据,发送成功则返回Success;失败则返回Failed。
(3)接收
上层通过basicRfPacketIsReady()函数来检查是否收到一个新数据包,在basic_rf.c中可以找到。
uint8 basicRfPacketIsReady(void)
函数功能:检查模块是否已经可以接收下一个数据,如果准备好则返回True。
调用basicRfReceive()函数,把收到的数据复制到buffer中。代码可以在basic_rf.c中可以找到。
uint8 basicRfReceive(uint8*pRxData,uint8 len,int16*pRssi)
函数功能:接收来自Basic RF层的数据包,并为所接收的数据和RSSI值配缓冲区。
Basic_rf的主要特点如下。
不会自动加入协议,也不会自动扫描其他节点,同时没有组网指示灯。
② 没有协议栈里面所说的协调器、路由器或者终端节点的区分,节点的地位都是相等的。
③ 没有自动重发的功能。
三、实验步骤
1.操作具体步骤
(1)创建BasicRF文件夹保存在\Texas Instruments\ZStack-CC2530-2.5.0\Projects\zstack\ GEC文件夹下。
(2)在BasicRF文件夹下创建CC2530DB与Source文件夹,如图2.91所示。其中CC2530DB用来存放工程信息,Source用来存放本次实验的源码。
图2.91 创建本实验相关文件夹
(3)将apps和components文件夹复制到上一步建立的Source文件夹下,如图2.92所示。
图2.92 复制源文件
(4)使用IAR Embeded Workbench IDE 创建新工程BasicRF并保存于第(2)步创建的CC2530DB目录下,如图2.93所示。
图2.93 创建并保存工程
(5)选择创建的工程BasicRF,使用鼠标右键菜单选择Add中的Add Group选项,输入想要添加的工作组文件夹名application,依次添加如图2.94所示的工作组文件夹。
图2.94 创建工作组文件夹
(6)在每个文件夹下添加第(3)步复制的apps和compoments下相应的源文件。有的需要在相应的文件夹下再添加工作组文件夹,方便相同性质的源代码文件归类和查看。application和basic rf 下文件如图2.95所示。
图2.95 application和basic rf 下的文件
Hal文件夹下的内容如图2.96所示,CC2530文件夹下的内容如图2.97所示。
图2.96 hal文件夹下的内容
图2.97 CC2530文件夹下的内容
Utilities文件夹下的内容如图2.98所示。
图2.98 utilities文件夹下的内容
(7)配置工程的工作空间。在Project菜单中选择Edit Configuration,新建一个文并将其件命名为light_swtich,如图2.99和图2.100所示。
图2.99 修改工作空间的名字1
图2.100 修改工作空间的名字2
(8)移除不需要的工作空间Debug 和Release,如图2.101所示。
注意:不能移除当前的工作空间。例如,当前选择的是light_switch工作空间,能移除Debug 和Release,但是不能移除light_swtich工作空间。
(9)保存当前空间于CC2530目录之下,并将其命名为light_swtich,如图2.102所示。
(10)配置工程参数。选择BasicRF中的light_switch文件,然后单击鼠标右键选中option选项,出现如图2.103所示的界面。
图2.101 移除不需要的工作空间
图2.102 保存工作空间
图2.103 工程参数配置界面
(11)在左边的选项卡中选择“General Option”,在右边的选项卡中选择“Target”。其中,在“Device”选项中选择 Texas Instruments文件夹下的CC2531F256.i51,选择之后效果如图2.104所示。其目录为C:\Program Files\IAR Systems\Embedded Workbench 6.0 Evaluation\ 8051\config\devices\Texas Instruments。
图2.104 配置芯片
(12)在左边的选项卡中选择“General Option”,在右边的选项卡中选择“Stack/Heap”。其中的“XDATA:”设置为1FF, 如图2.105所示。
图2.105 配置XDATA的大小
(13)在左边的选项卡中选择“C/C++Compiler”,在右边的选项卡中选择“Preprocessor”。指定编译时各文件所在的目录,如图2.106所示,其内容如下。
$PROJ_DIR$
$PROJ_DIR$\..\Source
$PROJ_DIR$\..\Source\apps
$PROJ_DIR$\..\Source\components\basicrf
$PROJ_DIR$\..\Source\components\common
$PROJ_DIR$\..\Source\components\common\cc8051
$PROJ_DIR$\..\Source\components\interface
$PROJ_DIR$\..\Source\components\rf
$PROJ_DIR$\..\Source\components\rf\cc2530
$PROJ_DIR$\..\Source\components\srf05_soc
$PROJ_DIR$\..\Source\components\utils
图2.106 指定预处理文件路径
(14) 在左边的选项卡中选择“Linker”,在右边的选项卡中选择“Config”。勾选“Override default”选项,如图2.107所示。其目录为C:\Program Files\IAR Systems\Embedded Workbench 6.0 Evaluation\8051\config\devices\Texas Instruments\lnk51ew_cc2531F256_banked.xcl。
图2.107 配置链接中的芯片
(15)在左边的选项卡中选择“Linker”,在右边的选项卡中选择“Output”。勾选“Override default”选项,并修改生成文件为BasicRF.hex,如图2.108所示。
注意:若需要生成SmartRF Flash Programmer能够下载的文件则勾选“Other”选项。
图2.108 配置编译生成文件
(16)在左边的选项卡中选择“Linker”,在右边的选项卡中选择“Extra Output”。勾选相应选项,如图2.109所示。
图2.109 配置额外输出文件
(17) 在左边的选项卡中选择“Linker”,在右边的选项卡中选择“List”。勾选相应选项, 如图2.110所示。
(18)在左边的选项卡中选择“Debugger”,在右边的选项卡中选择“Steup”。选择“Texas Instruments”,勾选“Override default”选项, 如图2.111所示。其目录为C:\Program Files\IAR Systems\Embedded Workbench 6.0 Evaluation\8051\config\devices\Texas Instruments\ioCC2531F256.ddf。
图2.110 配置链接规则
图2.111 配置调试选项
2.操作步骤
第一步找到下面内容,把appLight();注释掉,下载到发射模块。
appSwitch(); //节点为按键S1 P1_2
// appLight(); //节点为指示灯LED1 P1_0
第二步找到相同位置,把appSwitch();注释掉,下载到接收模块。
// appSwitch(); //节点为按键S1 P0_4
appLight(); //节点为指示灯LED1 P1_0
完成烧写后上电,按下发射模块的S1按键,可以看到接收模块的LED1被点亮。
3.实验运行效果
(1)将Light程序下载到ZigBee协调器的位置,作为“灯”重启,出现如图2.112所示的界面。
(2)在程序light_swtich.c中将appMode=LIGHT修改为appMode=SWTICH;编译下载到另外一个ZigBee协调器的位置,作为“开关”重启,出现如图2.113所示的界面。
图2.112 启动“灯”
图2.113 启动“开关”
(3)当出现如图4.113所示的界面时表示设备就绪,按下开关的S1键,这时“灯”的底板上LED2闪烁一下,LED1点亮,同时LCD上显示为“Light ON”,如图2.114所示。
(4)当打开灯时,再按下S1键,这时“灯”的底板LED2闪烁一下,LED1熄灭,同时LCD显示“Light Off”,如图2.115所示。
图2.114 点亮LED1
图2.115 关闭LED1
注意:在做以上实验时最好一组一组地打开ZigBee设备,不然自己的“灯”会被别人的“开关”控制。
用户不需要LCD显示数据,则可以选择C/C++ Compiler标签,在窗口右边选择Preprocessor标签,然后在Defined symbols下拉列表框中输入“HAL_LCD=FALSE”,这样在编译时就不编译与LCD相关的程序。因为单片机的存储器资源十分有限,所以才使用条件编译来控制不同的模块是否参与编译。
课后练习
一、选择题
(1)ZigBee无线传感器网络节点之间的无线通信一般不受( )因素的影响。
A.节点能量 B.障碍物 C.天气 D.时间
(2)( )不是物联网系统。
A.传感器模块 B.处理器模块 C.总线 D.无线通信模块
(3)对于ZigBee无线传感器网络与现有的无线自组织网络而言,( )是错误的。
A.传感器网络的节点数目更加庞大
B.传感器网络的节点更加容易出错
C.传感器网络的节点处理能力更强
D.传感器网络的节点的存储能力有限
(4)ZigBee传感器网络的频带,( )传输速率为20kb/s,适用于欧洲。
A.868MHz B.915MHz C.2.4GHz D.2.5GHz
(5)ZigBee传感器网络的频带,( )传输速率为40kb/s,适用于美国。
A.868MHz B.915MHz C.2.4GHz D.2.5GHz
(6)ZigBee传感器网络的频带,( )传输速率为40kb/s,适用于全球。
A.868MHz B.915MHz C.2.4GHz D.2.5GHz
(7)ZigBee网络设备( )发送网络信标、建立一个网络、管理网络节点、存储网络节点信息、寻找一对节点间的路由信息、不断地接收信息。
A.网络协调器 B.全功能设备(FFD)
C.精简功能设备(RFD) D.路由器
二、简答题
(1)简述ZigBee无线传感器网络拓扑结构有哪几种,各有什么优缺点。
(2)简述全功能设备和精简功能设备的区别,哪些设备属于全功能设备,哪些设备属于精简功能设备。