历史上的今天

今天是:2024年09月03日(星期二)

正在发生

2020年09月03日 | 基于CSMA/CA的MAC协议设计实现

发布者:神光骑士 来源: elecfans关键字:CSMA  MAC协议 手机看文章 扫描二维码
随时随地手机看文章

基于CSMA/CA的MAC协议的优势在于其简单和健壮性,适用于分布式网络,每个节点无需维持和动态更新周围相邻节点的状态信息,可以独自决定何时接入信道,只要上层有数据需要传输,MAC层就会对信道进行竞争,因此该协议的应用也相当广泛。嵌入式技术的发展对MAC协议的实现也提供了很好的技术支撑。本文搭建了一种基于ARM和FPGA相结合的嵌入式开发平台,并在此基础上设计与实现了基于CSMA/CA的MAC协议。由于ARM和FPGA本身就是可重构器件,同时将FPGA中的一些协议参数由ARM来设置,通过修改ARM的代码就可以实现对FPGA中协议功能的调整,方便快捷,不再需要重新生成比特文件下载,有利于MAC协议可重构的实现。


1 协议功能描述

1.1 报文结构

本设计实现的是基于CSMA/CA的MAC协议的基本访问模式,节点之间的通信只有数据帧(DATA)和应答确认帧(ACK)。图1给出了报文结构,其中ACK没有净数据部分。由于考虑的是一跳范围的无线通信,没有中继节点等,因此只有源节点号和目的节点号。

基于CSMA/CA的MAC协议设计实现

1.2 组网设计

本文设计的MAC协议除了满足基本的的物理载波侦听和虚拟载波侦听相结合检测信道忙闲的机制外,还包括帧间间隔、随机退避、应答确认和重传机制。


有数据要发送的节点会首先监听媒介,若为忙则继续等待,若空闲的时间超过或者等于DIFS或者EIFS则会进入退避进程。在执行退避进程过程中,节点将随机产生一个退避时间来设置退避定时器,同时继续监听媒介,若空闲时间达到了一个时隙时间,则退避定时器减去一个时隙时间,如果在期间媒介变为了忙,退避进程将挂起,直到媒介空闲时间再次达到DIFS或者EIFS后才会接着继续进行退避进程。当退避定时器变为0时,节点才允许开始发送数据,同时也会启动超时重传机制,如果在规定的时间内没有收到所希望的ACK,则会重传数据帧,当节点重传的次数超过了重传门限将会丢弃该数据帧,或者超过了数据帧最长允许的发送时间,也会丢弃该数据帧;当节点收到ACK时,就会开始准备下一次数据的发送。


接收节点收到正确且是发送给本节点的数据帧将会立刻回复源节点ACK。如果节点没有收到正确的数据帧,则将使用EIFS;如果收到正确的数据帧,但是不是给本节点的,节点将解析出持续时间,更新NAV,将信道视为已被占用。


1.3 功能划分

本设计充分利用ARM灵活便捷的优势,用来实现随机退避算法和协议参数的管理,如重传次数,帧间间隔的设置等。随机退避算法采用的是第i次退避就在2i个时隙中随机地选出一个值作为节点需要退避的值。协议参数的设置由ARM来完成,主要是考虑到FPGA不利于参数的修改,这样也可以增强协议的可重构性。而FPGA以其卓越的实时信号处理优点,用于管理MAC帧的收发控制等。

2 协议设计

MAC层的工作状态主要是由物理载波侦听和虚拟载波侦听共同决定的(即:MAC_flag=CS_flag or NAV_flag),当两者都显示为空闲时,MAC层才会进入发送数据帧状态。同时该协议也需要时钟计数参与其中,IFS_TIme是每个节点在进入退避进程前需要等待的时间,实现帧间间隔的功能;Backoff_TIme是每个节点在退避进程中退避的时间;NAV_TIme是没有在通信的节点预留信道的时间。这三个时间也关系着整个协议所处的状态。图2给出了具体的实现流程图,具体实现过程步骤如下:

基于CSMA/CA的MAC协议设计实现

(1)若MAC_flag为false时,表明信道空闲,此时进入(2);若MAC_flag为true,则说明现在信道已被占用,此时不管节点已经处于什么状态都会进入第七步,除了正在发送数据的节点,由于正在发送的节点是不可能监听信道的,而且也无法接收其他节点的数据,载波侦听机制在这种状态下是失效的,因此不会出现正在发送数据的节点从发送状态突然变为接收状态。

(2)执行帧间间隔进程,递减IFS_TIme大小,直到为0就进入(3)。IFS_time的初始值为DIFS。

