无线传输系统中nRF2401芯片数据丢失问题的研究
2008-07-03
作者:郝卫亮
摘 要: 针对近距离无线传输系统中nRF2401芯片在实际应用" title="实际应用">实际应用中存在的数据丢失" title="数据丢失">数据丢失问题,提出一种对通信协议" title="通信协议">通信协议加以扩展的解决办法,并在用单片机与该芯片设计的实验电路上给予证明,给出了程序开发流程及硬件接口电路。实验结果分析表明,此方法可以有效解决数据丢失的问题,实现可靠的无线数据传输。
关键词: nRF2401芯片,无线传输,数据丢失
当前,近距离无线通信技术在越来越多的领域中得到应用,凡是布线繁杂或不允许布线的场合,如小型无线网络、门禁系统、工业数据采集系统、非接触RF智能卡等,都可以通过无线通信来满足需求。在大量出现的射频集成芯片中,由Nordic公司推出的无线收发一体芯片nRF2401,因其外围电路简单、通信速率高、通信质量稳定可靠、成本低、开发周期短等优点,在无线系统开发中得到广泛应用。但该芯片内部通信协议仅包含差错重传机制,而没有考虑实际应用中存在的数据丢失问题。本文用丢失重传机制对其通信协议进行了扩展,并在用C8051F236微控制器与nRF2401设计的简单通信电路上,对所提解决方案的正确性加以实验证明。
1 芯片工作原理
nRF2401工作原理可概括为:一个配置字、两种通信模式、两个通道和四种状态[1]。
一个配置字:nRF2401的各种参数,都由控制器通过一个3线接口(CLK、DR和DATA)写入一个单独的配置寄存器。该配置寄存器共144位,称为状态字。
两种通信模式:Direct Mode(直接模式)和ShockBurstTM Mode(突发模式" title="突发模式">突发模式)。直接模式的使用与其他传统射频收发器的原理一样,需要通过软件在发送端添加校验码和地址码,在接收端判断是否为本机地址,并检查数据是否传输正确。突发模式使用芯片内部的先入先出堆栈区,数据可从低速微控制器送入,高速发射出去,地址和校验码由硬件自动添加和删除。
两个通道:控制器与nRF2401通过由CLK、DR和DATA组成的两个通道交换传输数据,通道1(CLK1、DR1、DATA)可接收和发送数据,通道2(CLK2、DR2和DOUT2)只能接收数据,并且接收频道2的频率只有在比频道1高8MHz的情况下才能保证正确接收。
四种状态:分别为Active(RX/TX)(激活状态)、Configuration(配置状态)、Stand_by(等待状态)、Power down(掉电状态),通过3个引脚PWR_UP、CE、CS控制。
nRF2401工作时,首先置2401为配置状态,由控制器中写入状态字;而后,在激活状态下,使用状态字中指定的通道,进行数据收发,收发过程中进行交互时一方进入等待状态;如全部数据都传送完毕,则进入掉电状态。
2 RF协议扩展
nRF2401在其设计时,把多数单元如:频率合成器、晶体振荡器、调制器和数模转换器等都进行了集成,因而外围电路简单。其内部通信协议中的差错重传机制对发送的每个数据帧" title="数据帧">数据帧在接收方进行片内CRC校验,以保证接收数据的正确性。但在实际应用中[2],往往因为各种因素,如来自应用电路和外界的噪声干扰,或者元器件老化导致的信号衰减等,导致传输过程中的数据丢失。
为有效解决上述问题,可用丢失重传机制对其通信协议加以扩展,即由发送方对数据进行预封装处理。具体做法是:发方将待发送数据分组,计算出每组的CRC校验值,封装于预先定义好的包内,分若干帧发送出去。收方要对每次接收到的数据帧及发方定义的数据包进行两次CRC校验,通过帧CRC校验确认接收数据的正确性,通过包CRC校验判断是否发生数据包丢失。在丢失发生的情况下,收方有3次请求重传的机会,收发双方用ACK信号进行交互。
2.1 数据分组
将待发送数据进行分组时,要考虑两个因素:数据帧的格式及状态字设置。在突发传递模式下,nRF2401的数据帧格式如表1。
其中,帧头Pre-amble、收方地址address、crc分别占8、32、16位,由于突发模式下数据帧长度不能超过256位,所以数据部分Payload的最大长度是:256-(Pre-amble:8位+Address:32位+CRC:16位)=200位(25B),即每帧的payload部分可以为1~25B。下面的实验中,由状态字设置数据部分长度为20B。所以,对待传送数据分组时,每组长度取20B的整数倍。本系统按每组60B进行分组。其中,高58位为数据,两个低字节用于存放由58B数据计算出的CRC校验值。这样,每个数据包(组)分3个数据帧发送。
需要指出的是,在每次发送完一个数据封装包后,收发双方的交互要进行两次收发状态的转换,会占用数据传输的时间,但nRF2401有一个优势在于:它只需要改变配置字的最低位RXEN就可进行收发方式(RXEN=0 TX;RXEN=1 RX)转换,而不必重置整个配置字。每进行一次转换,需要控制器通过CE、CS引脚改变nRF2401的工作状态,由nRF2401的时序可知,会有两个最长5μs的延时,两次状态转换共有20μs的延时。由于实际应用中一次传输的数据量比较少,而且数据丢失发生的几率很小,所以不会对传输速度有太大的影响。
2.2 适用范围
不同的应用,需要一次性传输的数据量也不同,上述方法适用于传输数据量为KB以上的情况。为了减少发生数据丢失时重传的代价,当传输数据量少于KB时,可以按实际情况,调整状态字中设置的Payload段的长度,对数据进行灵活分组。例如:如果待传输数据为560B,可以设置Payload段的长度为10B,按每组30B封装,这样,所有数据分20个组,分60帧传送完毕。
另外,如果待传输数据量为100B左右,显然没有分组的必要,但为了保证不发生数据丢失,可以在封装时去掉CRC段,加一个1B的head字段,作为传输数据的序号,每个封装包用1个数据帧发送。接收端通过检查head字段,确定是否发生数据丢失。
3 实验设计
3.1 硬件设计
硬件实现电路如图1。由单片机C8051F236控制nRF2401进行数据传输。由于单片机与nRF2401的供电电压分别为1.9~3.6V和5V,设计中采用MAX232芯片进行电平转换。另外,在发送端和接收端采用几乎完全对称的设计。
将C8051F236的P2.5、P2.6、P2.7配置为通用I/O引脚[3],与nRF2401的CE、CS、PWR_UP连接,控制nRF2401的工作状态。系统上电时,首先置nRF2401为配置状态,写入状态字。随后置nRF2401为激活方式。P0.2-0.7也配置成通用I/O引脚,与nRF2401的CLK1、DR1、DATA(通道1)、CLK2、DR2、DOUT2(通道2)连接,进行数据收发。当需要发送数据时,单片机置CE为1,通过通道1将数据写入nRF2401,而后置CE为0,由nRF2401将数据发送出去。如果封装包的所有数据都发送完毕,切换到接收状态。接收方用两个通道同时接收数据。
3.2 软件设计
程序开始时对C8051F236及nRF2401状态字进行配置,随后进入激活方式。本系统状态字配置接收端值为:0x8E08.1CA0.A000.0000.00CC.0000.0000.CC23.CF41。配置后nRF2401每次发送的数据长度为160bit(20B),地址段长度32bit,通道1、2硬件地址0xCC,16位CRC校验段,以突发模式进行双通道接收,通信速率250Kbps,晶振频率16MHz,输出功率0dBm,工作频段2440~2448MHz,接收状态。发送端值为:0x8E08.1CA0.A000.0000.00CC.0000.0000.CC23.CF40,发送状态。
进入激活状态后,收发双方行为描述如下:
第一步:定义一个数据包结构,发方将待发送数据分组,计算出数据包CRC校验值,然后将数据封装、发送。发送完一个封装包(共60B)后,停止发送,切换到接收状态,等待ACK信号到来。收方接收完一个封装包后,切换到发送状态,同时计算接收到的数据包的CRC校验值,如果与包内的CRC值相符,则说明数据接收正确,收方置ACK值为0;如不一致,则说明发生数据包丢失,收方置ACK值为1。
第二步:收方发送ACK信号给发方,发方根据ACK值决定继续发送数据包(ACK=0)还是重新发送数据包(ACK=1)。
第三步:收发双方再次重新配置,继续数据传输。
第四步:在发生数据包丢失的情况下,收方对要求重发次数用count进行计数,如果三次重发请求所收到的数据仍不正确,则不再要求重发,切换到Stand_by状态。
软件流程图如图2。
数据包可定义为结构体:
Struct PACKAGE {
Char head;//1B数据序号(可选)
Char DATA[57];//58B数据
Char CRC[1];//2BCRC校验值
……
} package;
除收发程序外,收发双方对包封装、包检测及包的CRC值计算定义相应的函数。发方对数据分组时,如未发送数据不足60B,则在高位补0。
3.3 实验与结果分析
向单片机中载入程序后,nRF2401工作模式配置为双通道突发模式,控制程序采用C语言编写。用评估参数BLER(块错误),对实验中数据传输过程中的数据丢失情况进行评估:
BLER=丢失块数/传输的总块数
实验方案:在允许的距离范围(10~30米)内,分不同传输距离,分别发送1000个数据包,每个距离发送3次,BLER值取3次的平均值。为了进一步说明问题,首先以未扩展的协议进行收发,然后再以扩展协议进行收发,并分别记下相应BLER值。实验数据如表2。
由表2可知,进行协议扩展后,BLER值仅为0.0%~0.14%,这充分说明本文提出的协议扩展方法能够实现更加可靠的数据传输。实验时数据传输速度为120kbps,主要原因是受单片机读写速度的限制,更换高速单片机可提高传输速率。
本文用扩展协议的方法,解决了无线收发芯片nRF2401在实际应用中存在的数据丢失问题。实验结果表明,本文给出的方法可以有效提高nRF2401无线传输的可靠性,传输速率符合不同应用领域的要求,而且该方法具有通用性和灵活性的特点,可在nRF2401芯片的所有应用及其他无线通信系统中推广。
参考文献
[1] nRF2401 Datasheet Nordic VLSI ASA[EB/OL].http://www.nvlsi.no.2003,3.
[2] 王博,李迅,马宏绪.基于nRF2401的无线数据传输系统.电子工程师,2004,(8).
[3] C8051F2xx Datasheet.http://www.21icsearch.com/searchpdf/default.asp?.2004-2.