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均是以字节数组的形式来保存待发送或接收到的数据。
从图3可以看出,读/写RAM时的SPI通信是最高有效位优先(MSB-first)的,而在无线发送/接收过程中是最低有效位优先LSB-first(Least Significant Bit first)的,但在编写SPI循环读写操作时并不需要考虑上述两种顺序,也并不会导致接收方在接收发送方的数据时产生比特位顺序的改变。
需要特别注意的是,由于SPI事务要求所有的数据传输都是按16 bit宽度进行的,当发送数据是奇数个字节时,其最后一字节数据要进行特别处理,即需填充一个任意字节以凑满16 bit宽度,但是这个拼凑的字节和最后那个有效字节的发送顺序必须按照图3中的顺序进行,即先发填充字节,以保证在TX RAM中,最后一字节紧跟在前面的偶数个字节之后。而在最后一字节数据之前的偶数个字节数据由于是16 bit宽度的倍数,所以在发送每个字时对字节发送顺序没有特别要求,只要接收方和发送方按照同一种顺序收发各字节即可。
3.1.1 使用SPI循环写事务向TX RAM中写入待发送数据
执行这个操作之前,待发送数据长度应已经写入TX_Pkt_Control寄存器的tx_pkt_length[6:0]字段。
MCU向TX RAM中写入待发送数据的一般流程如下:
(1)根据需要配置TX_Pkt_Control寄存器的tx_ram2_select位,以选择使用两块TX RAM中的一块。
(2)计算写入待发送数据所需要的SPI脉冲个数,注意:
①CRC字节不需写入到TX RAM中,它是由硬件自动产生的;
②待发送数据的最大长度为125 B(去掉2 B的CRC);
③必须为偶数个字节,若数据长度为奇数个字节,应加1使其变为偶数。
(3)做一个SPI循环写事务来写入数据:
①MCU拉低SPI模块的片选信号CE,选中Modem;
②MCU向Modem发送第一个SPI脉冲,其中R/W位应为0,表示写操作;
③按照(2)中计算的SPI脉冲个数,写入待发送数据;
④MCU拉高CE,使片选失效;
(4)整个写操作结束。
3.1.2 使用SPI循环读事务读取RX RAM中的已接收数据
MCU读取RX RAM中的已接收数据的一般流程如下:
(1)MCU读Modem的RX_Status寄存器rx_pkt_latch[6:0]字段以获取数据长度。
(2)计算读取RX RAM中的已接收数据所需要的SPI脉冲个数:
①通常不读取2 B的CRC,所以数据长度应减去2;
②若数据长度为奇数个字节,应加1使其变为偶数;
③按照Modem SPI事务协议的规定,应丢弃读到的第一个字(word),因为在第一次读取时,内部RAM的地址还没有准备好,这样又导致了数据长度加2。
(3)做一个SPI循环读事务来读取数据:
①MCU拉低SPI模块的片选信号CE,选中Modem;
②MCU向Modem发送第一个SPI脉冲,其中R/W位应为1,表示读操作;
③按照(2)中计算的SPI脉冲个数读取所有数据。注意,协议规定应丢弃读到的第一个字(word)。当数据为奇数个字节时,应丢弃图3中的那个填充字节;
④MCU拉高CE,使片选失效。
(4)整个读操作结束。
3.2 设置Modem运行模式
Modem有多种运行模式,主要可分成两类:活动模式和低功耗模式。其中活动模式包括Idle模式、Receive(RX)模式、Transmit(TX)模式和CCA/ED模式;低功耗模式包括Off模式、Hibernate模式、Doze模式[8]。
Idle模式是Modem退出任何其他模式后的默认模式,也是进入任何其他模式的初始模式;RX、TX模式分别为Modem接收、发送数据时所处的工作模式;CCA/ED模式为空闲信道评估/能量检测时所处的工作模式,用来评估信道是否空闲或测量信道的当前能量值[8]。
收发机状态设置是通过调用设置收发状态函数实现的,其函数头如下:
//-----------------------------------------*
//功能: 设置收发机状态函数,把收发机设置成用户期望的状态
//参数: nDesiredStatus - 用户期望状态
//返回: SUCCESS - 成功设置成指定模式;
// 等于用户期望模式-收发机之前就处于用户期望状态;
// 其他 - 表示执行失败;
//说明: 无
//----------------------------------------*
INT8U PLMESetTRXState(INT8U nDesiredStatus);
3.3 物理层数据包的收发
物理层数据称为物理层数据单元PPDU(PHY Protocol Data Unit),包括同步包头、物理层包头和物理层载荷三部分[3],如图4所示。其中同步包头可以使得接收设备锁定在比特流上,并与比特流保持同步;物理层包头包含了数据包的长度信息,在0~127之间;物理层服务数据单元PSDU(PHY Service Data Unit)也称物理层载荷,携带MAC层的帧信息,即MAC层协议数据单元MPDU(MAC Protocol Data Unit)。注意,CRC检验字节包含在PSDU中的最后两字节中。
物理层数据包的发送和接收比较简单,对于MC13213的Modem来说,用户所要做的只是调用SPI循环事务写入或读取物理层包头和载荷,然后拉高RXTXEN引脚使能Modem的发送和接收即可。PPDU的同步包头是由硬件自动添加的。
(1)物理层数据包的发送
Packet模式下发送数据包的过程是在物理层数据请求函数中实现的,在函数实现过程中,应根据要求,向上层通知数据发送结果的状态信息。其函数头如下:
//------------------------------------------------*
//功能: 数据请求函数,生成物理层协议数据单元(PPDU)并无线发送出去
//参数: nPSDULength-物理层PSDU(即MAC层的MPDU)中的字节数,
// 长度要<=aMaxPHYPacketSize(物理层最大数据包容量)
// pPSDU - 指向物理层PSDU数据的指针
//返回: SUCCESS - 发送成功;其他值 - 发送失败
//说明: 由MAC层调用
//-----------------------------------------*
INT8U PDDataRequest(INT8U nPSDULength, INT8U *pPSDU);
(2)物理层数据包的接收
一般情况下,Modem的接收机是关闭的。当Modem接收机处于打开状态时有其他Modem在同一信道上发送数据,则Modem会接收到这些数据。
本协议栈实现Packet模式下接收数据包时,为物理层数据包实现了一个环形的接收缓冲区,以保证数据的及时可靠接收,其结构定义如下:
//PSDU最大数据包长度(不包括CRC)
#define PSDUMaxLen 125
//PSDU数据包定义
typedef struct PSDURxPacket_tag
{ INT8U m_nLen;
INT8U m_nData[PSDUMaxLen];
INT8U m_nStatus;
INT8U m_nLQI;
} PSDURxPacket_t;
//PSDU数据接收缓冲区个数
#define PSDURxBufferNum 8
//PSDU数据接收缓冲区定义
typedef struct PSDURxBuffer_tag
{ INT8U m_nPSDUCount;
INT8U m_nHead;
INT8U m_nTrail;
PSDURxPacket_t m_sPSDU[PSDURxBufferNum];
} PSDURxBuffer_t;
//定义PSDU环形接收缓冲区
static PSDURxBuffer_t s_sPSDURxBuffer;
3.4 其他编程相关说明
空闲信道评估(CCA)用来判断信道是否空闲。能量检测(ED)用来测量目标信道中接收信号的功率强度,由于这个检测本身不进行解码操作,所以检测结果是有效信号功率和噪声信号功率之和。另外,链路质量指示(LQI)提供了接收数据包时无线信号的强度和信道质量信息。与能量检测不同的是,LQI要对信号进行解码,生成的是一个信噪比指标。这个信噪比指标和物理层数据单元一起提交给上层处理。Modem中RX_Status寄存器的cca_final[7:0]字段保存了以上操作的结果值。
当Modem完成MCU指定的某个功能(如发送完成、接收完成、CCA/ED完成等),就会产生IRQ中断,然后MCU会读取Modem的IRQ状态寄存器,针对不同的IRQ中断类型分别进行处理。
物理层管理实体(PLME)维护了物理层正常工作所必须的一些属性参数,包括物理层支持的信道列表、当前用于发送和接收的信道、物理层的发射功率以及CCA模式4个属性。每个属性都有一个唯一的属性标识符,并且某些属性还有一些特定的取值范围。属性的读和写分别由属性设置和读取函数来实现,由于物理层的属性较少,直接通过switch/case语句实现即可。
4 物理层构件测试
按照前面分析的ZigBee物理层编程结构编写测试程序,可用于对物理层的构件功能进行测试。测试可先进行SPI单次读写事务测试,然后再进行数据包收发测试。
4.1 SPI单次读写事务的正确性测试
在对Modem的内部寄存器初始化之前,可利用SPI单次读事务获取Modem寄存器的内容,并通过串口输出显示与Modem寄存器的复位值对比是否一致。接着利用SPI单次写事务,对Modem进行初始化,初始化后,再把修改后的Modem寄存器的内容通过串口输出显示,与修改值比较,即可得出SPI写事务是否正确。
4.2 物理层数据包的收发测试
物理层数据包的收发测试需要一个发送节点和一个接收节点相互配合。对于能否正确收发需要测试两种情况,发送节点分别发送奇数个和偶数个字节的数据,看接收节点能否正确收到。这部分的测试是借助于串口调试工具来完成的,接收节点把收到的数据发往PC机串口显示。
物理层数据包收发的可靠性测试条件如下:一个发送节点和一个接收节点,二者相距5 m左右,其中发送节点每次发送长度为20 B的数据,并且数据中的最后2 B作为一个16 bit的整数,用来记录发送次数,每发送一次其值加1。发送节点何时开始发送数据由PC方测试软件控制,接收节点负责接收数据并发给PC端测试软件显示,通过比较发送字节数与接收字节数以及数据中的发送次数字段,可以得出数据丢失情况。所有的测试数据会写入后台的ACCESS数据库中,以供将来进行数据的统计分析。试验中测试的一组数据如表1所示,丢包率不超过0.1%。
本文研究了ZigBee协议物理层的SPI事务协议、Modem的工作模式等关键技术和编程方法,实现了基于单芯片ZigBee平台的构件化的底层硬件驱动程序和物理层数据包收发程序。测试表明,此硬件平台稳定可靠、实现容易,不但方便了其他研究人员学习和实践ZigBee技术,降低了研究ZigBee技术的门槛,还由于采用了单芯片设计和构件化设计方法,具有较高的可移植性和可重用性,使其很容易应用到实际项目中。同时为ZigBee协议栈后续其他层的研究和实现打下了基础,并为其他协议的应用研究提供了参考。
参考文献
[1] 刘新,吴秋峰.无线个域网技术及相关协议[J].计算机工程,2006,32(22):102-103.
[2] 吴光荣,章剑雄.ZigBee网络系统节点硬件设计与实现[J].杭州电子科技大学学报,2008,28(4):49-52.
[3] IEEE. Wireless Medium Access Control (MAC) and Physical Layer(PHY) specifications for low-rate wireless personal area networks[S]. IEEE Std 802.15.4-2006, September 2006.
[4] IEEE. Wireless medium access control(MAC) and physical layer(PHY) specifications for low-rate wireless personal area networks[S]. IEEE Std 802.15.4-2003, October 2003.
[5] ZigBee Alliance. ZigBee specification[EB/OL]. http://www.zigbee. org/en/spec-download, 2007.
[6] Freescale. MC13213: 2.4GHz RF transceiver and 8-bit MCU with 60K of flash for ZigBee applications[EB/OL]. http://www.freescale.com/webapp/sps/site/prod_summary. jsp?code=MC13213&nodeId=0106B9869925657103, 2009.
[7] Freescale. MC13224V: MC1322x platform in a package[EB/OL]. http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MC13224V&nodeId=0106B9869925657103, 2009.
[8] Freescale. MC13213RM. pdf[DB/OL]. http: //www. freescale. com/, 2009.