以太网控制器模块设计
在Intemet飞速发展的今天,网络已经***到了方方面面。在嵌入式系统中,和网络的结合已经成为嵌入式系统发展的必然。在ARM系统中,以太网 接口(EthemetPort)是与远端机进行通信及调试的基础,扩展以太网口模块可以进行内部局域网和Internet之间的通信。
1. 实例说明
基于ARM的系统若没有以太网接口,其应用价值就会大打折扣,因此,就整个系统而言,以太网接口电路应是必不可少的,但同时也是相对较复杂的。
从硬件的角度看,如图16-1所示的ITU.T 802.3模型层间结构,以太网接口电路主要由媒质接入控制MAC控制器和物理层接口(Physical Layer,PHY)两大部分构成。目前常见的以太网接口芯片,如RTL8019/8029/8039、CS8900、DM9008及DWL650无线网 卡等,其内部结构也主要包含这两部分。
 
529852491.jpg
本实例选用一款专门为第三代快速以太网连接而设计的RTL8019AS 10M/100Mbps兼容以太网接口芯片,它支持多种嵌入式处理器芯片,内置FIFO缓存器用于发送和接收数据。
2以太网口工作原理
大多数ARM都内嵌一个以太网控制器,支持媒体独立接口(Media IndependentInterface,MⅡ)和带缓冲DMA接口(Buffered DMA Interface,BDI),可在半双工或全双工模式下提供10M/100Mbps的以太网接入。在半双工模式下,控制器支持CSMA/CD协议;在全 双工模式下,支持IEEE802.3 MAC控制层协议。
因此,ARM内部实际上已包含了以太网MAC控制,但并未提供物理层接口,因此,需外接一片物理层芯片以提供以太网的接入通道。而常用的单口 10M/lOOMbps高速以太网物理层接口器件均提供MⅡ接口和传统7线制网络接口,可方便地与ARM接口。以太网物理层接口器件主要功能一般包括:物 理编码子层、物理媒体附件、双绞线物理媒体子层、10BASE-TX编码/×××和双绞线媒体访问单元等。
使用RTL8019AS作为以太网的物理层接口,它的基本工作原理是:在收到由主机发来的数据报后(从目的地址域到数据域,如图16-2所示),侦 听网络线路。如果线路忙,它就等到线路空闲为止,否则,立即发送该数据帧。在发送过程中,首先它添加以太网帧头(包括前导字段和帧开始标志),然后生成 CRC校验码,最后将此数据帧发送到以太网上。
 
529420399.jpg
在接收过程中,它将从以太网收到的数据帧在经过解码、去帧头和地址检验等步骤后缓存在片内。在CRC校验通过后,它会根据初始化配置情况,通知RTL8019AS收到了数据帧,最后,用某种传输模式(I/O模式、Memory模式、DMA模式)传到ARM的存储区中。
3硬件电路设计
3.1电路原理图
用RTL8019AS芯片设计的以太网控制器相关电路,该系统可以通过RJ-45连上以太网,其网络通信部分的框图如图16-3所示。
529352778.jpg
RTL8019AS的IOS引脚与基地址的对应关系,如表16-l所示。
529268087.jpg
现 在详细讨论其接法的对应关系。选择其中一个I/O基地址,基地址在某些场合可能有作用,当与ARM接口时,经过多次验证选择其中任何一个都不会对网卡的工 作产生明显的影响,只是对应的接法不同,编程时的地址不同而已。需要注意的一点是,引脚定义中IOS3对应的另一种定义名称是BDO,IOS2对应 BDl,lOSl对应BD2,IOS0对应BD3,电平变换。这部分各元器件焊接完成后,就可以进行测试了。网卡芯片有两个LED指示是用于指示接收和发 送状态的,如果有网络连接并且正常收发数据包时,LED会闪烁。在判断网卡芯片是否工作正常时,有两个依据,一是看状态指示LED是否有闪烁。二是用专用 网络监听工具软件进行监听,如可以用软件Sniffer,监听到网卡不断发送出来的特定测试数据包就表明网卡正常工作。
4软件设计
4.1 以太网口存储及初始化
RTL8019AS内部有RAM,地址范围从0x0000~0x7FFFF,其中0x4000~0x7FFFF用作接收和发送缓冲区。
1. 如何读写FIAM
RTL8019AS内部RAM是双口RAM,因为它要支持两个独立的操作,一个是用户CPU读取RAM中的内容,对这个操作RTL8019AS提供 一个读写口,也就是寄存器中的Remote DMA Port;另一个是RTL8019AS内部控制电路把从网络接收的数据写入RAM中,这时RAM称为Local DMA。RTL8019AS通过Local DMA写入RAM是不用用户干涉的,它通过Remote DMA Port读写RAM。
读RAM见RTLReadRam函数。这个函数表示从地址address开始读取size个字节的内容到buff指针指向的内存中。设置CR寄存器为:
     WriteReg(CR,(Ox00 Ⅰ CR_REMOTE_WRITE Ⅰ CR_START-COMMAND));
     然后从Remote DMA Port读取size次,就得到所需的数据。
