嵌入式操作系统TinyOS下的CC1100驱动程序设计
在无线传感器网络中,网络整体性能取决于节点上的通信模块。该文根据实际需要,在实现网络基本功能的前提下,选用功耗较小的CC1100芯片作为节点的无线收发单元。在分析CC1100功能特性并介绍嵌入式操作系统TinyOS的基础上,阐述如何使用NesC语言实现基于MSP430F1611平台的CC1100驱动程序。
1 概述 无线传感器网络(Wireless Sensor Network, WSN)是当前信息技术领域的热点研究方向之一,它综合了传感器技术、遥测技术、嵌入式计算技术、分布式信息处理技术和无线通信技术,是一种通过无线通信方式形成的多跳自组织网络系统。无线传感器网络由大量体积小、功耗低、具有无线通信、传感和数据处理功能的传感器节点组成。节点是无线传感器网络的基本单元,它一般由传感器模块(传感器、A/D转换器)、处理器模块(微处理器、存储器)、无线通信模块(无线收发器)和能量供应模块(电池)组成。 本文研发的无线传感器网络节点选用低功耗低成本单片收发芯片CC1100作为无线通信模块,将其通过SPI串行总线技术与MCU(MSP430F1611)相连。采用加州大学伯克利分校人员专门为无线传感器网络开发的嵌入式操作系统TinyOS作为软件平台。
2 设计需求分析 无线传感器网络由大量资源受限的节点组成。资源受限的特点决定了在选择无线收发芯片以及开发驱动时,必须满足低功耗,并实现收发分组的基本功能。节点对CC1100的主要功能要求如下:发送时把MCU递交过来的数据封装成帧并实现分组发送;接收时完成分组接收后把数据提取出来交给MCU.无线传感器网络中节点发送一个比特所消耗的能量约等于其处理器进行1 000次32位加法运算消耗的能量,因此,为了减少分组碰撞,降低因分组重发而消耗的能量,CC1100应实现发送数据之前的信道监听即载波监听功能。为了进一步降低能耗,节点在没有数据发送或接收时应置于休眠状态,并可以按指定方式激活,即具有休眠唤醒功能。具体设计需求如下: (1)收发分组。这是CC1100需要实现的主要功能,CC1100在发送数据前,要完成数据的分组封装,CC1100无线通信协议的分组格式如下: 其中,前导码是一连串的10101010?,其数量为8n个比特,n的大小由用户编程决定。同步字的内容和数量均可编程确定,长度为数据域的字节数,数据域内容为MCU递交的数据,CRC校验可以编程选择使用,灰色部分均可编程选择。 (2)载波监听。由于无线传感器中节点数量众多,节点密度大,如果不加控制就互相通信,必然会发生分组碰撞。为了减少碰撞机会,提高节点能量效率,本文通过CC1100的电平检测功能实现载波监听。CC1100提供了2种载波监听方式:绝对门限监听和相对门限监听。绝对门限监听是当信道电平超过某个指定数值时通知信道忙,相对门限监听是当信道电平增加量超过指定倍数(如6 dB)时,检测为信道忙。绝对门限监听需要大量信道特性统计来设置绝对门限电平值,相对门限监听方式可以避免上述工作且能适应时变噪声场合。在本文项目中采用相对门限来监听信道,效果很好。 (3)睡眠唤醒。由于无线传感器节点能量受限,因此在不必要的情况下,应尽量减少节点上硬件资源的活动时间,在多数情况下,无线模块应处于休眠状态。CC1100通过发送一个命令控制器可以关掉无线收发模块。类似地,发送一个唤醒命令控制器可以激活该模块。实现驱动时,笔者把上述命令封装在一个接口中,供上层调用。
3 硬件连接关系 节点上MCU与无线收发模块的硬件连接关系如图1所示。左侧是MCU,采用(TI)公司生产的超低功耗微处理器MSP430F1611,它是一个16 位、具有精简指令集(RISC)、超低功耗的混合型单片机,其片上集成了丰富的外围模块,包括看门狗、定时器、硬件乘法器、A/D转换器等,根据其运行打开的模块数目不同(即采用不同的工作模式),芯片的功耗有着显着差异,除了正常的活动模式外,它具有5种低功耗模式(LPM0~LPM4),在等待方式下,其电流仅为0.7 μA,在深睡眠情况下,最低电流仅为0.1 μA [2].右侧是无线收发模块CC1100,它是采用0.18 μm CMOS技术生产的低功耗多频段无线收发芯片,具有尺寸小、功耗低、灵敏度高、独立的64字节收发缓存(TXFIFO/ RXFIFO)、数字化接收信号强度输出(RSSI)等特点,并有前向纠错和数据白化等硬件处理模块。它还具有3个通用数字输出引脚GDOx(x=1~3),在实际应用时,可以通过寄存器配置让它们为上层实时提供信道或分组状态[3].在硬件平台上,CC1100的4个SPI通信管脚(SI, SO, SCLK, CSn)分别连接到相应MSP430F1611的4个SPI串行通信引脚,即MOSI, MISO, UCLK, MCLK上。通过这4根线,处理器可以对CC1100进行寄存器读写和功能配置。由于CC1100只是从机模式,因此处理器只能采用主机模式。另外,本项目采用了其中2个通用数字输出引脚GDO0和GDO2,分别用来实现分组发送指示和载波监听指示。
图1 CC1100与MSP430F1611的硬件连接关系 CC1100与MSP430F1611通信时,时钟源由MSP430F1611提供,经过配置处理器寄存器,本文采用其外围时钟模块的系统子时钟SMCLK.它们的通信方式为SPI串行通信方式。SPI通信是一种高速、全双工的同步总线通信技术,其硬件功能很强大,仅通过4个管脚,就可以在主机时钟源SCLK节拍的控制下,通过2个双向移位寄存器实现CC1100与MSP430F1611的串行数据交换。CSn引脚主要用来控制数据通信的同步性,在CC1100和MSP430F1611通信期间,要始终保证CSn引脚电平为低。
4 软件平台 TinyOS操作系统是目前无线传感器网络中应用较广泛的操作系统,它是UC Berkeley开发的源代码开放式操作系统,专门为无线传感网络设计。它基于组件的架构方式,可以快速实现各种应用。此外,其轻量级线程技术、事件驱动模式、主动消息通信技术等思想极大提高了节点的资源利用率[2].TinyOS环境下编程语言为NesC,NesC是对C语言的扩展,扩展的目的是将C的模块化思想与TinyOS的事件驱动机制结合起来。为了支持组件化编程模式,NesC语言引入了接口和组件的概念。接口是一系统功能类似或相关的函数声明,根据不同方向命名为命令或事件,具体实现在提供或使用该接口的组件中。组件包括配件和模块,配件负责把不同组件通过接口连接起来,模块提供程序所需的代码实现。组件中的接口是双向的,它给出使用者可以调用的命令或必须处理的事件。不同组件之间通过接口静态连接,以提高程序的运行效率,增加程序的鲁棒性。NesC的并发模型是基于"运行到结束"的任务实现的,程序运行任务时,硬件中断服务程序能抢占任务,且在中断服务程序中也可能出现其他中断服务程序来抢占的现象,甚至出现多级中断嵌套。但由于中断处理程序只做少量工作,会很快执行完毕,因此没有提交成功的任务不会被无限期挂起。
5 CC1100驱动实现 在TinyOS中,硬件抽象体系结构(Hardware Abstract Architecture, HAA)一般有3个不同的抽象层次,根据不同需要,可以灵活地实现不同芯片、不同平台、甚至不同系统间的程序调用。但考虑到代码数量、程序复杂度、节点资源等因素,在设计CC1100驱动程序时,需要借鉴TinyOS 3层抽象体系外,并兼顾节点存储能力和运算能力。 5.1 TinyOS中的硬件抽象体系结构 TinyOS 中的硬件抽象体系结构一般分为3层,如图2所示,分别为硬件表示层(HPL)、硬件抽象层(HAL)和硬件接口层(HIL)[4].通过对硬件平台进行不同层次的抽象,可以在系统开发中有区别地向上层屏蔽硬件特征,从而实现在不同程度上隔离上层组件和物理平台,便于程序移植。在功能上,硬件抽象组件相当于底层硬件的驱动程序,上层组件通过硬件抽象组件提供的接口进行调用。
图2 TinyOS 中的硬件抽象体系结构
在图2中,硬件表示层通过存储器或端口映射对硬件平台上某个模块(如通信模块、存储模块等)进行直接操作与控制,对上层屏蔽硬件特征,实现软/硬件的分离,从而实现该模块硬件功能的软件语言表达。硬件接口层在硬件抽象层的基础上实现对该硬件的功能操作,这是该体系结构的核心,通过调用该层接口,可以实现平台上某个模块提供的全部功能。硬件接口层是针对平台上不同芯片(如一个硬件平台上的2个通信模块CC1100和CC2420)的更高层次的抽象,它通过不同硬件抽象层提供的接口,把平台上不同芯片的组件封装成与底层组件芯片甚至硬件芯片无关的接口供高层调用,从而屏蔽不同芯片的差异,实现了兼容性较强的跨平台抽象体 系结构。
5.2 CC1100驱动体系结构 在设计驱动程序时,由于CC1100硬件功能强大并能够提供丰富的控制寄存器资源,通过对这些寄存器的配置可以实现基本功能,因此在设计时,笔者侧重于构建一个合理的组件层次结构,以便模块的修改与跨平台应用。在笔者开发的节点上只有一个通信模块CC1100,未涉及多个无线收发芯片,加上节点处理、存储能力的限制,在满足需求的前提下,本文只设计了TinyOS 硬件抽象体系3层中的下2层,从而达到缩减代码、节约能量的目的。CC1100驱动体系结构体系如图3所示。
图3 CC1100驱动体系结构 在图3中,硬件表示层配件HPLCC1100C向上层提供了3个接口:StdControl, Chipcon, CCFIFO,模块HPLCC1100M完成对CC1100直接控制和基本功能的软件表达,实现3个接口的全部命令执行代码。硬件抽象层配件CC1100RadioC向上层提供了4个接口:StdControl, PhyState, PhyPacket和CarriSns,模块CC1100RadioM包含了CC1100全部功能的软件实现。本文结合CC1100驱动体系结构,简要介绍其主要功能,即收发分组。 HAL层的CC1100RadioM模块是物理层组件结构的高层,该模块主要实现对分组的发送与接收、对无线发送模块的状态进行控制以及载波监听功能。其中,StdControl接口主要完成无线收发模块的初始化和CC1100的启动及停止;PhyState实现CC1100的各个工作状态的切换,包括无线模块的休眠和唤醒;PhyPacket实现分组的收发,高层组件可以直接调用该接口进行数据发送或接收;CarriSns用来为上层提供载波监听功能,通过硬件引脚电平情况来判断信道忙闲状态。上述接口只是相关命令或事件的声明,其真正实现在提供这些接口的模块,即CC1100RadioM中。 HPL层的HPLCC1100M()模块实现对无线通信模块的直接控制和软件表达,实质是对CC1100各个寄存器进行读写。该模块为整个硬件平台提供了SPI同步串行通信机制,向上层提供了StdControl, Chipcon, CCFIFO接口。其中,StdControl接口完成CC1100复位并初始化底层芯片,包括SPI通信时钟源选择、波特率设置、引脚输入输出方式以及无线收发模块的射频频率、调制方式、数据速率、信号检测方式等;Chipcon接口实现控制寄存器读写操作和命令控制器的发送,以实现对CC1100的配置和控制,其实现方式是SPI串行通信,CCFIFO主要完成TXFIFO和RXFIFO的数据连续读写操作,主要是在发送或接收数据时供CC1100RadioM调用。上述接口只是相关命令或事件的声明,其真正实现在提供这些接口的模块即HPLCC1100M中。 当上层组件把需要发送的数据递交下来,并调用CC1100RadioM组件提供的接口PhyPacket中的发送命令时,CC1100RadioM会先调用HPLCC1100M中CCFIFO接口提供的写FIFO命令把要发送的数据写入发送缓存TXFIFO中,笔者使用CC1100的连续读写方式来实现。然后发送命令控制器STX使能CC1100开始发送分组,并把CC1100状态切换到发送状态。本文使用了CC1100的通用数字输出引脚GDO2,通过适当配置,该引脚电平会在CC1100发送/接收完前导码时产生上升沿跳变,在整个分组发送/接收完成后产生下降沿跳变。可以通过查询GDO2引脚电平来判断分组是否写入完毕。当发送数据写完以后,CC1100会按第2节所述的分组格式对数据进行封装,上层组件通过查询GDO2引脚确定分组发送完毕后,根据需要再发送命令控制器把CC1100置于空闲或休眠状态。 接收分组时节点会先检测信道中的前导码,如果按指定方式检测到指定数量的前导码,CC1100的GDO2引脚电平会产生一个上升沿跳变,上层组件得知引脚跳变后,会把CC1100切换到接收状态并调用HPLCC1100M组件中的读取接收缓存RXFIFO命令,然后开始读取接收缓存,读取完CC1100接收缓存中的分组并把有用数据提取出来交给上层后,可以根据需要把它置于空闲或休眠状态。在程序实现过程中,为了节约节点能源,减少MSP430F1611的活动时间,笔者没有使用等待查询方式而采用硬件中断方式,即使用了GDO2引脚的电平跳变特点,当检测到前导码时,触发一个MSP430F1611端口中断,在中断服务程序中进行了读取接收缓存RXFIFO等操作,从而让MSP430F1611更多时间处于休眠状态,达到降低功耗的目的。
6 结束语 无线传感器网络节点能量受限的特点决定了本文选择和开发软硬件的思路及方法。出于低功耗考虑,笔者选择CC1100芯片,给出使用NesC语言在TinyOS环境下设计的基于SPI串行总线的CC1100驱动程序。程序在本文节点上的实际应用说明该程序实现了基于MSP430F1611平台的无线收发功能以及分组的正常收发。大量测试结果表明,节点运行稳定,具备载波监听、休眠唤醒等相关功能。
|