驱动网卡芯片DM9000调试过程及其具体的单片机程序

上传人:cn****1 文档编号:437684724 上传时间:2022-12-13 格式:DOCX 页数:20 大小:230.30KB
返回 下载 相关 举报
驱动网卡芯片DM9000调试过程及其具体的单片机程序_第1页
第1页 / 共20页
驱动网卡芯片DM9000调试过程及其具体的单片机程序_第2页
第2页 / 共20页
驱动网卡芯片DM9000调试过程及其具体的单片机程序_第3页
第3页 / 共20页
驱动网卡芯片DM9000调试过程及其具体的单片机程序_第4页
第4页 / 共20页
驱动网卡芯片DM9000调试过程及其具体的单片机程序_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《驱动网卡芯片DM9000调试过程及其具体的单片机程序》由会员分享,可在线阅读,更多相关《驱动网卡芯片DM9000调试过程及其具体的单片机程序(20页珍藏版)》请在金锄头文库上搜索。

1、.驱动网卡芯片 DM9000A 的过程及具体驱动程序一、电路连接DM9000E 网卡芯片支持8 位、 16 位、 32 位模式的处理器,通过芯片引脚EEDO( 65 脚)和 WAKEUP(79 脚)的复位值设置支持的处理器类型,如 16 位处理器只需将这两个引脚接低电平即可,其中 WAKEUP内部有 60K 下拉电阻,因此可悬空该引脚,或作为网卡芯片唤醒输出用。其它型号请参考相应的数据手册。图 1 DM9000 引脚如图所示,对处理器驱动网卡芯片来说,我们比较关心的有以下几个引脚: IOR、 IOW、AEN、 CMD( SA2)、 INT 、 RST,以及数据引脚 SD0-SD15-SD31

2、和地址引脚 SA4-SA9。其中,地址引脚配合 AEN引脚来选通该网卡芯片,对于大多数的应用来说没有意义,因为在我们的应用中一般只用一个网卡芯片,而这些地址引脚主要用于在多网卡芯片环境下选择其中之一。DM9000工作的默认基地址为 0x300 ,这里我们按照默认地址选择,将SA9、SA8 接高电平, SA7-DA4 接低电平。多网卡环境可以根据TXD0-TXD3 配置 SA4-SA7 来选择不同的网卡,这里不做介绍, 有兴趣的朋友请参考应用手册和数据手册。数据引脚SD0-SD31 则根据前面所讲的配置处理器模式与处理器的数据总线进行选择连接即可,没用到的引脚悬空。那么,除了地址、数据引脚外,剩

3、下的与处理器有关引脚对我们来说及其重要了,而与处理器无关的引脚,只需按照应用手册连接即可。IOR 和 IOW是 DM9000的读写选择引脚, 低电平有效, 即低电平时进行读 ( IOR)写( IOW)操作; AEN是芯片选通引脚,低电平有效,该引脚为低时才能进行读写操作;CMD的命令 / 数据切.换引脚,低电平时读写命令操作,高电平时读写数据操作。图2 读时序图3 写时序这些引脚接口和其它单片机外围器件的引脚接口基本相同,其使用也一样。对于有总线接口的单片机来说,如 51 系列, ARM等直接连接即可。对于没有总线接口的来说,如 AVR mega32等可以直接用 I/O 引脚模拟总线时序进行连

4、接。 连接时要参考读写时序, 如上图所示。 具体连接电路,有时间我再画出来,暂时先略了。二、编写驱动程序在这,我使用C 语言编写驱动程序,这需要非常注意一点,即处理器所用的C 编译器使用“大端格式”还是“小端格式”,这可以在相应处理器的C 编译器说明上找到。一般比较常见的是小端格式。而对于8 位处理器来说,在编写驱动程序时,可以不考虑,但是在编写网络协议的时候, 一定好考虑,因为网络协议的格式是大端格式,而大部分编译器或者我们习惯的是小端格式,这一点需要注意。在 DM9000中,只有两个可以直接被处理器访问的寄存器,这里命名为CMD端口和 DATA端口。事实上, DM9000中有许多控制和状态

5、寄存器(这些寄存器在上一篇文章中有详细的使用说明),但它们都不能直接被处理器访问,访问这些控制、状态寄存器的方法是:( 1)、将寄存器的地址写到CMD端口;( 2)、从 DATA端口读写寄存器中的数据;.1 、读、写寄存器其实, INDEX 端口和 DATA端口的就是由芯片上的CMD引脚来区分的。低电平为INDEX 端口,高电平为DATA端口。所以,要想实现读写寄存器,就必须先控制好CMD引脚。若使用总线接口连接DM9000的话,假设总线连接后芯片的基地址为0x800300 (24 根地址总线),只需如下方法:#define DM_ADD (*(volatile unsigned int *)

