《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 一种嵌入式系统以太网接口的设计与实现
一种嵌入式系统以太网接口的设计与实现
何 轩1,夏应清1,李 祥2
1.华中师范大学 通信工程学院,湖北 武汉430079;2.湖北经济学院 计算机技术与科学系,湖北
摘要: 基于DSP和较新的自适应10M/100M嵌入式以太网控制器芯片LAN91C111,介绍了嵌入式系统的软硬件实现方法。
Abstract:
Key words :

摘  要: 基于DSP和较新的自适应10M/100M嵌入式以太网控制器芯片LAN91C111,介绍了嵌入式系统的软硬件实现方法。
关键词: DSP  LAN91C111  嵌入式以太网

  电子设备日趋网络化,DSP芯片作为一种特殊的嵌入式微处理器系统,具有嵌入的协处理器和用于快速数据处理的并行数据通道。在嵌入式网络设备中引入DSP技术,可以使嵌入式以太网变得更快、更便宜,也更容易进行功能扩充。
本设计给出了以TMS320LF2407和以太网控制器芯片LAN91C111为基础的嵌入式系统的接口电路和实现方法。
1  LAN91C111嵌入式以太网控制器芯片
  LAN91C111是SMSC公司推出的为嵌入式应用系统设计的第三代快速以太网控制器。在LAN91C111芯片上集成了CSMA/CD协议的媒体层(MAC)和物理层(PHY),其系统结构图如图1所示。该以太网控制器的主要功能特性如下。
  (1)自适应地选择传输速率,支持10M/100Mbps。
  (2)支持突发数据传输。
  (3)8KB的内部存储器用于接收和发送的缓存。
  (4)支持总线8位、16位和32位的CPU访问。
  (5)提前发送和接收功能。

  该以太网控制器遵循的标准与协议为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、A1、A2和A3……的操作来访问。地址总线A1~A15与DSP的A1~A15相连,A0没有被LAN91C111使用(悬空);数据总线D0~D15与DSP的D0~D15相连,用于16位数据传输。LAN91C111端D16~D32悬空(因为LF2407是16位数据总线);LAN91C111的片选信号AEN由DSP的外部I/O接口选通信号IS提供。二元件的读电平RD和写电平WR分别相连。LAN91C111端的中断输出信号INTR0送入DSP的外部中断脚XINT1 触发中断。TG110-S050N2是针对10M/100M以太网的变压滤波器。LAN91C111模块的Protel原理图如图3所示。

3  软件设计
  编写控制以太网接口程序的步骤如下。
