基于单片机以太网通信模块的软件设计课题(编辑修改稿)内容摘要:

装了网络接口芯片的底层操作,为以后协议栈程序的编写带来了很大的方便。 RTL8019AS 的内部 RAM 结构 RTL8029AS 和 RTL8019AS 的内核其实是一样的,都是 NE20xx 兼容的寄存器结构,都有一样大小的 RAM,读取和操作的方法都是一样的。 事实上对 RTL8029AS 的驱动跟RTL8019AS 的驱动除了 PCI 接口配置部分不同外,其余 NE20xx 兼容的寄存器部分的驱动都是一样的。 下面只对 RTL8019AS 进行讨论。 D15 D0 0000H 001FH 4000H 7FFFH 8000H C000H 图 RTL8019AS 的内部 RAM 结构图 RTL8019AS 有两块 RAM,一块 16k 字节的 RAM 的地址为 0x4000~ 0x7fff,一块32 字节的 RAM 的地址为 0x0000~ 0x00lf。 其内部 RAM 的存储是分页的,每 256 个字节称为一页。 RTL8019AS 的内部 RAM 分布如图 所示。 其 16 位内部 RAM 地址的高8 位表示的是 RAM 的页地址,例如 :0x4000~ 0x40ff 是一页,我们称该页为第 0x40页。 整个 RAM 空间的利用情况如表 所示: PROM ALIASED PROM 8K*16 BUFFER RAM ALIASED PROM ALIASED BUFFER RAM 第 14 页 表 RTL8019AS 内部 RAM 的利用情况 页码 地主范围 附注 0 0x00000x00ff 可以使用 0x010x3F 0x01000x3fff 空,不能使用 0x400x7F 0x40000x7fff 可以使用 0x800xFF 0x80000xffff 跟 0x00000x7fff 的内容是一样的(不要使用它) 其中,第 0 页的内存又叫 Prom,是 Ne20xx 兼容的网络接口芯片都有的。 Prom实际上只有 32 字节,地址范围为 0x0000~ 0x00lF,其它地址 0x0020~ 0x00FF 存储的内容跟 0x0000~ 0x00lf部分是完全重复的。 RTL8019AS内部 RAM的 0x0000~ 0x001F地址段存储的内容为: 表 RTL8019AS 的内部 RAM 的 0x0000~0x001F 段的内容 地址 内容 地址 内容 0x0000 以太网地址第 1 个字节 0x0001 以太网地址第 1 个字节 0x0002 以太网地址第 2 个字节 0x0003 以太网地址第 2 个字节 0x0004 以太网地址第 3 个字节 0x0005 以太网地址第 3 个字节 0x0006 以太网地址第 4 个字节 0x0007 以太网地址第 4 个字节 0x0008 以太网地址第 5 个字节 0x0009 以太网地址第 5 个字节 0x000A 以太网地址第 6 个字节 0x000B 以太网地址第 6 个字节 0x000C0x001F 其他内容(不同公司生产芯片的定义可能不同) 我们可以发现以太网地址被重复存储。 这主要是为了适应 RTL8019AS 的 8 位和16 位的两种数据总线宽度。 我们一般使用 8 位的数据总线,一次传输一个字节,而16 位宽度的数据总线是一次传输 2个字节,适合使用 16 位的单片机或 DSP 作为处理器。 对于己经做在网卡上的 RTL8019AS 来说,它的 prom 是网卡在复位的时候从网卡上的 EEPROM(一般使用 93C46)里读出来的。 网卡上的 EEPROM 一般是用来存储本网卡的物理地址及其它一些配置信息的。 因此可以直接读取 RTL8019AS 的 Prom 来获得本地的物理地址。 但是本地的物理地址最终是由 RTL8019AS 中的寄存器 MARO, MARI,MAR2, MAR3, MAR4, MAR5 决定,而不是 93C46,也不是 prom。 而这几个寄存器的内 第 15 页 容需要用户自己编写程序写入。 一般可以读出 Prom 里的物理地址,然后写入到这 6个寄存器里。 如果没有使用 93C46,那么 Prom 也是可以不使用的,这时要在 RTL8019AS的初始化程序中指定一个物理地址。 在本课题中,我虽然预留了 EEPROM(93C46)的位置,但为了节省资源没有使用,而是将本地的物理地址放在了 RTL8019AS 的驱动程序中,在其初始化的时候予以配置。 RTL8019AS的 RAM中从 0x4000到 0x7fff共 16k字节的这段内存是网络接口芯片用来作为接收和发送数据包的缓冲区用的。 该 16k字节的 RAM实际上是双端口的 RAM,可以同时被网络接口芯片内部的本地总线读写,也可以被外部用户 (比如 CPU)读写,相互之间不影响。 但其内部的本地总线的读写优先级要比外部用户读写的优先级高。 图 RTL8019AS 内部 RAM 的总线仲裁逻辑 所谓 16kB 的双端口 RAM 就是说有两套总线连结到该 RAM,一套总线 A 是网络接口芯片的本地总线读写 16kB 的双端口 raln,另一套总线 B 是主处理器用来读写这16k 双端口 RAM 的。 总线 A又叫 Local DMA,总线 B 又叫 Remote DMA。 在图 中,虚线框住的部分为 Remote DMA,也就是处理器对 RTL8019AS 的 RAM进行读写的总线,对 8019 来说就是 ISA 总线。 没有框住的部分 (左边的部分 ),就是LocalDMA 即网络控制器对其本身的 RAM 进行读写的总线。 其中的地址总线没有画出来,只画了数据总线。 实际在 RAM 的内部还有一些总线仲裁的逻辑,这里也没有画出来。 所谓总线仲裁的逻辑就是为了实现两套总线都能进行对 RAM 的读写而不互相 第 16 页 冲突,而进行的一些判断、控制逻辑。 RTL8019AS 的 Local DMA 读写网卡 RAM 的优先级比处理器读写其 RAM 的优先级要高的意思是: 1.当两者都要请求控制总线时, Local DMA 优先获得控制权。 2.高优先级的 Local DMA 可以中断 Remote DMA,而 Remote DMA 不能中断 Local DMA。 3.在 Remote DMA,也就是处理器对网卡 RAM 读写的过程进行中可以被 Local DMA中断。 Local DMA 中断 Remote DMA,然后进行 Local DMA 的数据传输, Local DMA 传输完毕之后继续刚才被中断的 Remote DMA, 以完成 Remote DMA 的传输。 Remote DMA被打断多久的时间取决于 FTI, FT0 的取值,其中 FT1 和 FT0 是 RTL8019AS 的 DCR 配置寄存器的位。 在本课题中,主处理器用的是单片机,单片机的总线要比 RTL8019AS 的 DMA 总线慢很多。 RTL8019AS 的 DMA 总线大概在 10Mhz,而单片机的总线大概 1Mhz,所以在Remote DMA 的过程中不需要特别的等待时序。 RTL8019AS 驱动过程 RTL8019AS 的复位及初始化 RTL8019AS 在进行具体操作之前,需要进行一系列的系统复位及初始化工作。 其具体过程如下 : 1.对 RTL8019AS 进行复位:这是 RTL8019AS 驱动程序需要做的第一个内容,由于我们将 RTL8019AS 设置为跳线模式,而不是即插即用的模式, 中介绍的 PLUG and PLAY 的一些过程,我们不需要做,因为单片机的资源有限,能够减少的操作都尽量减少。 对 RTL8019AS 的复位端口 (1FH)的读或写都将复位 RTL8019AS,RTL8019AS 内部将执行复位过程,读写是随意的。 2.选择寄存器页面:向 命令寄存器 CR(00H)写入 21H,选择寄存器页面 0,以进行后面的操作。 3.设置数据结构寄存器 DCR(0EH)为 49H。 4.设置方式状态寄存器 TCR(0DH)为 00H。 5.设置接收状态寄存器 RCR(0CH)为 1FH。 6.划分缓冲区为接收缓冲区和发送缓冲区,并建立接收缓冲环。 具体的工作是 第 17 页 设 PSTART 和 PSTOP 寄存器的值。 7.设置 CR为 61H,选择页面 1。 8.设置 RTL8019AS 的物理地址寄存器,把 PAR0(0lH)PARS(06H)设置为合适的物理地址。 9.设置当前页面寄存器 CURR(07H)为 PSTART+1,即 4DH。 10.清除组播地址寄存器,即 MAR(08H)MAR(OFH)为 00H。 11.设置 CR 为 21H,选择寄存器页面 0。 12.清除中断状态寄存器 ISR(07H)为 OFFH。 13.设置中断屏蔽寄存器 IMR(0FH)为 0FFH,即屏蔽掉所有的中断。 14.设置发送配置寄存器 TCR(0DH)为 00H。 15.设置 CR 为 22H,芯片进入工作状态。 驱动程序提供给上层协议的复位及初始化函数是 Init8019( )。 RTL8019AS 的数据包接收程序的编写 RT18019AS 的 16k 字节 RAM 地址范围为 0x4000~ 0x7fff,一共有 64 页,这 64页 RAM 是被用来接收和发送数据包的。 一般把前面的 12 页用来存放发送的数据包,后面的 52 页用来存放接收的数据包。 当然也可以配置成前面 52 页用来接收,而后面的 12 页用来发送。 或者也可以不使用那么多的缓冲区,比如只用 32 页来作为缓冲区,前面的 6 页用来发送,接下来的 26 页用来接收,而把空出来的 32 页给单片机使用,用来存储别的数据。 图 RTL8019AS 数据包接收缓冲示意图 第 18 页 RT18019AS 的 16k 的 RAM 中 哪些页被用来做接收缓冲区,哪些页被用来做发送缓冲区由两个寄存器决定: PSTART(page start register)页起始寄存器 PSTOP(page stop register)页终止寄存器 在设置了接收缓冲区之后,那么接收到的第一个数据包放在哪里呢 ?这是由 CURR寄存器决定的。 控制接收缓冲区操作的有两个寄存器:当前指针寄存器 CURR 和边界指针寄存器 BNRY。 CURR 是 RTL8019AS 写缓冲区的指针,指向此时要写的页。 BNIW 是读指针,指向用户已经读走的页。 我们可以通过判断 CURR 指针和 BNRY 指针的距离确定是否收到新数据包,当 CURR 和 BNRY 不等时说明收到新数据包。 这里收到的数据包中,在正常的以太包前面还有 4 个字节的附加信息,尾部还有 4 个字节的 CRC校验码。 前 4 个字节的格式如下: Receive Status Next Packet Pointer Receive Byte Count 0 Receive Byte Count 1 图 以太包前面 4 个字节的含义 第一个字节表示接收包的状态,其内容和 RSR 接收状态寄存器的值完全一样。 第二个字节表示下一个包的存放页地址,读取该数据包后要根据该值更新 BNRY 寄存器。 后两个字节表示数据包的大小。 在接收一个数据包的时候要先读出这 4 个字节,通过第一字节的接收状态判断数据包接收是否正确,如果是正确接收的数据包,则根据 Receive Byte count 的值修改远程 DMA 计数器 RBCRI、 RBCR0 的值,读出整个数据包。 最后根据 Next Packet Pointer 的值更新 BNRY 寄存器,以进行下一个包的接收。 对于。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。