写RAM使用RTLWriteRam函数,操作基本上和读RAM差不多,只要将设置CR寄存器语句改成如下语句即可。
WriteReg(CR,(Ox00 Ⅰ CR_REMOTE_READ Ⅰ CR_START_COFIMAND));
最后一步的读size次改成写size次就可以了。
2. 发送和接收缓冲区

    0x4000~0x7FFF的接收和发送缓冲区,可以分为发送缓冲区和接收缓冲区。缓冲区是
按页管理的,256字节为一页,这样接收发送缓冲页面是从0x40到0x7F。发送缓冲区的
起始页在TPSR寄存器中设置,接收缓冲区的起始页在PSTART寄存器中设置,PSTART
实际上也表明了发送缓冲区的结束页,接收缓冲区的结束页是PSTOP。所以发送缓冲区的
页从TPSR到PSTART-1,接收缓冲区的页从PSTART到PSTOP-1。
接下来的问题是接收和发送缓冲各占多少才合适。这里设置如下:
    #define RECEIVE_START_PAGE 0x4C
#define RECEIVE_STOP_PAGE 0x60
                     /*有些资料上为80,但是实验发现80存在发送和接收缓存冲突的问题*/
     #define SEND START PAGEO        Ox40
     #define SEND START PAGEl        Ox47
让发送缓冲区可以容纳下两个最大以太网帧(最大的以太网帧大小是1514Bytes),第一个帧放在SEND_START_PAGEO起始页,第二个帧放在SEND_START_PAGEl起始页,剩下的缓冲区都作为接收缓冲区。
  3.以太网口初始化
初始化第一步是复位以太网口。以太网口复位分为硬件复位和软件复位。硬件复位通过给RTL8019AS的RST引脚一个脉冲来复位以太网口。软件复 位通过写ResetPort达到复位,也就是给18~1F之间的任意一个寄存器写入任意一个数,就使得以太网口复位。第二步是设置一些寄存器的初始值。寄 存器保存本机以太网的物理地址,只有和寄存器保存的物理地址相同的以太网帧才被接收(如果RCR中PRO=0的话)。
以太网口第一次复位必须是硬件复位,也就是说使用以太网口前一定要先硬件复位。另外,硬件复位以后要经过大约10ms的等待才能对以太网口操作,特别是发送和接收操作。
  4.以太网口驱动
以太网口的驱动程序是/arm/kemel/linux/drivers/net/这个文件。修改这个文件的第500行,改成如下形式:
之所以这样修改,是因为这个循环的循环次数取决于以太网接口模块所匹配的存储器的容量,该驱动程序中没有进行存储器的容量探测,而是直接采用以太网接口默认的匹配容量,但是硬件板所采用的存储器的容量是默认容量的一半,所以这里将循环次数减少一半。
4.2发送数据包
发送数据包的基本步骤如下:
    (1)首先选择发送的起始页,一般是发送缓冲区内的页(0x40~0x4b),写入StartPage变量中。要发送的数据写入地址为 StartPage<<8开始的缓冲区中,然后等待上一次发送结束。对于过大或者过小的数据包,不发送;最大最小帧的大小是以太网规定的,对 于过小的帧,在发送时要填充。
