0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于mega128芯片实现TCP/IP协议栈的设计

电子设计 来源:电子设计应用 作者:项敏,王学军 2021-05-26 09:24 次阅读

对于嵌入式系统而言,考虑到TCP/IP协议的复杂性以及嵌入式系统自身资源的有限,对TCP/IP的实现并不是一件容易的事情。在一些特殊场合,比如要求实时性或者数据的安全性,实现TCP/IP协议时还需要特别加以考虑。下面以ATMEL公司的mega128芯片硬件平台,具体谈谈TCP/IP协议的实现。

ATmega128芯片的特点

Atmega128是ATMEL公司推出的一款基于AVR RISC结构的低功耗、高性能的8位微控制器芯片。通过在一个时钟周期内执行一条指令,Atmega128可以取得1MIPS/MHz的性能。此外,该芯片还具有比较丰富的片上资源。而最大可外扩的64K数据存储器可以使得有充裕的空间来处理以太数据包。

本方案只外扩32K RAM,剩余的高地址空间留给网卡芯片。网卡芯片主要功能是在物理层进行以太数据包的收发,以及在链路层进行信号的编/解码。本方案网卡芯片选用RTL8019AS,它是针对PC机的ISA总线设计的。

pIYBAGCto-WAaFaXAADICuZh-z0445.png

硬件接口电路设计

数据线与地址线均采用总线方式:8位数据线和16位地址线。PA口8位端口为复用AD端口,需要接一个地址锁存器。读数据时,D[0:7]数据直接送到Atmega128;写数据时,D[0:7]送到RTL8019AS。Atmega128与RTL8019AS同时复位,RESET端口经74HC04反相后接RTL8019AS的RSTDRV引脚。IOCS16脚的电平一直为低。8019采用8位数据总线宽度(高电平时为16位总线方式)。INT0中断脚经电平转换接到Atmega128的IRQ5。在程序中,以I/O方式访问RTL8019AS。MEMR、MEMW接高电平时关闭其MEMORY方式。

Atmega128对8019AS的驱动主要是通过操纵8019AS内部寄存器来完成的,这些寄存器映射在Atmega128的I/O端口上。因此,对8019AS的操作也既是对Atmega128的I/O端口操作。设计时可以将这些I/O地址定位到300H“31FH。由于Atmega128外扩了32K的RAM,所以这里存在片选的问题。考虑到网卡芯片8019AS地址线的高15位是固定不变的,可以利用Atmega128的地址线的最高位A15来进行片选:当A15=1时,选中8019AS;当A15=0时,选中24C256。

8019AS网络接口控制器提供了三种与系统主CPU的接口方式:跳线方式、PnP方式,以及RT方式。为了减少硬件资源,更直接地控制芯片,将8019AS的65脚“JP”接高电平,选择跳线方式。

o4YBAGCto9qAAeo6AAEMj7u9JT4141.png

软件模块的设计

网卡芯片8019AS的驱动

在具体设计实现TCP/IP协议栈之前,还要解决一个问题:对8019AS的驱动。从程序员的角度看,8019AS工作流程并不复杂。简而言之就是8019AS完成数据包和电信号之间的相互转换,以太网协议由芯片硬件自动完成。因此,驱动程序需要完成的任务主要是:芯片初始化、收包、发包。本方案在协议栈中通过设计三个子函数来分别完成上述三个任务,8019Init (void)、8019SendProc (unsigned char TaskNo)、8019 ReceiveProc(void)。

如前所述,对8019AS的操作实际上是通过操纵其内部寄存器以及DMA端口来实现的。因此在程序实现中,大量地出现了对8019AS内部寄存器的读写操作。所以可以定义2个带参数的宏来简化对8019AS的操作。reg表示8019AS内部寄存器的偏移量,date是将被写入的数据,如下所示:

#define? nic_read (reg)?????? *(base + (reg) )

#define? nic_write (reg, date)? *(base + (reg)) = date

TCP/IP协议栈的实现

TCP/IP协议族是一组不同层次上的多个协议的组合。根据协议的层次结构,本方案安排四个协议模块来分别实现TCP/IP协议的不同功能。即除了数据链路层(物理层)的程序模块,也即前面所述8019AS的驱动模块之外,还包括ARP层模块、IP层模块、ICMP层模块以及TCP层模块。当然,还可以多增加一个应用层的模块,例如HTTP模块。下面逐一介绍各个协议模块的功能。

