CCIE思科教育培训 CCIE培训

探讨嵌入式的网络接口实现思路

在电子设备日趋网络的背景下,目前广泛使用的以太网及TCP/IP协议已经成为事实上最常用的网络标准之一,它的高速、可靠、分层及可扩充性使得它在各个领域的应用越来越灵活,很多情况下运用以太网和TCP/IP能够简化结构和降低成本。目前关于嵌入式以太网的设计方案不是很多,其中大多是基于单片机的,缺点是速度慢、成本太高。DSP作为一种特殊的嵌入式微处理器系统,具有嵌入的协处理器和用于快速数据处理的并行数据通道,在嵌入式网络设备中引入DSP技术可以使嵌入式以太网变得更快、更便宜、更容易进行功能扩充。本文介绍了基于TMS320LF2407型的嵌入式系统与LAN91C111型自适应10Mb/s/100Mb/s嵌入式以太网控制芯片的接口电路和实现方法。

1 LAN91C111嵌入式以太网控制器芯片

LAN91C111是SMSC公司推出的为嵌入式应用系统设计的第三代快速以太网控制器。在LAN91C111芯片上集成了CSMA/CD协议的媒体层(MAC)和物理层(PHY),其系统结构图如图1所示。该以太网控制器的主要功能特性如下。

(1)自适应地选择传输速率,支持10M/100Mbps。

(2)8KB的内部存储器用于接收和发送的缓存。

(3)支持突发数据传输。

(4)提前发送和接收功能。

(5)支持总线8位、16位和32位的CPU访问。

该以太网控制器遵循的标准与协议为IEEE颁布的802.3以太网传输协议。8~32位数据总线接口单元由控制总线、地址总线和数据总线与外部的CPU控制芯片相连。该单元还集成了E2PROM接口,所有内部寄存器的初始值可先放在E2PROM中,自举时通过E2PROM接口输入到芯片中,实现自动初始化。总线仲裁器(Arbiter)监视以太网总线的数据交流情况,一旦发生阻塞,一方面通过总线接口单元与外部CPU联系,另一方面控制内存控制单元(MMU),实现总线数据协调。内存控制单元控制8KB动态SRAM的存储情况,实现与DMA控制器之间的数据联络。DMA控制器与总线控制器一起控制数据在DMA与以太网协议处理器(EPH)之间的交换。由以太网协议处理器输出的数据最终经过10M/100M的物理层直接到达以太网总线。

2 硬件电路组成

出于性价比的考虑,采用了DSP控制器作为主CPU。TMS320LF2407是TI公司发布的240X系列中功能最强的一种控制器,有很大的存储空间(高达32K字的Flash程序存储器,可扩展外部64K字存储器和64K字I/O寻址空间),非常适合于处理复杂的TCP/IP协议。

由于LAN91C111是为嵌入式系统设计,其外围电路相对比较简单,其硬件接口框图如图2所示。LANC91C111内部寄存器可通过地址线A0~A15来访问。地址总线A1~A15与DSP的A1~A15相连,A0没有被悬空;数据总线D0~D15与DSP的D0~D15相连,可以传输16位数据。D16~D32悬空(因为LF2407是16位数据总线);LAN91C111的片选信号AEN由DSP的外部I/O接口选通信号IS提供。二元件的读电平RD和写电平WR分别相连。LAN91C111端的中断输出信号INTR0送入DSP的外部中断脚XINT1触发中断。TG110-S050N2是针对10M/100M以太网的变压滤波器。LAN91C111模块的Protel原理图。

3 软件设计

编写控制以太网接口程序的步骤如下

3.1μC/OSⅡ实时操作系统的移植

μC/OSⅡ是一种开放源码的实时嵌入式操作系统,具有很好的实时性。它是可移植、可裁减、可固化的占先式多任务操作系统,其大部分源码由ANSIC语言编写。

移植工作包括以下几个内容:

(1)用汇编语言改写OS_CPU_A.ASM。

(2)用C语言改写OS_CPU_C。C。

(3)编写OS_CPU.H。

(4)适当处理OSMapTbl[]和OSUnMapTbl[]。

①OS_CPU_A.ASM文件包括4个子程序:OSStart-HighRdy、OSCtxsw、OSIntCtxSw和OSTickISR。

1)OSStartHighRdy()函数

当程序执行内核的OSStart函数时,表示多任务系统开始启动,OSStart函数将调用OSStartHighRdy函数从最高优先级任务的TCB块中获得该任务的堆栈指针,通过该指针,依次从该任务的任务堆栈中恢复CPU的现场。由于任务在堆栈初始化时,已经设定了弹出到程序指针寄存器PC的是该任务函数的入口地址,因此,OSStartHighRdy函数只需依次弹出任务栈内容到处理起寄存器,该任务便将得以运行。

2)OSCtxSw()函数

该函数是任务级的上下文切换函数,当任务被阻塞而主动请求CPU开始任务调度时执行,其过程是将当前任务的的CPU现场保存到该任务堆栈中去,然后从OSTCBHighRdy中获得更高优先级任务的堆栈指针,再从该指针指向的堆栈中恢复此任务的CPU现场,使之继续执行,从而完成一次任务级别的切换。表2为OSCtxSw函数的伪代码。

voidOSCtxSw(void){

保存处理器寄存器;/*将欲挂起的任务的CPU寄存器压入当前堆栈*/

OSTCBCur->OSTCBStkPtr=sp;/*OSTCBCur目前指向的是被打断的任务TCB,此操作

将该任务的栈顶指针保存到其OSTCBStkPtr中去,便于下次恢复时从这里获取栈顶指针*/

OSTCBCur=OSTCBHighRdy;/*OSTCBHighRdy指向的是就绪的高优先级任务的TCB,

将其装载到OSTCBCur中来*/

SP=OSTCBHighRdy->OSTCBStkPtr;/*取得就绪的高优先级任务的栈顶指针*/

恢复该任务的现场();/*于是便可通过刚取得的栈顶指针恢复该任务*/

执行中断返回指令;/*若OSCtxSw含有软中断指令则需中断返回,本移植不使用软中断*/

}

表2OSCtxSw函数的伪代码


Tags:

发布: admin 分类: CCIE思科 评论: 0 浏览: 88
留言列表
发表留言
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。