LAN91C111型控制器在嵌入式以太网接口中的应用
扫描二维码
随时随地手机看文章
摘要:嵌入式以太网不仅可用于工业现场实现现场节点的自动上网功能,而且还可以用于信息家电的以太网接口实现远程控制,具有很好的发展前景。文章介绍基于TMS320LF2407型DSP的嵌入式系统与LAN91C111型自适应10Mb/s/100Mb/s嵌入式以太网控制的接口电路及软硬件实现方法。
关键词:数字信号处理 LAN91C111 TCP/IP 嵌入式以太网
1 引言
在电子设备日趋网络的背景下,目前广泛使用的以太网及TCP/IP协议已经成为事实上最常用的网络标准之一,它的高速、可靠、分层及可扩充性使得它在各个领域的应用越来越灵活,很多情况下运用以太网和TCP/IP能够简化结构和降低成本。目前关于嵌入式以太网的设计方案不是很多,其中大多是基于单片机的,缺点是速度慢、成本太高。DSP作为一种特殊的嵌入式微处理器系统,具有嵌入的协处理器和用于快速数据处理的并行数据通道,在嵌入式网络设备中引入DSP技术可以使嵌入式以太网变得更快、更便宜、更容易进行功能扩充。本文介绍了基于TMS320LF2407型的嵌入式系统与LAN91C111型自适应10Mb/s/100Mb/s嵌入式以太网控制芯片的接口电路和实现方法。
2 LAN91C111
LAN91C111是SMSC公司为嵌入式应用系统推出的第三代快速以太网控制器。LAN91C111的芯片上集成了遵循SMSC/CD协议的MAC(媒体层)和PHY(物理层),符合IEEE802.3/802.U-100Base-Tx/10Base-T规范,其系统结构如图1所示。该以太网控制器的主要功能如下:
·自适应地选传输速率,支持10Mb/s/100Mb/s;
·充分支持全双工交换式以太网;
·支持突发数据传输;
·8k字节的内部存储器用作接收发送的FIFO缓存;
·增强式能量管理功能;
·支持总线8位、16位、32位的CPU访问;
·提前发送和接收。
LAN91C111以太网控制器遵循IEEE颁布的802.3以太网传输协议。其8-32位数据总线接口单元通过控制总线、地址总线和数据总线与外部的CPU相连。外部数据可以8位、16位或32位的方式与LAN91C111进行交换。该电路还集成了EEPROM接口,自举时再通过EEOROM接口输入到芯片中,从而实现自动初始化。总线仲裁器(Arbiter)用来监视以太网总线的数据交流情况,一旦发生阻塞,仲裁器一方面通过总线接口单元与外部CPU联系,另一方面控制内存控制单元(MMU),实现总线数据协调。内存控制单元可控制8kB动态SRAM的存储情况,实现与DMA控制器之间的数据联络。DMA控制器与总线控制器一起控制DMA与以太网协议处理器(EPH)之间的数据交换。以太网协议处理器(EPH)之间的数据交换。以太网协议处理器出来的数量最终经过10Mb/s/100Mb/s的物理层(PHY)直接到达以太网总线。
3 硬件电路组成
出于性价比的考虑,选用DSP控制器作为主CPU。TMS320LF2407是TI公司发布的一款高性价比的,适用于工业控制领域的DSP。该系列具有强大的指令系统、较强的灵活性、高速的数学处理功能及全新的内部结构,可广泛用于通信、计算机、商业、工业、军事等领域。TMS320LF2407是240X系列控制器中功能最强的一款,采用低功耗CMOS技术,具有30MI/s的执行速率,片上还集成了丰富的外围部件(EVM、A/D模块、CAN、SCI、SPI及JTAG)。TMS320LF2407的工作频率较高(40MHz),存贮空间较大(高达32k字的FLASH程序存储器,可扩展外部64k字存储器,64k字I/O寻址空间),非常适合处理复杂的TCP/IP协议。
由于LAN91C111是专为嵌入式系统设计的,因此,其外围电路相对比较简单。它和没有DMA传输性能的16位DSP(TMS320LF2407)及TG110-S050N2型电磁耦合变压器构成的嵌入式以太网结构如图2所示。图中,地址总线A1-A15相连。A0没有被LAN91C111使用,悬空;数据总线D0-D15相连,用于16位数据传输。LAN91C111端D16-D32悬空;LAN91C111的片选信号AEN由DSP的外部I/O接口选通信号IS提供。二个元件的读电平RD、写电平WR分别相连。LAN91C111的中断输出信号INTRO送入DSP的外部中断脚XINT1触发中断。嵌入式以太网通信模块的电路原理如图3所示。
4 软件设计
4.1 μC/OS II实时操作系统的移植
μC/OS II是一种开放源码的实时嵌入式操作系统,是一个可移植、可裁减、可固化的占先式多任务操作系统,已被应用到多种微处理器中,其大部分源码是用ANSI C语言编写的。移植工作包括以下几个内容:
(1)用汇编语言改写OS_CPU_A.ASM文件
该文件包括4个子程序:_OSStartHighRdy、OSCtxSw、OSIntCtxSw和OSTickISR。OSStartHighRdy()函数被OSStart()函数调用,功能是运行优先级最高的就绪任务;OSCtxSw()函数被OS Sched()函数调用,其功能是在任务级实现任务切换,任务切换用31号软中断来实现;OSIntCtxSw()函数只能在中断子程序里被OSIntExit()函数调用,由于中断的产生可能引起任务切换,因此在中断服务程序的最后会调用OSIntExit()函数调用,由于中断的产生可能引起任务切换,因此在中断服务程序的最后会调用OSIntExit()函数来检查任务就绪状态,如果满足任务切换条件(在最后一层中断里,并有高优先级任务就绪),则OSIntExit()调用此函数实现任务切换;时钟节拍函数OSTickISR()的功能如下:TMS320LF2407有4个通用定时器,其中断优先级由高到低分别为T1、T3、T2、T4,可根据实际需要选择基中的一个来实现时钟节拍。需要注意的是:调用_OSIntEnter前不能开中断。如果在调用_OSIntEnter前就开中断,有可能在OSIntNesting加1前就被中断。若发生这种情况,则当高优先级的中断调用OSIntExit()而退出时,应直接从高优先级中断里切换到任务,而不是反回到_OSTickISR(假设_OSTickISR是最后一层中断),其根本原因就在于_OSTickISR还没有来得及将OSIntNesting加1就被中断了。在用户的其他中断服务程序中也应该防止此类错误。
(2)用C语言改写OS CPU_C.C文件
本文件仅包括一个OSTaskStkInit()子程序。该函数可模仿TI公司的1$$SAVE库函数对任务堆栈进行初始化,被OSTaskCreate()函数和OSTaskCreateExt()函数所调用,该函数是用来返回任务堆栈初始化后的指针值。注意:TMS320LF2407A本身的堆栈(以下简称US)只有8级,无法作为系统堆栈使用,所以C编译器将其内部的二个突破口AR0,AR1保留,其中AR1作为堆栈指针SP,AR0用做堆栈中临时变量指针FP(在汇编程序中不要使用这二个寄存器,如果必须使用,要关中断,并注意保存和恢复)。编译器将函数和中断压进US的返回地址弹出放在SP(AR1)指南的堆栈中,并保留环境,不同的是函数只保留程序要使用的寄存器,中断要调用I$$AVE保存所有寄存器,返回时要跳转到(而不是调用)I$$REST(这两个函数可以在RTS.SRC中看到源代码)恢复寄存器,这二个函数就象8068里的中断进入和指令HRET,是移植OSTaskStkInit()函数的基础。
(3)编写OS_CPU.H文件
内容可根据μC/OS-II中的“80×86”的内容进行修改,这里仅给出关键内容:
#define OS STK GROWTH 0
#define OS ENTER CRITICAL() asm("SETC IN TM");
#define OS_EXIT CRITICAL() asm ("CLRC IN TM");
#define OS-ASKee SW() asm("INTR 31");
(4)适当OSMap Tb1[]和OSUnMapTb1[]
移植时还需要对tic /OS-II的OSMapTb1[]和O-SunMapTb1[]二个表进行适当处理,否则会出现寻址错误而使μC/OS-II无法正常运行,这是移植能否成功的重要因素之一。由于TMS320LF2407的存储器采用的是哈佛结构,Flash存储器(或外扩的ROM)位于程序区,因此,处理的方法如下:将tic /OS-II中OSMapTb1[]和OSUnMapTb1[]的数据类型从“INT8U const'改为‘INT8U’,并在链接器命令文件(.CMD)中将“.cinit”块分配到Flash存储器(或外扩的ROM中,链接选项用“-C”(ROM初始化)。这样,在程序运行时将自动对数据区的RAM进行初始化,即运行时自动将“.cinit”块中的数据复制到数据区的RAM中。
按需配置OS-FG.H,修改CPU中断向量表和外设向量表后,其他文档的内容可根据实际需要进行相应设置。至此,μC/OS-II在TMS320LF2407上的移植就完成了。
4.2 LAN91C111的编程
4.2.1 初始化
上电后,LAN91C111内部寄存器的值均设置为缺省值,CPU将根据需要设置其中的Configuration,Base和Individual Address寄存器,以保证电路正确工作。
4.2.2 发送数据包流程
(1)DSP向控制器发送ALLOCATE MEMORY命令(设置MMUCOM寄存器,通常设置为0x0020),MMU为待发送的包在控制器内部的packet buffer中分配存储空间。
(2)DSP查询Interrupt Status寄存器中的ALLOC INT位,直到该位被置成1,也可以设置Interrupt Mask中的ALLOC INT位,然后等待硬件中断,这时,MMU已经分配好存储空间。而且TX packet number放在Allocation Result寄存器中。(3)将Allocation Result寄存器中的packet number:拷贝到Packet Number:寄存器中,设置Pointer寄存器(设置为TX;WR,AUTOINC,即0x4000)。然后将包中数据从upper layer发送队列传送到控制器的Data Register。要求依次写入Status Word、Byte Count、destination address、source address、packet size、packet data、control word。
(4)DSP向控制器发送“ENQUEUE PACKET NUMBER TO TX FIFO”命令(设置MMUCOM寄存器,通常设置0x00C0),该命令将Packet Number寄存器中的packet number拷贝到TX FIFO,说明发送的包已放入队列中。同时设置Transmit control寄存器中的TXENA位。同时设置Transmit control寄存器中的TXENA位,启动transmitter。到此为止,DSP的设置工作完成,它可以IDLE,直到接收到一个控制器产生的发送中断。
(5)当控制器传送完包以后,memory中的第一个字(16bit)被CSMA/CD写入相应的Status Word,然后将TX FIFO中的packet number移到TX completion FIFO,当TX completion FIFO不为空时产生中断。
(6)DSP接收到中断后,开始执行中断处理程序,它读入Interrupt Status寄存器,如果产生发送中断,则从FIFO ports寄存器读入发送的包中的packet number,并将它写入packet number寄存器。然后从memory中读人Status Word(包括设置Pointer寄存器为TX、RD、AUTOINC,即0x6000,然后从数据寄存器中读入包的Status Word),它是EPH寄存器的镜像,再根据Status Word判断包发送是否成功。如果成功,DSP则向控制器发送RELEASE命令(设置MMUCOM寄存器,设置为0x00A0),随后控制器将释放发送包所使用的存储空间,同时设置TX INT Acknowledge寄存器,它将TX completion FIFO中的pecket unmber清除。有二种产生发送中断的方案:每发送一个包产生一个中断;每发送一个序列的包产生一个中断。通过Control寄存器的Auto Release位来选择这二种方案,而且这二种方案所使用发送中断位也有所不同。
TX INT:当TX completion FIFO不为空时置1e;
TX EMPTY INT:当TX FIFO为空时置to;
AUTO RELEASE:如果置为1,发送包成功后,packet number不写到TX completion FIFO中,而且它所使用的存储空间被自动释放。
图3
(7)使用“每发送一个包产生一个中断”方案时,AUTO RELEASE=0,该方案的流程如上文所述。使用“每发送一个序列的包产生一个中断”方案时允许TX EMPTY INT和TX INT,AUTORELEASE=1,当发送完FIFO中的最后一个包后,产生TX EMPTY INT中断。若出现严重的发送错误,则产生TX INT中断,同时将发送失败的包的packet number保存到FIFO Ports寄存器,这样DSP就可以知道发送过程停止了。这种方案可以减少DSP的负担,而且存储空间的释放也更迅速。当AUTO RELEASE=1时,DSP不能得到成功发送包的packet number。
4.2.3 接收数据包流程
(1)DSP设置receive control寄存器中的RXEN位,允许接收包。
(2)含有正确地址的包被接收到,从MMU请求存储空间,并分派一个packet number,内部的DMA逻辑产生连续的地址,并将接收到的字写到memory中,如果超界,包被丢弃,存储空间被释放。当检测到包的结束,Status Word被写到接收包的最前面,byte count写到第二个字。如果CRC校验正确,packet number被写到RX FIFO,由于RX FIFO非空时,因此将产生RCV INT中断;如果RCR校验不正确,则存储空间被释放,而且不产生中断。
(3)DSP接收到中断后开始执行中断处理程序,首先读入Interrupt Status寄存器,如果产生接收中断(RCV INT位为1),则可从FIFO ports寄存器得到接收包的packet number,而且可从data register将接收包传送到DSP的内存或外存中。当处理结束,DSP向处理器发送REMOVE AND RELEASE FROM TOP OF RX命令(即设置寄存器MMUCOM为0x0060)以释放使用的存储空间和packet number。
5 结束语
以太网以其良好的通用性和突出的带宽性能成为下一代工业控制网络的焦点。本设计利用LAN91C111型嵌入式以太网控制器和DSP组成嵌入式以太网通信系统,该系统能够正确地接入快速以太网,具备100/10Mbit/s、全双工/半双工自适应等多种功能,符合IEEE802.3/802.3μ-100Base-TX/1Obase-T规范,其嵌入式以太网接口支持RJ45和以太网的连接,可以通过以太网接入Internet,从而实现从Internet上监控嵌入式设备。对以太网和快速以太网的自动协商模式使LAN91C111具有很高的性价比和广泛的应用领域。