(3)退避进程。退避时间的大小主要是由ARM提供,当节点经历了一个时隙时间,退避时隙数减1,但当节点没有完全经历一个时隙时间,退避时隙数就不会变化。退避进程结束后就会进入(4)。

(4)判断发送类型,设计中发送类型Tx_tpye的初始值为1。若Tx_tpye为0,则为节点发送ACK,根据接收到的数据帧中的源/目的节点号以及序列号等组装回复发送节点ACK,并初始化IFS_time和Backoff_time以备节点发送数据帧使用,同时设置NAV_flag为true,更新NAV_time的值,继续虚拟载波侦听,避免出现发送ACK的节点会优先占用信道的情况;若Tx_tpye不为0,则表明节点可以开始发送数据帧,转入(5)。

(5)发送数据帧前首先判断是否超过最大允许发送的时间,若超过了就丢弃该数据帧,将IFS_time设置为EIFS,Backof_time初始化,超时计时器停止;若没有超过最大允许发送时间,则节点正式发送数据帧,并启动单次超时计时,发送完毕后就等待ACK,此时进入(6)。

(6)在等待ACK到来的同时判断是否超时单次允许发送的时间,若超过了,则重传次数递加;然后判断是否超过重传门限,如果超过了门限,则丢弃该数据帧;如果没有超过,则将IFS_time设置为EIFS,而且还需要ARM的随机退避算法根据重传次数重新给一个退避时隙数,同时修改数据帧中的重传位以便接收节点识别。

(7)保存当前退避进程中的Backoff_time和刚刚结束的帧间间隔的大小IFS_time,接收MAC帧并解析其中相关的数据,为后续的组装ACK做准备,然后进入(8),同时将NAV_flag设置为true,保证MAC层能处理完数据。

(8)校验接收到的MAC帧是否正确,若不正确,则将IFS_time设置为EIFS,NAV_flag设置为false,NAV_time设置为0,这样节点就进入执行帧间间隔进程。若校验正确,则进入(9)。

(9)将FPGA解析出来的目的节点号与本节点的比较,判断是否是发送给本节点的。如果不是发送给本节点的,那么就再比较本节点现在的NAV_time值是否大于接收到的MAC帧内的NAV,若大于则本节点继续按照现有的NAV_time值执行下去;若小于接收到的MAC帧内的NAV,则使用MAC帧内的NAV来更新本节点的NAV_time值,然后以最新的NAV_time值递减下去直到为0,虚拟载波侦听显示空闲。但是在执行NAV_time递减过程中随时都有可能收到新MAC帧,而且也不是发送给本节点的,照样要执行本步骤,并不是等到NAV_time变为0后再更新。如果是发送给本节点的,则会进入(10)。

(10)若节点接收到的是数据帧。即Rx_type为1,FPGA将接收到的数据帧上传ARM;同时将IFS_time更新为SIFS,Backoff_time设置为0,这样使得接收到数据帧到发送ACK之间的时间间隔为SIFS,并将Tx_tpye设置为0,NAV_flag变为false,进入(2),开始准备发送ACK。如果Rx_type为0,则节点接收到的是ACK,说明一次数据收发过程结束,节点将初始化相关参数,计时停止等,FPGA释放空间,表明该数据帧已发送成功。


3 仿真验证

基于CSMA/CA的MAC协议的实现关键在于各个节点对各种情况的处理,因此对一个节点协议功能的仿真验证也能说明设计的正确性。本设计中FPGA部分的设计是重点,所以使用ModelSim进行仿真观察节点FPGA的处理过程。


3.1 信道竞争过程

基于CSMA/CA的MAC协议中各个节点也不知道自身周围的节点情况,因此节点竞争信道时随时都可能检测到信道已被占用。图3给出了节点在退避过程中检测到物理载波侦听变为忙,立刻停止退避进程,将此时的退避时隙数挂起,即退避时隙数保留为31。待到信道重新空闲超过帧间间隔DIFS后,将以保留的退避时隙数继续进行退避进程,变为0后开始发送数据帧。在图中还可以看到节点收到正确的ACK后,更新NAV的过程。从仿真图的执行流程可以说明所设计的MAC协议满足载波侦听机制、帧间间隔、随机退避的功能要求。

基于CSMA/CA的MAC协议设计实现

3.2 数据传输过程

从图4中可以观察到节点发送第一个数据帧后,超时计数器开始计时,但在规定时间内没有收到ACK,则重传数据帧,重传退避的时间是重新赋值的,并且帧间间隔不再是DIFS,而是EIFS;当节点接收到正确的ACK后,开始发送新的数据帧。说明了所设计的MAC协议能够实现确认重传机制。


4 结语