ARP模块

ARP模块完成的主要功能是将一个IP地址与其物理地址关联起来。同时,为了提高网络传输速度和效率,避免在每次发送数据时都要发送ARP请求包来获得目的MAC地址,还要维护一个常用的ARP高速缓存。这些功能可以由两个函数来实现。ARPReceive Proc用于处理来自网络的ARP请求和ARP响应;ARPSendProc用于发送ARP请求包来寻找对应于IP地址的物理地址。

IP模块

IP协议的主要功能是使数据包可以分片发往任何网络,而且也能正确接收。分别由两个函数完成。IPReceiveProc负责处理收到的IP数据包,如果是一个分片的包,它还负责组装,最后根据IP包头字段的内容,将IP数据传递到上层协议模块;IPSendProc负责将上层送下来的、需要发送的数据包添加一个IP包头,然后重新封装起来发送下去。

ICMP模块

由于IP协议没有差错报告和差错纠正机制,ICMP协议与IP协议配合使用弥补了上述两个缺点。为了使实现的TCP/IP协议栈具备一定的差错诊断功能,ICMP模块实现了对回送请求消息产生一个回送应答。通过调用Ping命令就可以简单测试主机的可靠性。上述功能分别由ICMPReceiveProc和ICMPSendProc函数完成。

TCP模块

在本设计的协议栈中,通过一个有限状态机来实现TCP协议,用一个任务控制块(TCB)来记录客户和服务器的连接信息。虽然TCP协议是整个协议栈中最复杂的一个协议,但是对外面的接口还是只有两个:TCPReceiveProc和TCPSendProc函数。

TCP/IP协议栈的任务调度

通过对以上各层协议任务的分析,可以抽象出它们共同的特点。TCP/IP协议的每个模块只完成相应协议的任务,而任务通常只有两个:对底层送上来的数据包进行处理,以及将上层传下来的数据包再进行本层的封装,然后继续交下去。所以无论ARP、IP、ICMP、TCP哪一个协议,它们每一层对外都只有两个接口:收数据包、发数据包。

为了最大限度的模块化程序设计,便于日后的移植,可以采用面向对象的程序设计思路来具体实现TCP/IP协议。考虑到支持多用户以及多任务,首先在Atmega128的外部32K RAM内开辟若干个数据(任务)缓冲区,缓冲区的大小以能放入一个最大以太数据包为准,即1514个字节。以后需要处理的所有数据包都放在这些缓冲区内,各个缓冲区根据内部存入的不同类型数据包来设置缓冲区的标志。上面各协议层接口函数内的参数TaskNo就表示当前数据包所在的缓冲区号。

整个程序的处理流程如下:收数据时,8019AS不断将以太数据包从物理层收上来放入事先开辟好的任一个缓冲区内,作为一个待处理的任务,并根据数据包的包头信息标志此任务为ARP收任务或IP收任务。主程序扫描各个缓冲区,如发现有IP收数据包(任务)需要处理,于是根据任务的类型(IP收)调用相应处理进程IPReceiveProc()。处理完成后,将此数据包或任务根据包头信息重新标志为ICMP收或TCP收。主程序继续扫描,再次调用相应协议模块处理缓冲区内的任务如TCPReceiveProc(),直至将数据交到最上层的应用程序。发数据时,流程与收数据过程相反。

由于整个协议栈采用了模块化的设计,在具体使用的时候可以根据需要,很容易地加载相应的模块,完成相应的功能。比如可以按照同样的结构,再加载HTTP模块,在芯片内实现WEB SERVER。同样,在一些要求实时性的场合,由于发送的数据包是作为一个任务来管理的,因此可以很容易地给这些数据包(或任务)赋予一个较高的优先级,在进行任务调度时,优先处理这些任务。这样,在多用户情况下,对实时性也可以有一定改善。

结语

实现电子设备或者系统的网络化,使之具备网络功能,目前的解决方案通常有两种。除了直接在系统内部实现TCP/IP协议之外,还可以考虑使用专用芯片来完成单片机与网关间的协议转换。比如武汉力源公司开发的Webchip网络接口芯片PS-2000。但是专用芯片的使用,不但增加了系统的成本,而且不灵活。当然,如果在系统内部直接实现TCP/IP协议,也有自身的缺点。一是需要较大容量的程序存储器。二是对应用系统的设计工程师也具有更高的要求,如必须熟悉TCP/IP协议及其相关的接口。且软件设计的工作量也较大。所以在实际应用中,具体选择哪一种方案还需要根据具体情况做出不同的选择。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6779

    浏览量

    147552
  • 芯片
    +关注

    关注

    446

    文章

    47655

    浏览量

    408570
  • 嵌入式
    +关注

    关注

    4975

    文章

    18228

    浏览量

    287667
收藏 人收藏

    评论

    相关推荐

    mega128 下载程序问题

    我用的是mega128的开发板,用PROGISP(1.6.7)向开发板烧写程序时总是提示can't finish chip erase! 我熔丝位用的是默认的,请高手帮忙解决。另外,开始时怀疑程序跑飞造成芯片锁死,但是换了一块新的芯片
    发表于 04-07 21:48

    uC/OS-II下如何实现TCP/IP协议

    uC/OS-II下应如何实现TCP/IP协议
    发表于 09-15 11:35

    基于mega128的智能小车

    本人是新手,要做一个基mega128的智能小车,现在在红外壁障和超声波测距上遇到了困难,各位大神们可以帮帮我吗?我需要代码研究一下,让自己写完全不知道该怎么写。。拜托各位了。。。{:19:}
    发表于 01-06 20:01

    集成硬件TCP/IP协议网口芯片

    本司专业提供嵌入式网口芯片(MAC+PHY),且芯片集成硬件TCP/IP协议。在没有OS的系统
    发表于 11-10 22:43

    剖析:WIZnet以太网核心技术–全硬件TCP/IP协议

    等众多领域。该方案有效地卸载了主控芯片对于TCP/IP处理的负载,非常适应于物联网行业高速稳定,简单易用,移植性强的要求。WIZnet以太网核心技术,说到底就是:全硬件TCP/
    发表于 04-09 09:44

    协议介绍--TCP/IP

    ,在使用上与一般的协议相同,可能只是在具体的使用细节可能有点不同。3)本协议设计时使用标准UCOS-II操作系统。也可使用其它操作系统下运行。4)本
    发表于 09-03 15:03

    UCOS移植到mega128的bug

    用ICC软件在mega128移植UCOS II d,编译没有错误,就是下载到板子里,系统不工作,但是人家编译同样的代码编译的HEX文件,我下进去也可以正常工作?我自己用ICC编译的HEX文件就不工作。为什么呢?求大神解答
    发表于 12-01 20:56

    怎么用微芯片5.42 TCP/IP协议在PIC24上实现DNP?

    我是DNP(分布式网络协议)的新手。有人熟悉这个协议或者有任何信息可以帮助我开始吗?我想用微芯片5.42 TCP/IP
    发表于 09-23 09:49

    如何去简化Simplified TCP/IP协议

    Simplified TCP/IP协议的特点是什么?如何去简化Simplified TCP/IP
    发表于 05-26 07:23

    基于ARM的TCP/IP协议LwlP是如何实现的?

    嵌入式网络通信系统的硬件平台由哪几个部分组成?基于ARM的TCP/IP协议LwlP是如何实现的?
    发表于 06-04 06:37

    怎么实现嵌入式TCP/IP协议的设计?

    本文阐述在一种异构网络互联——CAN总线与以太网互联系统设计方案中嵌入式TCP/IP协议的设计与实现。从而
    发表于 06-07 06:28

    TCP/IP协议有何功能

    TCP/IP协议是什么?TCP/IP协议
    发表于 10-14 06:39

    MEGA128系统板电路图,原理图(带PCB文件)

    MEGA128系统板电路图,MEGA128系统板原理图,MEGA128系统板带PCB文件。
    发表于 05-29 08:17 389次下载
    <b class='flag-5'>MEGA128</b>系统板电路图,原理图(带PCB文件)

    AVR mega128开发板

    AVR mega128开发板 联系  杨迪 15336417867  0531-55508458 QQ:1347978253  http://www.easyele.cn 产品概述:AVR mega128开发板是AVRVi开发的基于Atm
    发表于 07-14 10:52 84次下载

    AVR mega128学习板

    AVR mega128学习板 联系  杨迪 15336417867  0531-55508458 QQ:1347978253  http://w
    发表于 07-14 10:53 85次下载