TPSR为发送起始寄存器,将StartPage写入TPSR寄存器,高字节写入TBCRH(TBCRl),低字节写入TBCRL (TBCR0)。当写发送命令时,RTL8019AS将从TPSR<<8地址开始发送size个字节的数据。命令为:
writeReg(CR,((PrePage&OxCO)  Ⅰ CR_ABORT_COMPLETE_DMA  Ⅰ  CR_TxP  Ⅰ  CR_START_COMMANI]));
如果发送的数据包存储如图16-4所示的黑色区域,则RTL8019AS不能自动连接两个区域,即当前发送页为RECEIVE_START_PAGE时,它不会转到SEND_START_PAGE,而是发送阴影部分的内容。
529663760.jpg
(2)发送数据帧:发送缓冲区可以存储两个最大的以太网帧。规定发送缓冲区可存储两个帧,一个起始页为SEND_START_PAGEO,另一个起始页为SEND_START_PAGEl,两个交替使用。
    如果发送命令是:
WriteReg(CR,((Prepage&OxCO)Ⅰ CR_SEND_PACKET Ⅰ CR_TXP Ⅰ CR_START_COMMAND));
则在下一次读写RTL8019AS内部RAM时死机。将发送命令改成:
WriteReg(CR,((Prepage&OxC0)  Ⅰ  CR_ABORT_COMPLETE_DMA  Ⅰ  CR_TXP  Ⅰ  CR_START_COMMAND));
则没有问题,而且可以正确发送数据。
4.3接收数据包
接收数据包的步骤如下:
(1)接收缓冲操作。当RTL8019AS接收到一个数据包以后,它自动将接收的数据包放到CURR页。如果一页放不下,则CURR加1;如果CURR=RECEIVE STOP PAGE,则CURR自动变成RECEIVE_START_PAGE,继续写入接收的数据。
   
(2)用户读取接收数据包。RTL8019AS通过Local DMA把接收的数据写入接收缓冲区,并且自动改变CURR和识别缓冲区的界限,这些都不用用户干预。接下来是用户如何读取接收缓冲区内的数据包。
当一个无错的数据接收完毕,则触发中断处理函数。接下来就是要读取数据包到分配的内存中,读取多少个可以从ReceiveByteCount得知。这里要处理一种情况:如果接收的数据包存储不是连续的,如图16-5所示。这种情况下要分两次才能读取一个完整的数据包。
529237215.jpg
判断是否存储不连续的条件是:
bnryAddl>Head[1]  &&Head[1]  !=RECEIVE_START_PAGE
     其中,bnryAddl是这个包的起始页,Head[1]是下一个包的起始页。
然后将接收的数据写入网络接口层的输入队列,如果写入失败则释放内存。写入以后上层协议将提取这个数据包。
最后网卡通过中断控制器向ARM响应中断,中断完毕清除中断标志,使得后来的同级和低级中断能够响应。
4.4程序代码

 
529756924.jpg
529857339.jpg
529868105.jpg
529591030.jpg
529999777.jpg
529922598.jpg
以 下这两个函数也很重要。当调用Start8019函数后,网卡就开始接收数据,也可以让其发送数据。调用Stop8019函数后,网卡停止接收数据,也不 能发送数据。在初始化工作全部结束以后,如果想让网卡开始工作,则调用Start8019函数,程序退出以前一定要调用Stop8019函数;否则在程序 退出以后,网卡将继续接收数据到接收缓存中,但是却没有相应的中断服务程序提取数据包。这样在下次运行程序时,8019的接收缓冲区中就有大量的数据包。 比如现在本机向另外一台计算机发送建立连接的请求,对方应答了,但是在这个应答数据包的前面有大量的不相关的数据包,这样就有可能出错。
 
529132571.jpg
以下是网卡芯片RTL8019AS是否正常工作的测试程序,电路板上需要RAM和正确结果。使用网络监听工具Sniffer或者Netxray监听MAC地址时52544c302e2f的数据包程序运行以后监听工具应该监听到一个数据包。
 
529689262.jpg
529785831.jpg
5  实例总结
    本章介绍的以太网接口模块是构造一个通用的基于网络的ARM嵌入式系统的基础,该接口模块的主要任务就是完成与外界的信息交互,以达到网络监控的目的。在 实际应用中,它运行稳定,能够十分方便地实现嵌入式系统的网络互连。在ARM系统采用高性能的以太网控制器,系统通信和调试快速、可靠,具有很高的实时 性。