微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于LAN91C111的嵌入式以太网接口设计

基于LAN91C111的嵌入式以太网接口设计

时间:09-28 来源:互联网 点击:

I和LWIP, 其中LWIP必须在μCOS的支持下使用。μC/OS II是一种免费公开源代码, 结构小巧, 而且具有可剥夺实时内核的操作系统, 它可移植、可裁剪, 最多可管理64个任务, 其每个任务都拥有自己独立的堆栈, 大部分源码可使用ANSI C语言编写, 整个软件部分可在NIOS II IDE开发环境下完成。由于程序的内容较多, 本文着重介绍LAN91C111的初始化、发送数据、接收数据三个部分的软件设计方法。

  2.1 初始化

  ALTERA提供有LWIP的NIOS II 端口, 其源代码包含在NIOS II 开发工具包中。LWIP可为NIOS II处理器提供对以太网连接栈的快速、开源地访问。ALTERA的LWIP端口包括套接字API封装, 提供有标准的、文档说明齐全的套接字API。LWIP协议栈的主要接口是标准的套接字接口。除了套接字接口以外, 还可调用lwip_stack_init ()函数和lwip_devices_init () 函数来对堆栈和驱动程序初始化。通过HAL 系统代码可调用init_done_func ()、get_mac_addr () 和get_ip_addr() 函数来设置MAC地址和IP地址。为了初始化堆栈, 在调用OSStart启动μC/OS II 调度程序之前应调用函数lwip_stack_init ( ) , 其原型为voidlwip_stack_init ( int thread_prio, void(*init_done_func) (void*), void *arg)。堆栈初始化后, 还必须调用函数init_done_func (), 而该函数必须调用函数lwip_devices_init () 。利用函数lwip_devices_init () 可以对在system.h中定义的所有已安装的以太网设备驱动程序进行注册, 若返回一个非0值则表示注册成功。注册成功后,TCP/IP栈即可使用, 之后便可在程序中创建任务。该函数的参数是接收线程的优先级。LWIP系统码在设备初始化过程中, 可通过lwip_devices_init ( ) 函数调用函数get_mac_addr ( ) 和get_ip_addr ()。用户通过编写这些函数, 可在系统中将MAC和IP地址存放在任意位置, 从而代替在设备驱动程序中固定位置的硬编码, 并增加系统的灵活性。设计时, 可以将MAC地址存放在Flash存储器中, 也可以将MAC地址存放在片上内嵌的存储器中。当所有的初始化都准备好后即可调用OSStart () 以启动RTOS进行任务调度。这个过程需要设置以太网目的地址、以太网源地址、协议类型, 然后再按照所设置的协议类型来设置数据包。

  2.2 数据的发送和接收

  数据的接收和发送可采用中断方式。中断服务程序通过检查LAN91C111的中断状态寄存器来判断是发送中断请求还是接收中断请求。初始化完成后, 即可创建任务, 建立套接字, 绑定端口, 绑定完之后, 再*端口。当LAN91C111接收到数据包时, 可由EPH模块察看此数据包的目的地址, 若为本网卡的MAC地址或广播地址或多播地址, 则把此数据包传送到LAN91C111的RAM中, 并向处理器发送中断, 由处理器进行数据处理。由于采用的是TCP/IP协议, 接收数据应调用read () 函数来接收建立连接的套接字中的数据,并将其放入缓冲区。发送过程则是由FPGA将数据传送到LAN91C111, 再由LAN91C111将接收到的数据封装成数据包, 并检测网络, 当没有数据传输时, 再将数据包传输到网络中, 并向处理器发送中断信号, 以表示数据传送完毕。发送数据时通过调用write () 函数可将要发送的数据发送到指定连接的目的地址。

  3 结束语

  本文的整个设计使用了逻辑单元(LE) 5314个, 占用EP2C35F484芯片内部资源的16%, 这充分体现了FPGA资源的丰富性。在传统设计中,通常选用单片机和低速网卡的设计方案, 这在实际应用中, 网络速度相对较慢, 而本设计中选用高速的以太网控制芯片LAN91C111和高速的FPGA,极大地提高了系统的网络数据处理能力,并可满足网络数据采集的需求。另外, 基于FPGA的NIOS II方案, 还可根据实际需要添加不同IP, 这也体现了SOPC的灵活性与可裁减性。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top