在以ARM和FPGA为主的硬件结构上,设计与实现了基于CSMA/CA的MAC协议,该协议具有载波侦听机制、随机退避、确认重传等功能。经过仿真测试,验证了所设计MAC协议的可行性。

关键字:CSMA  MAC协议 引用地址:基于CSMA/CA的MAC协议设计实现

上一篇:如何将Linux2.4移植到ARM平台的嵌入式系统
下一篇: 基于ARM微处理器和Linux的无线气象数据通信系统

推荐阅读

导读:8月31日,由集微网、中国半导体投资联盟、厦门半导体投资集团有限公司主办的第二届2018集微半导体峰会在厦门海沧隆重举行。本次峰会以“产业资本的风向标”为主题,与会人数达千人。从全国各地来参加本次峰会的企业超过350家、投资机构129家、全国近20个城市/开发区/高新区的领导,共同探讨中国集成电路产业的投资与发展大计。广升CEO孙荣卫先生受邀...
选取DMA1选取通道2SPI1USART3根据上面这些配置初始化,参考32例程。下面是我配置的SPI中断,我把它直接放在SPI初始化函数后面先中断初始化然后建立外设之间的连接void SPI1_IRQHandler(void)USART3->DR=SPI1->DR;再直接进行地址映射,把SPI1外设直接映射到USART3。使能SPI的DMA发送请求PI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE); 就会启动DMA主函数
虽然数字基础设施无法治愈冠状病毒疫情,但他们无疑在许多方面帮助世界应对这些挑战。越来越多的政府、企业、医疗机构,甚至教育部门都在利用物联网(IoT)和人工智能(AI)来自主应对疫情在全球蔓延的影响。本文盘点了六种IoT和AI能够帮助控制疫情的设备:可穿戴设备许多工作场所正在使用可穿戴设备来追踪和监测医务人员和病人的健康状况。接触追踪设备包...
9月3日消息,今日午间,中芯国际发布公告称,公司于9月2日与上海临港管委会签订合作框架协议,双方将成立合资公司,规划建设产能为10万片/月的12英寸晶圆代工生产线项目。中芯国际聚焦于提供28纳米及以上技术节点的集成电路晶圆代工与技术服务。公告显示,项目计划投资约88.7亿美元(约人民币573亿),该合资公司注册资本金拟为55亿美元,其中中芯国际拟出...

史海拾趣

问答坊 | AI 解惑

D类放大器设计实例

资料介绍: 采用开关方式实现低频功率放大(即D 类放大)是提高效率 http://www.cndzz.com/user/show/1444.htm…

查看全部问答∨

什么是PCA?

现在有很多单片机都有PCA功能,可以做定时用,输出PWM等,我不是很明白,有可能可帮我讲解一下吗?…

查看全部问答∨

液晶显示驱动横屏到竖屏的问题要点

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 液晶显示驱动横屏到竖屏的问题要点 一个液晶原来点阵是横屏的或者竖屏的,由于需要要将其换方向显示,那么如何去修改呢?前阵子我做了这方面的实验,有以下一些体会与大家讨论下. ...…

查看全部问答∨

DSP两层板关于3.3V和1.8V布线

DSP 如果两层布线的话,大家怎么处理,3.3V 和1.8V啊?还有这个地要怎么放置才比较好?…

查看全部问答∨

嵌入式学习方向

VxWorks  Linux  windowsCE   三个发展方向以及工作前景 请回答一下   谢谢 …

查看全部问答∨

如何向DM9000A网卡芯片的寄存器写值?在线等!

我正在看DM9000A网卡的驱动,遇到一段代码看不明白。请各位大侠帮忙,坚决给分。 UI32 FLASH_DATA = (0xbf000000 + 0x188102); UI32 FLASH_ADDR = (0xbf000000 + 0x100102); void dm_outb(unsigned char out_addr, unsigned char out_data)//o ...…

查看全部问答∨

请教关于交流电压数据采集模块的设计??急!!

    我要采集380V的交流电压,用的是TAV14型号的电压互感器,能把380V交流电压转化为-2.4V~+2.4V的小信号,然后放大两倍后直接传给AD574;      设计图如下图      大家帮我看下这样行不行 …

查看全部问答∨

d_buf的值是如何设置的?????

void handle(void) {    uint y;    if(f_d12)    {       if(!F_S1) isv=0;       else  isv=1;       if(!isv)    &nb ...…

查看全部问答∨

μC/OS-II讲座课件 ppt

分享一些资料,希望对大家有所帮助!! 其中有一个非常纯净、精简的ucos ii移植模板!!(已在lm3s8962上移植过) [ 本帖最后由 熊猫 于 2010-12-28 17:05 编辑 ]…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved