引脚X1、X2接一个20MHz的无源晶振,作为外部时钟信号输入;引脚JP接高电平,选择跳线模式:引脚IORB、IOWB作为输入输出读写指令端;引脚RSTDRV是复位端,连接复位信号;引脚SMEMRB、SMEMWB是芯片的存储器读命令和写命令。
引脚TPIN+,TPIN-、TPOUT+,TPOUT-作为媒体接口管脚,是接收IP数据报所需要用到的管脚,在设计网卡芯片电路时通过一个隔离变压器和RJ-45的网络外接口相连,外部主机通过以太网网线与RJ-45接口进行连接,实现数据交换。
隔离变压器的TD+管脚连接网卡芯片的TPOUT+引脚;TD-连接TPOUT-;RD+连接TPIN+;RD-连接TPIN-。8019通过隔离变压器与RJ-45连接,实现与主机进行接收和发送IP数据报等工作。
此外,硬件部分还包括电源电路、晶振电路、复位电路,在此就不一一介绍。
软件部分设计
嵌入式系统的软件部分分为BootLoader的编写、操作系统与文件系统的移植、应用程序的编写三部分。
BootLoader的编写
BootLoader是系统加电后运行的第1段软件代码,即处理器芯片复位后进入操作系统之前执行的一段代码,主要是为运行操作系统提供基本的运行环境,如初始化CPU堆栈、初始化存储器系统等。BootLoader代码与CPU芯片的内核结构、具体芯片和使用的操作系统等因素有关,其功能类似于PC机的 BIOS。通过运行BootLoader程序,可以初始化存储器等硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,为最终调用操作系统内核准备好正确的环境。其一般编写的步骤为:
(1)屏蔽所有的中断。为中断提供服务通常是操作系统或设备驱动程序的责任,因此,在BootLoader的执行全过程中可以不必响应任何中断;
(2)设置中断向量;
(3)设定存储器控制寄存器;
(4)初始化堆栈和寄存器。系统堆栈初始化取决于用户使用了哪些中断,以及系统需要处理哪些错误类型、并且定义处理器的几种工作方式。一般来说管理者堆栈必须设置,如果使用了IRQ中断,则IRQ堆栈也必须设置;
(5)如有必要则需要改变处理器模式、状态;
(6)初始化C语言所需的存储器空间。为正确运行应用程序,在初始化期间应将系统需要读写的数据和变量从ROM拷贝到RAM中。一些要求快速响应的程序,如中断处理程序,需要在RAM中运行;如果使用Flash,对Flash的擦除和写入操作也是在RAM里运行的。
嵌入式系统的启动程序是严重依赖于硬件的,所以需要用汇编语言来进行编写。完成上述步骤后,系统就完成了对硬件和软件运行环境的初始化。最后将实时操作系统代码从Flash读入到内存空间中,开始运行实时操作系统。
操作系统与文件系统的移植
Linux作为一种优秀的操作系统,近几年在嵌入式领域异军突起,成了最有潜力的嵌入式操作系统。突出的一个优点就是免版税和开放源码,另外它可应用于多种硬件平台,具有良好的移植性、高的可靠性、优秀的网络功能、完备的文件系统以及丰富的API,为嵌入式网关提供了强大的软件支持。因此,本文选择 Linux作为嵌入式网关的操作系统。对Linux的移植有以下几个步骤:
(1)下载Linux源代码,建立交叉编译环境;
(2)配置和编译内核;
(3)制作文件系统,编写相应的设备驱动程序;
(4)下载,调试和执行内核,并在文件系统中添加自己的应用程序。
应用程序的编写
本文利用Socket套接字和TCP/IP协议编写了一个简单的客户机/服务器模式的网络应用程序。因为本系统只是起到网关的作用,只需实现现场总线和以太网上位机两方之间的通信,并不需要处理其数据的逻辑意义和内容。在这种模式下,以太网上位机被设定为服务器,它运行了服务器端的应用程序。该程序主要用于监听服务器端口、接受客户端的连接请求、接受客户端的信息、向客户端发送信息等。网关系统中运行的是客户端程序,该程序主要是用于申请连接到服务器、将现场总线方发来的消息向服务器发送、处理服务器发来的信息、将这些信息发送给现场总线系统。应用程序软件流程如图2所示。

软件中调用的函数主要有:
(1)intsocket(intfamily,inttype,intprotocol)。此函数为通信创建一个端口,若正常调用将返回一个整型的文件描述符,错误调用将返回-1。
(2)intbind(intsockfd,conststructsockaddr*address,size-taddress-len)。此函数一旦Socket调用成功并返回了一个文件描述符,便将该Socket与服务器本机上一个端口相关联,就可以在该端口监听服务请求。该函数只用于服务器端程序,客户端无须调用此函数。