摘 要: 分析了ZigBee的特点,指出了以ARM-Linux嵌入式系统与CC2420组合作为ZigBee网络中的全功能节点的特有优势。阐述了芯片工作原理与硬件系统组成方式,并且给出了CC2420与ARM底层通信机制SPI驱动设计的方法,使得CC2420与系统间的数据交换得到保证,同时也是上层应用的基础。
关键词: ZigBee;CC2420;ARM-Linux;SPI驱动
随着信息技术的不断发展,无线传感网络逐渐得到认同与应用。无线传感网络是由大量传感器节点通过无线通信的方式形成的一个多跳的自组织网络系统,它包括基本的传感单元、处理单元、通信单元和电源部分。符合IEEE 802.15.4标准的ZigBee协议可以很好地支持网络中的传输需要,将其与嵌入式系统相结合,可以形成无线传感网的基本单元[1]。
ARM嵌入式系统作为当下最为流行的嵌入式系统,其在功耗、体积、可靠性与便携性方面都有很强的竞争力,而CC2420作为TI推出的符合2.4 GHz IEEE 802.15.4的射频收发器,为无线网络提供了良好的射频传输保证。在操作系统方面,嵌入式Linux系统凭借其开源性、稳定性等特点,成为众多嵌入式系统的优先选择。所以,将ARM-Linux嵌入式系统与CC2420芯片相结合作为网络中对硬件要求较高的具有完整功能的全功能设备,完全可以开发出基于ZigBee协议的无线传感网络,它同时具有低成本、低功耗、低复杂度、高性能、高通用性与移植性等诸多优势。
1 ZigBee协议的特点分析
ZigBee(紫蜂)是IEEE 802.15.4协议的兼容版本。IEEE 802.15.4协议是针对低速无线个人局域网设计的符合IEEE规范的官方标准,工作在2.4 GHz频段,最多支持16个传输速率为250 kb/s的信道。ZigBee是一种短距离、低功耗的无线通信技术,支持星形、簇形和网状三种拓扑结构,具有短距离、低功耗、自组织、低成本、低速率和低复杂度的特点。ZigBee的网络标准共分为4层,从上到下分别为应用层、网络层、多媒体访问控制层(MAC)和物理层。每一层为它的上一层提供数据与管理服务。其中,物理层和MAC层采用了IEEE 802.15.4标准,应用层和网络层则在此基础上进行了定制。
ZigBee标准的物理层规定了3个有效频段,分别是868 MHz、915 MHz和2.4 GHz。其中,在中国常用的2.4 GHz频段上采用直接序列扩频技术进行数据通信,从而提高了设备的抗干扰性。MAC层为传输提供可靠的数据通信链路与安全机制。在MAC层,不同的帧类型采用相同的结构,可以通过调用自定义的API函数构造不同的帧。网络层的主要功能是建立于管理网络,提供路由机制等。在应用层中,每个节点具有16位的网络地址和64位的IEEE地址,并且还有8位的应用层入口地址对应于应用对象。
相对于Wi-Fi、蓝牙等其他无线通信技术,ZigBee技术凭借其功耗和成本上的优势,越来越广泛地用于低速率、小范围的网络。
2 系统硬件原理
图1所示是系统硬件平台的架构示意图。S3C2440A是三星公司推出的以ARM920T为核心的32位高性能嵌入式处理器。它凭借高性能、低价格、低功耗等优势广泛应用于嵌入式系统中,并且可以稳定运行于Linux和Windows CE等诸多嵌入式操作系统。S3C2440A内置两组SPI总线,每组SPI拥有两个8位移位寄存器用于数据发送与接收。任意选取其中一组与CC2420连接即可完成微控制器与CC2420的数据传输[2]。
CC2420作为TI推出的首款符合ZigBee协议的射频芯片,可以与任何符合IEEE 802.15.4协议的设备实现无线互联。CC2420通过SPI接口(SCLK、CSn、SO和SI)配置为从机。SPI上所有的地址和数据都是高位优先发送。片选信号低有效,即当CSn变低时,意味着CC2420的新通信周期开始。
CC2420共有50个寄存器,分别为33个16位配置寄存器、15个命令选通寄存器和2个用来访问独立发送和接收FIFO的8位寄存器。每个寄存器都被编址为一个6 bit地址,与第7位的RAM/Register选择位和第6 bit的读写选择位一起构成一个8 bit地址。在每个寄存器读写周期中,共有24 bit数据被发送到SI上,包括8 bit地址和16 bit数据。在发送数据的同时,SO线上将返回8 bit状态用于调试。命令选通脉冲可以看作是CC2420的单字节指令,通过编址一个命令选通寄存器可以启动内部序列。这些命令可以用于使能晶振、使能接收、启动解码等。晶振必须被首先启动并且稳定后才可以接收其他命令。命令选通与寄存器读写相似,只是没有数据传输,在CSn有效的前提下,命令选通后可以继续其他SPI操作。
通过寄存器TXFIFO与RXFIFO可以存取发送FIFO和接收FIFO,且一次操作可以读取多个FIFO字节。SFLUSHTX命令可以激活TXFIFO,SFLUSHRX可以激活RXFIFO。
CC2420通过CCA、SDF、FIFO和FIFOP 4条信号将工作状态反馈给微控制器。CCA信号用于清除通道,在接收状态下,如果经过8个符号周期后,信道内仍然没有数据,则CCA信号激活;否则处于非激活状态。SDF信号用于提供时序信息。在发送过程中,当帧的起始分隔符被传送后,SDF信号会被激活;当整个数据包完成传送后,SDF信号立刻处于非激活状态。在接收过程中,当检测到有效的帧起始分隔符后,SDF信号激活;整个数据包接收完成后,该信号处于非激活状态。FIFO信号用于检测RXFIFO中是否有数据,当RXFIFO中存在至少一个数据时,FIFO信号处于激活状态,直到RXFIFO为空。当RXFIFO中存入的数据超过了可写入的阈值时,FIFOP信号会被激活,另外一种情况是,当一个完整的数据包被接收到后,该信号会被激活,而有一个数据包从FIFO中读出后,该信号将立刻处于非激活状态。如果地址识别被允许,FIFOP信号会一直保持在非激活状态直到被传入的帧通过了地址识别,否则,即使RXFIFO中的数据超越了阈值,FIFOP信号仍然不会被激活[3]。
3 底层通信机制的驱动设计
在Linux系统中,上层应用程序运行在用户空间,不能直接访问硬件,只有通过系统调用将其调用到内核空间,通过设备驱动程序才能把应用程序的需求传递给硬件。如图2所示。CC2420凭借SPI接口与微处理器进行通信,虽然某些2.6内核版本的Linux给出了SPI驱动程序,但是其针对性并不强,所以,为CC2420设计更为合适的SPI驱动更加有益于底层的通信,也更加利于开发和测试工作的进行[4,5]。
SPI驱动的设计主要包含读写两个操作。其中写操作用于将上层空间的数据发送给内核中的缓冲区,并控制主SPI将数据发送给CC2420;读操作将读取SPI接收到的内容,并将其发送到上层空间。每当SPI完成一次数据传输,都会向系统发起一次中断,中断由中断线进入并且中断CPU,从而通知内核,以调用相关的中断处理例程。
驱动程序内部采用环形缓冲区作为数据收发的缓冲结构,如图3所示。中断机制采用上半部与下半部的处理方式,上半部只负责响应中断,而繁琐的数据处理交由下半部完成,这样可以大大提高代码效率。驱动程序的下半部采用tasklet机制,tasklet是一种较为特殊的软中断,工作在中断上下文,并且有严格的顺序执行保障。另外,设计中采用了自旋锁机制,从而有效地防止了临界区的多重访问问题,提高了驱动程序的安全性。与此同时,休眠机制的成功引入避免了由于缓冲区覆盖所造成的数据丢失。
对于写操作,首先将所需发送的数据从上层空间拷贝到内核中的发送数据结构,然后获取禁止软中断但允许硬中断的自旋锁,进而调用写操作函数write将数据串行拷贝至相应的发送环形缓冲区中,最后将数据依次写入发送寄存器中,释放自旋锁,数据由硬件发送出去。图4所示为写操作基本流程图。但是,如果发送环形缓冲区不为空,程序处于发送过程中,并且不需要写临界区时,写进程就会被设计成休眠模式,休眠的进程将在下半部tasklet中被唤醒。在tasklet中,发送环形缓冲区的尾指针会不断自增,以表示数据正在被不断发送出去,直到缓冲区为空后,tasklet会唤醒之前睡眠的进程。
对于读操作,其流程大致与写操作类似,如图5所示。一旦SPI接收寄存器收到数据,系统就会产生中断,从而进入中断处理例程。tasklet将接收寄存器中的数据串行发送到接收环形缓冲区,缓冲区头指针自增,并唤醒进程。然后进程获得自旋锁,在判断所需读取的数据长度不超过缓冲区的最大长度后,将接收环形缓冲区的尾指针数据拷贝至内核的接收数据结构,然后尾指针自增。最后将数据拷贝至上层空间。
图6所示为测试结果波形图。从测试结果来看,在8个时钟周期内可以准确地发送8位二进制数0110_0110。完成底层通信机制SPI的驱动以后,只需要将CC2420注册设备、完成地址映射,再按照前面所述器件的工作原理发送相关命令与检测信号,就可以完成此系统的基本应用功能,从而拥有了作为ZigBee网络中重要节点的通信保证。另外,ARM嵌入式系统具有更强大的功能,在数据处理与网络接入方面有很好的性能支持,可以作为全功能设备节点的良好选择。
参考文献
[1] 蒋挺,赵成林.紫蜂技术及其应用[M].北京:北京邮电大学出版社,2007.
[2] SAMSUNG.S3C2440A user’s manual reltminary[EB/OL]. Revision0.14,2004.
[3] TI.CC2420_datasheet[EB/OL].(2004-06-09).Revision1.2,2007.
[4] 刘淼.嵌入式系统接口设计与Linux驱动程序开发[M].北京:北京航空航天大学出版社,2006.
[5] CORBET J,RUBINI A,GREG K H.Linux device drivers[M].Sebastopol:O’Reilly Media 2005:274-278.