ZigBee技术是一种近距离、低复杂度、低功耗、低数据速率、低成本的双向无线通信技术,该技术基于IEEE 802.15.4标准,由成立于2001年8月的ZigBee联盟提出。2004年12月,ZigBee联盟制定了ZigBee SpecificationV1.0。至今ZigBee技术已经得到了广泛的发展和应用。目前,我国绝大部分的ZigBee硬件都是由国外厂商设计和生产的。早期的ZigBee硬件都是微控制器(MCU)和IEEE 802.15.4射频芯片分离的。随着片上系统(SoC)的出现,ZigBee硬件也发展到了在一个芯片内部集成了MCU和射频芯片,如Freescale公司的MC1321x,TI公司的CC243x,Ember公司的EM250以及Jennic公司的JN5121和JN5139等[1-2]。其中,Freescale公司的MC1321x降低了ZigBee开发者对硬件射频电路的要求,加速了ZigBee系统的开发,同时具有较高的稳定性和可靠性。
为了更好地推广应用ZigBee,本文对物理层协议及编程方法进行了深入研究。物理层是ZigBee的关键技术,完整的ZigBee协议包括应用层(APL)、网络层(NWK)、媒介接入控制层(MAC)和物理层(PHY)等。物理层通过操作底层硬件为上层提供服务接口,因此物理层的稳定可靠关系到整个协议栈的健壮性,是其他层设计的基础。
采用嵌入式构件化的设计方法,可提高物理层设计的可移植性和可重用性,目前很少有人做这方面的工作。本文采用射频片上系统(SoC)——MC13213设计了一个较通用的单芯片ZigBee硬件平台,分析和实现了ZigBee协议物理层,按照构件化的方法进行设计,并对构件进行了详细的测试,这不仅为基于物理层的简单应用提供了方法,而且为后续的MAC层的应用打下了基础。
1 ZigBee物理层功能概述
ZigBee工作在免申请的工业科学医疗频段。IEEE 802.15.4标准中定义了两个可用的物理层:基于2.4 GHz频段的“短距离”实现和基于868/915 MHz频段的“长距离”实现,两者都使用直接序列扩频(DSSS)技术。中国目前的ZigBee工作频段为2.4 GHz。
ZigBee物理层通过射频固件和射频硬件为MAC层和物理无线信道之间提供了服务接入点SAP(Service Access Point)。
IEEE 802.15.4定义的物理层参考模型如图1所示。其中PD-SAP(PHY Data Service Access Point)是物理层提供给MAC层的数据服务接口,PLME-SAP(Physical Layer Management Entity-Service Access Point)是物理层提供给MAC层的管理服务接口,RF-SAP是由底层无线射频驱动程序提供给物理层的接口。
物理层主要完成以下工作:激活和禁用射频收发器,对信道进行能量检测ED(Energy Detect),提供所接收数据包的链路质量指示LQI(Link Quality Indication),空闲信道评估CCA(Clear Channel Assessment),信道频率选择,数据发送和接收等。
2 MC13213单芯片ZigBee物理层编程结构
Freescale公司推出的单芯片ZigBee解决方案——MC13213采用SoC技术,在9 mm×9 mm的LGA封装内集成了HCS08 MCU和遵循IEEE 802.15.4标准的第二代无线射频收发器MC1320x[3-4] (后文中将用MCU和Modem分别代表MCU模块和射频收发器模块)。具有4 KB的RAM、60 KB的Flash,1个串行外设接口(SPI),2个异步串行通信接口(SCI),1个键盘中断模块(KBI),2个定时器/脉宽调制TPM(Timer/PWM)模块,1个8通道10位的模数转换器(ADC),以及多达32个的GPIO口等[5]。Modem内部已经集成了功率放大器PA(Power Amplifier)、低噪声放大器LNA(Low Noise Amplifier)和收/发开关(T/R switch),这在很大程度上降低了系统成本和射频电路的设计难度。
2.1 Modem与MCU的交互方式
Modem可以通过SPI接口、IRQ中断请求以及几个状态和控制信号与主控MCU实现交互,如图2所示。
SPI命令通道是Modem与MCU之间的主要交互方式,使用标准的4线SPI进行通信。MCU通过SPI命令结构可以读/写Modem的寄存器内容、设置Modem的初始化参数、读取Modem的状态和控制信息。IRQ中断为Modem提供了一种通知MCU有关Modem内部所发生事件的方法,这样就免除了MCU一直轮询Modem,降低了MCU的运行开销。ATTN用来把Modem从低功耗模式唤醒,RXTXEN用来允许Modem的发送、接收和CCA等操作。GPIO1引脚反映了Modem收发机是否忙,GPIO2引脚可以反映所接收数据包的循环冗余校验CRC(Cyclical Redundancy Check)是否有效或者反映CCA的结果[6]。
2.2 Modem的SPI事务操作
SPI事务是在标准SPI协议基础上实现的一个扩展SPI协议。由于Modem中的寄存器和RAM大小都配置为16 bit即一个字(word)的宽度,所以它规定了每次SPI事务过程必须由1 B的头(header)和2×N B的载荷(payload)组成,每个字节对应一个SPI脉冲(SPI burst),其中1≤N≤64,且为整数,代表每个SPI事务中所包含的字(word)数,当N=1时,称为SPI单次事务(SPI singular transaction);其他情况称为SPI循环事务(SPI recursive transaction)。header的最高位为R/W位,表示操作类型是读还是写;header的低6位是寄存器地址,表示了SPI操作的64个可能的寄存器地址(注意,有一部分寄存器没有实现)。
2.3 Modem的数据传输模式
Modem定义了两种数据传输模式:Stream模式和Packet模式。在Stream模式中,数据的发送和接收是逐字(word-by-word)处理的。而在Packet模式中,发送时,发送方先将待发送数据缓存在Modem的发送缓冲区(TX RAM)中,然后再发送;接收时,接收方先在接收缓冲区(RX RAM)中缓存收到的整个数据包,然后再通知MCU来读取。虽然Packet模式下数据的接收有稍许延迟,但其降低了对MCU的资源要求[7],在本协议栈实现过程中使用这种数据传输模式。
3 物理层构件设计
基于MC13213单芯片的ZigBee平台实现物理层协议构件程序的设计,首先必须编写底层硬件驱动程序,然后设置Modem的运行方式,再进行数据包收发程序的设计等。
3.1 底层硬件驱动程序的实现
硬件驱动程序介于底层硬件和ZigBee协议栈之间,可以使得运行于硬件之上的ZigBee协议栈更易于维护和移植。其中芯片初始化程序对MCU的一些硬件模块进行正确的配置,以保证MCU可以正常工作。这里所做的主要配置包括:关闭看门狗,设置内部时钟模块的校准(trim)值,配置MCU的时钟模块等。
初始化完成后会涉及到SPI循环事务的实现,下面以Packet模式下发送和接收3 B数据的完整过程来描述对Modem RX/TX RAM的SPI循环读写操作,如图3所示。其中,RX/TX RAM的长度为128 B。图中假定MCU均是以字节数组的形式来保存待发送或接收到的数据。