2.2.4接受数据流程
下面我们讨论如何接受数据,同样先给出时序图如图6,再解释流程。
①主MCU将TX_EN置高、TRX_CE置低,过650 us后,则进入接受模式。
②nRF905监控频道使用状况,如果发现频道被占用,则将CD置高,可以利用该特性采取一些冲突避免检测机制,发送数据前如果检测到CD信号,则可以随机延迟一段时间再发送数据,该特性可以有效地避免数据冲突。
③当接收到的数据发送地址和自己地址匹配时,则AM置高,通知该数据是发给自己的。
④对数据的CRC进行校验,如果正确,则去除包头和CRC段,将数据保存在接受数据寄存器RX_PAYLOAD,同时DR信号置高,通知主MCU读取数据。
⑤主MCU将TRX_CE置低,进入standby(省电)模式再通过SPI口将数据读出来,当数据都读完后,nRF905将AM和DR重新置低,为下次接受数据做准备。
接受数据流程图如图7所示。
图7接受数据流程图
如果需要将驱动移植到其它平台如ARM上,只要将接口重新定义,SPI读写函数做相应的调整,移植起来非常简单。
3 MAC算法实现
既然nRF9O5提供了这么多频道和跳频机制,如何充分利用这些特性,使通讯更加稳定呢?下面实现的是基于Ad Hoc网络的MAC协议。
3.1 MAC协议框架
如图8所示,频道被分成两类,控制频道和数据频道。而数据频道又被分成若干组,每组均有一个主数据频道和两个备用数据频道。正常通讯的时候,采用主数据频道,如果误码率高达一定程度,可以跳至备用数据频道继续通讯。
图8 协议架构
通常,各节点在控制频道处于接受状态,采用广播地址。Ad Hoc网络中各节点均以自己为中心,故各节点均维护着自己的“控制频道状态表”BroadStatus和“频道列表”Hoplist,两者分别记录了控制频道和数据频道的使用状况。结构分别如下所示:
struct
{
控制频道使用标志broad;
控制频道使用时间broadtime;
}BroadStatus;
struct
{
频道列表hoplist;
频道使用时间hoptime[n];
频道占用地址hopaddress[n][2];
}Hoplist
3.2 控制频道
控制频道用于各节点交换路由信息、握手信息等。由于握手信息和路由信息相对大块的数据信息而言很小,所以各节点占用控制频道的时间相对较少,这在很大程度上避免了控制频道上的数据冲突。但是由于控制频道为所有节点所共用,必须采用冲突避免协议,本文采用了IEE802.11b的CSMA/CA机制,即每次发送数据都要等到频道空闲,再用“二进制指数退避算法 随机延时一段时间,当延时时间到再发送数据,这样就有效地避免了同频道下的数据冲突。同时考虑到隐藏节点、暴露节点等问题,我们采用了RTS/CTS/BROAD机制,如果节点A需要
发送数据到节点B,则先发送RTS并携带自己的数据频道列表信息,节点B收到RTS后,对比自己的频道列表选择一个共用的空闲频道返回RTS,并跳人该频道等待数据的到来。节点A收到CTS后再携带使用频道信息发送BROAD,然后跳入数据频道开始与节点B进行数据通讯。而其他节点收到CTS、BROAD后及时登记频道列表信息,方便下次数据传输时直接查询,该信息会随着系统晶振不断更新,这样各节点所维护的频道都是当前频道使用的状况。
3.3 数据频道
与共用的控制频道不同,当双方节点都处于数据频道时相当于建立了专用通道,此时不用采取CSMA/CA机制,我们采用确认机制、重发机制和跳频机制来确保数据准确无误的传输。通讯流程基本采用DATA+ACK形式,即发送完DATA等待ACK,接受到DATA则发送ACK确认。如果
ACK不正确或没收到ACK则重发,如果该频道不能使用则进行跳频。跳频需要双方协调进行,具有一定的复杂性,这里具体解释一下跳频机制。
图9为发送端跳频示意图,当发送端受干扰,即发送端可以发送数据,但接受不到数据,当误码率高达上限时,发送端发送CHG并携带将跳至的频道值hop,然后跳人备用数据频道hop中,再发送CHECK,等待握手信息。而接受端收到CHG后,从中提取出hop信息,再跳至该hop,当接受到CHECK时,再发送验证信息CHECK。自此,收发双方握手完毕,接着在新的频道中继续通讯。
图10为接受端跳频示意图,当接受端受干扰或者收发双方都收到干扰,这时接受端收不到来自发送方的控制信息CHG,只能完全依靠误码率信息,此时同步尤为重要。由于双方误码率同时增加,当依次达到上限时,可以依次跳人备用频道继续通讯。由于存在重发和延时机制,双方并不需要同时跳入备用频道,系统具有一定的容错性。每个数据频道组有两个备用频道,如果三个频道都不能使用,则此次通讯就失败了。但是通常一定时间内干扰只在某个频段存在,只要将三个数据频道拉开一段频距,即可有效地抵制干扰。
4 总结
文中无线多点收发模块在MSP430和nRF905的基础上,实现了物理层驱动和基于Ad Hoc网络的MAC层协议,但没有提供网络层路由协议。物理层点对点通讯确保了数据传输的可靠性。MAC协议确保同时传输数据时避免冲突。在测试中,我们网络层采用鱼眼算法,用15个节点动态组网并互传信息,在该体制下信息可以同时发送相互之间没有干扰。该模块可以很好的运用在一些抄表系统、遥控系统、以及机器人控制中。