3.1 μC/OSⅡ实时操作系统的移植
  μC/OSⅡ是一种开放源码的实时嵌入式操作系统,它是可移植、可裁减、可固化的占先式多任务操作系统,其大部分源码由ANSI C语言编写。
  移植工作包括以下几个内容:(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。函数OSStart-HighRdy( )被函数OSStart( )调用,用于运行优先级最高的就绪任务;函数OSCtxSw( )被函数OS Sched( )调用,其功能是在任务级实现任务切换,任务切换用31号软中断来实现;函数OSIntCtxSw( )只能在中断子程序里被函数OSIntExit( )调用,由于中断的产生可能引起任务切换,在中断服务程序的最后会调用函数OSIntExit( )来检查任务就绪状态,如果满足任务切换条件(在最后一层中断里,并有高优先级任务就绪),则OSIntExit( )调用此函数实现任务切换;时钟节拍函数为OSTickISR( ),TMS320LF2407有4个通用定时器,其中断优先级由高到低分别为T1、T3、T2和T4,可根据实际需要选择其中的一个来实现时钟节拍。需要注意的是:调用OSIntEnter前不能开中断。
  ②OS_CPU_C.C文件:本文件仅包括一个OSTaskStkInit( )子程序。该函数模仿TI公司的I$$SAVE库函数对任务堆栈进行初始化,被函数OSTaskCreate( )和OSTaskCreateExt( )所调用并返回任务堆栈初始化后的指针值。注意:2407A的堆栈与一般MCU不同,芯片本身的堆栈(以下简称 US)只有 8 级,无法作为系统堆栈使用,所以C编译器将它内部的2个寄存器AR0和AR1保留。AR1作为堆栈指针SP,AR0用做堆栈中临时变量指针FP(在汇编程序中不要使用这2个寄存器,如果必须使用,要关中断,并注意保存和恢复)。编译器将函数和中断压进 US ,并将其返回地址弹出放在SP(AR1)指向的堆栈中,保留当前环境,不同的是函数只保留程序要使用的寄存器,中断要调用 I$$SAVE 保存所有寄存器,返回时要跳转到(不是调用)I$$REST(这2个函数可以在RTS.SRC中看到源代码)恢复寄存器。这2个函数就像8086中的中断进入和指令IRET,是移植的基础。
  ③OS_CPU.H文件:内容可根据μC/OS-Ⅱ中80x86的内容进行修改。
  ④适当处理OSMapTbl[ ]和OSUnMapTbl[ ]:移植时还需要对μC/OSⅡ的OSMapTbl[ ]和OSUnMapTbl[ ]2个表进行适当处理,否则会出现寻址错误而使μC/OSⅡ无法正常运行,这是移植能否成功的重要因素之一。由于TMS320LF2407的存储器采用的是哈佛结构,Flash存储器(或外扩的ROM)位于程序区,因此可按如下方法处理:将μC/OSⅡ中OSMapTbl[ ]和OSUnMapTbl[ ]的数据类型从“INT8U const”改为“INT8U”,并在链接器命令文件(.CMD)中将“.cinit”块分配到Flash存储器(或外扩的ROM)中,链接选项用“.C”(ROM初始化)。这样,在程序运行时自动对数据区的RAM进行初始化,即运行时自动将“.cinit”块中的数据复制到数据区的RAM中。
  按需要配置OS_FG.H,修改CPU中断向量表和外设向量表后,根据实际需要对其他文档中的内容进行相应设置即可。至此,μC/OSⅡ在TMS320LF2407上的移植就完成了。
3.2 LAN91C111的编程
  对LAN91C111主要包括初始化、发送数据包和接收数据包三部分。
3.2.1 初始化
  上电后,LAN91C111内部的寄存器的值设置为缺省值,CPU根据需要设置它里面的Configuration、Base和Individual Address寄存器,以保证它正常工作。
3.2.2 发送数据包流程
  (1)DSP向控制器发送ALLOCATE MEMORY命令(设置MMUCOM寄存器,通常设置为0x0020)。MMU负责在控制器内部的packet buffer中为待发送的包分配存储空间。
  (2)DSP查询中断状态寄存器中的ALLOC INT位,直到该位被置为1,也可以设置中断掩码中的ALLOC INT位,然后等待硬件中断,这时MMU已经分配好存储空间。而且TX packet number放在Allocation Result寄存器中。
  (3)将Allocation Result寄存器中的packet number拷贝到Packet Number寄存器中,设置Pointer寄存器(设置为TX、WR、AUTOINC,即0x4000)。然后将包的数据从upper layer发送队列传送到控制器的数据寄存器。要求依次写人Status Word、Byte Count、destination address、source address、packet size、packet data和control word。
  (4)DSP向控制器发送“ENQUEUE PACKET NUMBER TO TX FIFO”命令(设置MMUCOM寄存器,通常设置为Ox00C0),该命令将Packet Number寄存器中的packet number拷贝到TX FIFO,说明发送的包已经放入队列中。同时设置传输控制寄存器中的TXENA位,启动transmitter。到目前为止,DSP的设置工作已完成,它可以空闲,直到接收到一个控制器产生的发送中断。
  (5)当控制器传送完包以后,内存中的第1个字(16位)被CSMA/CD写入相应的状态字,然后将TX FIFO中的packet number移到TX completion FIFO,当TX completion FIFO不为空时产生中断。
  (6)DSP接收到中断后,开始执行中断处理程序,它读入中断状态寄存器,如果产生发送中断,则从FIFO端口寄存器读入发送包的Packet Number,并将它写入Packet Number寄存器。然后从内存中读入状态字(包括设置Pointer寄存器为TX、RD、AUTOINC,即0x6000,然后从数据寄存器中读入包的状态字),它是EPH寄存器的镜像,根据状态字判断包发送是否成功。如果成功则DSP向控制器发布RELEASE命令(设置MMUCOM寄存器,设置为Ox00A0),控制器将释放发送包所使用的存储空间,同时设置TX INT Acknowledge寄存器,它将TX completion FIFO中的packet number清除。有二种产生发送中断的方案:①每发送一个包产生一个中断。②每发送一个序列的包产生一个中断。通过控制寄存器的Auto Release位来选择这二种方案,而且这二种方案所使用的发送中断位也有所不同。
  TX INT:当TX completion FIFO不为空时置0;
  TX EMPTY INT:当TX FIFO为空时置1;
  AUTO RELEASE:如果置为1,发送包成功后,packet number不写到TX completion FIFO中,而且它所使用的存储空间被自动释放。
  (7)选择使用“每发送一个包产生一个中断”方案:允许TX INT中断,AUTO RELEASE=0,这种方案的流程如上所示。
  (8)选择使用“每发送一个序列的包产生一个中断”方案:允许TX EMPTY INT和TX INT,AUTO RELEASE=1,当发送完FIFO中的最后一个包后,产生TX EMPTY INT中断。当发生严重的发送错误时,产生TX INT中断,同时将发送失败的包的packet number保存到FIFO Ports寄存器,这样DSP就可以知道发送过程停止了。该方案可以减少DSP的负担,而且存储空间的释放也更迅速。当AUTO RELEASE=1时,DSP不能得到成功发送包的packet number。
3.2.3 接收数据包流程
  (1)DSP设置接收控制寄存器中的RXEN位,允许接收包。
  (2)含有正确地址的包被接收到,从MMU请求存储空间,并分派一个packet number,内部的DMA逻辑产生连续的地址,并将接收到的字写到内存中。如果超界,则包被丢弃,存储空间被释放。当检测到包结束时,状态字被写到接收包的最前面,byte count写到第2个字。如果CRC校验正确,则packet number被写到RX FIFO。当RX FIFO非空时,产生RCV INT中断;如果CRC校验不正确,则存储空间被释放,而且不产生中断。
  (3)DSP接收到中断后开始执行中断处理程序,它读入中断状态寄存器,如果产生接收中断(RCV INT位为1),则可以从FIFO端口寄存器得到接收的包的packet number,而且可以从数据寄存器将接收包传送到DSP的内存或外存中。当处理结束时,DSP向处理器发布REMOVE AND RELEASE FROM TOP OF RX命令(即设置寄存器MMUCOM,设置为0x0060),释放使用的存储空间和packet number。
4  结束语
  对以太网和快速以太网的自动协商模式使LAN 91C111具有很高的性价比,应用领域广泛。本设计利用LAN91C111和DSP芯片组成嵌入式以太网通信系统,能够正确地接入快速以太网,具备10M/100Mbps、全双工/半双工自适应等多种功能,符合IEEE802.3/802.3u-100Base-TX/lOBase-T规范,实现的嵌入式以太网接口支持RJ45和以太网的连接,可以通过以太网接入Internet,以实现从Internet上监控嵌入式设备。
参考文献
1   刘国福,张屺,廖巍.DSP与以太网卡的接口技术研究.电子技术应用,2001;27(1)
2   Richard S W著,范建华,胥光辉,张涛等译.TCP/IP 详解. 北京:机械工业出版社,2000
3   刘和平,严利平,张学锋等.TMS320LF240xDSP结构、原理及应用.北京:北京航空航天大学出版社,2002

此内容为AET网站原创,未经授权禁止转载。