6、 0x8000300)#define DM_CMD (*(volatile unsigned int *) 0x8000304)/ 向 DM9000寄存器写数据void dm9000_reg_write(unsigned char reg, unsigned char data)udelay(20);/之前定义的微妙级延时函数,这里延时20usDM_ADD = reg;/将寄存器地址写到INDEX 端口udelay(20);DM_CMD = data;/将数据写到DATA端口,即写进寄存器/ 从 DM9000寄存器读数据unsigned int dm9000_reg_read(unsigned

7、 char reg)udelay(20);DM_ADD = reg;udelay(20);return DM_CMD;/将数据从寄存器中读出只得注意的是前面的两个宏定义 DM_ADD和 DM_CMD,定义的内容表示指向无符号整形变量的指针, 在这里 0x800300 是 DM9000命令端口的地址, 对它的赋值操作就相当于把数据写到该地址中,即把数据写到 DM9000的命令端口中。读的道理也一样。这是一种很常见的宏定义,一般在处理器中定义通用寄存器也是这样定义的。若没有总线接口的话,可以使用IO 口模拟总线时序的方法实现寄存器的读写。这里只说明实现步骤。 首先将处理器的 I/O 端口与 DM9

8、000的 IOR 等引脚直接相连 (电平匹配的情况下) ,又假设已经有宏定义“ IOR”I/O 端口控制 DM9000的 IOR 引脚,其它端口控制 DM9000引脚的命名相同,“ PIO1”(根据处理器情况,可以是8 位、 16 位或 32 位的 I/O 端口组成)控制数据端口。这样宏命名更直观些。写寄存器的函数如下:void dm9000_reg_write(unsigned char reg, unsigned char data).PIO1 = reg;AEN = 0;CMD = 0;IOR = 1;IOW = 0;udelay(1);AEN = 1;IOW = 1;udelay(20

9、);PIO1 = data;AEN = 0;CMD = 0;IOR = 1;IOW = 0;udelay(1);AEN = 1;IOW = 1;读寄存器的写法类似,这里就略一下了。这一过程看上去有些复杂,呵呵,其实执行起来也蛮有效率的, 执行时间差不多。 这种模拟总线时序的方式实际并不复杂, 只是把总线方式下自动执行的过程手动的执行了一遍而已。在 DM9000中,还有一些PHY寄存器,也称之为介质无关接口MII ( Media IndependentInterface)寄存器。对这些寄存器的操作会影响网卡芯片的初始化和网络连接,这里不对其进行操作,所以对这些寄存器的访问方法这里也略了(在上篇文

10、章中有介绍)。操作不当反而使网卡不能连接到网络。至此,我们已经写好了两个最基本的函数:dm9000_reg_write()和 dm9000_reg_read(),以及前面的宏定义DM_ADD和 DM_CMD。下面将一直用到。2 、初始化DM9000网卡芯片。初始化DM9000网卡芯片的过程,实质上就是填写、设置DM9000的控制寄存器的过程,这里以程序为例进行说明。其中寄存器的名称宏定义在DM9000.H中已定义好。注:一下函数中unsigned char为一个字节unsigned int为两个字节./DM9000 初始化void DM9000_init(void)unsigned int i

11、;IO0DIR |= 1 8;IO1CLR |= 1 8;udelay(500000);IO2SET |= 1 8;udelay(500000);IO1CLR |= 1 8;udelay(500000);/* 以上部分是利用一个IO 口控制 DM9000的 RST引脚,使其复位。 这一步可以省略, 可以用下面的软件复位代替 */dm9000_reg_write(GPCR, 0x01);/设置 GPCR(1EH) bit0=1 ,使 DM9000的 GPIO3 为输出。dm9000_reg_write(GPR, 0x00);/GPR bit0=0使 DM9000的 GPIO3输出为低以激活内部

12、PHY。udelay(5000);/延时 2ms 以上等待 PHY上电。dm9000_reg_write(NCR, 0x03);/软件复位udelay(30);/延时 20us 以上等待软件复位完成dm9000_reg_write(NCR, 0x00);/复位完成,设置正常工作模式。dm9000_reg_write(NCR, 0x03);/第二次软件复位,为了确保软件复位完全成功。此步骤是必要的。udelay(30);dm9000_reg_write(NCR, 0x00);/* 以上完成了 DM9000的复位操作 */dm9000_reg_write(NSR, 0x2c);/清除各种状态标志位dm9000_reg_write(ISR, 0x3f);/清除所有中断标志位/* 以上清除标志位 */dm9000_reg_write(RCR, 0x39);/接收控制dm9000_reg_write(TCR, 0x00);/发送控制dm9000_reg_write(BPTR, 0x3f);.dm9000_reg_write(FCTR, 0x3a);dm9000_reg_write(RTFCR, 0xff);dm9000_reg_write(SMCR, 0x00);/* 以上是功能控制,具体功能参考上一篇文章中的说明,或参考数据手册的介绍*/for(i=0; i6; i+)

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 幼儿/小学教育 > 幼儿教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号