没有合适的资源?快使用搜索试试~ 我知道了~
单片机驱动DM9000网卡芯片(详细调试过程).pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 90 浏览量
2021-10-04
04:44:25
上传
评论 1
收藏 33KB PDF 举报
温馨提示
试读
23页
单片机驱动DM9000网卡芯片(详细调试过程).pdf
资源推荐
资源详情
资源评论
单片机驱动 DM9000 网卡芯片(详细调试过程)【上和下】
和其它网卡芯片不同, DM9000系列网卡芯片在嵌入式开发板上很常见,尤其是有关 ARM-Linux
的开发板上的网络连接部分几乎都是采用该芯片完成的。 当然, 其它网卡芯片, 如 RTL8019 的应
用也很常见, 在很多开发板上得到应用然而 RTL8019 的介绍在网上可以找到非常详细的介绍, 尤
其是用单片机对其做底层驱动的介绍非常丰富。 下面的网站就介绍了用 AVR驱动 RTL8019 网卡芯
片的非常详细的过程,有兴趣的朋友可以参考一下。
http://members.home.nl/bzijlstra/software/examples/RTL8019as.htm AVR 驱动 RTL8019 网
卡芯片的详细介绍。
言归正传。在网上也能找到许多关于 DM9000网卡芯片的介绍,然而这些介绍大多是关于
Linux 或 WinCE下的驱动程序或移植,很少有介绍单片机驱动 DM9000的例子。因此我在这里把
我调试 DM9000E的过程详细说明一下,仅供参考。
本文主要介绍单片机驱动 DM9000E网卡芯片的详细过程。 从网卡电路的连接, 到网卡初始化
相关程序调试,再到 ARP协议的实现,一步一步详细介绍调试过程。如果有时间也会把 UDP和
TCP通讯实验过程写出来。当然,会用单片机编写 DM9000的驱动,再想编写 ARM下的 Linux 的
驱动就容易的多了。在调试之前,应该先参考两份技术文档,可以从下面网站中下载。
DM9000E.pdf (芯片数据资料)和 DM9000 Application Notes Ver 1_22 061104.pdf (应用手册)
http://www.davicom.com.tw
或者
DM9000 Datasheet VF03:
http://www.davicom.com.tw/userfile/24247/DM9000-DS-F03-041906_1.pdf
DM9000A Datasheet:
http://www.davicom.com.tw/userfile/24247/DM9000A-DS-F01-101906.pdf
DM9000 Application Notes V1.22
http://www.davicom.com.tw/big5/download/Data%20Sheet/DM9000_Application_Notes_Ver_1
_22%20061104.pdf
一、电路连接
DM9000E 网卡芯片支持 8 位、 16 位、 32 位模式的处理器,通过芯片引脚 EEDO(65 脚)和
WAKEUP(79 脚)的复位值设置支持的处理器类型,如 16 位处理器只需将这两个引脚接低电平即
可,其中 WAKEUP内部有 60K 下拉电阻,因此可悬空该引脚,或作为网卡芯片唤醒输出用。其它
型号请参考相应的数据手册。
图 1 DM9000 引脚
如图所示,对处理器驱动网卡芯片来说,我们比较关心的有以下几个引脚: IOR、IOW、AEN、
CMD(SA2)、 INT、RST,以及数据引脚 SD0-SD15-SD31和地址引脚 SA4-SA9。其中, 地址引脚配
合 AEN引脚来选通该网卡芯片 ,对于大多数的应用来说没有意义, 因为在我们的应用中一般只用
一个网卡芯片,而这些地址引脚主要用于在多网卡芯片环境下选择其中之一。 DM9000工作的默
认基地址为 0x300 ,这里我们按照默认地址选择,将 SA9、SA8接高电平, SA7-DA4接低电平 。多
网卡环境可以根据 TXD0-TXD3配置 SA4-SA7 来选择不同的网卡, 这里不做介绍, 有兴趣的朋友请
参考应用手册和数据手册。数据引脚 SD0-SD31则根据前面所讲的配置处理器模式与处理器的数
据总线进行选择连接即可,没用到的引脚悬空。那么,除了地址、数据引脚外,剩下的与处理器
有关引脚对我们来说及其重要了,而与处理器无关的引脚,只需按照应用手册连接即可。
IOR 和 IOW是 DM9000的读写选择引脚,低电平有效,即低电平时进行读( IOR)写( IOW)操作;
AEN是芯片选通引脚, 低电平有效, 该引脚为低时才能进行读写操作; CMD的命令 / 数据切换引脚,
低电平时读写命令操作,高电平时读写数据操作。
图 2 读时序
图 3 写时序
这些引脚接口和其它单片机外围器件的引脚接口基本相同, 其使用也一样。 对于有总线接口
的单片机来说,如 51 系列, ARM等直接连接即可。对于没有总线接口的来说,如 AVR mega32 等
可以直接用 I/O 引脚模拟总线时序进行连接。 连接时要参考读写时序, 如上图所示。 具体连接电
路,有时间我再画出来,暂时先略了。
二、编写驱动程序
在这,我使用 C 语言编写驱动程序, 这需要非常注意一点, 即处理器所用的 C编译器使用 “大
端格式”还是“小端格式”,这可以在相应处理器的 C编译器说明上找到。一般比较常见的是小
端格式。 而对于 8 位处理器来说, 在编写驱动程序时, 可以不考虑, 但是在编写网络协议的时候,
一定好考虑, 因为网络协议的格式是大端格式, 而大部分编译器或者我们习惯的是小端格式, 这
一点需要注意。
在 DM9000中,只有两个可以直接被处理器访问的寄存器, 这里命名为 CMD端口和 DATA端口。
事实上, DM9000中有许多控制和状态寄存器(这些寄存器在上一篇文章中有详细的使用说明),
但它们都不能直接被处理器访问,访问这些控制、状态寄存器的方法是:
(1)、将寄存器的地址写到 CMD端口;
(2)、从 DATA端口读写寄存器中的数据;
1 、读、写寄存器
其实,INDEX端口和 DATA端口的就是由芯片上的 CMD引脚来区分的。 低电平为 INDEX(ADDRESS)
端口,高电平为 DATA端口。所以,要想实现读写寄存器,就必须先控制好 CMD引脚。
若使用总线接口连接 DM9000的话, 假设总线连接后芯片的基地址为 0x800300(24 根地址总
线),只需如下方法:
#define DM_ADD (*((volatile unsigned int *) 0x8000300))
#define DM_CMD (*((volatile unsigned int *) 0x8000304))
// 向 DM9000寄存器写数据
void dm9000_reg_write(unsigned char reg, unsigned char data)
{
udelay(20);// 之前定义的微妙级延时函数,这里延时 20us
DM_ADD = reg;// 将寄存器地址写到 INDEX端口
udelay(20);
DM_CMD = data;// 将数据写到 DATA端口,即写进寄存器
}
// 从 DM9000寄存器读数据
unsigned int dm9000_reg_read(unsigned char reg)
{
udelay(20);
DM_ADD = reg;
udelay(20);
return DM_CMD;// 将数据从寄存器中读出
}
只得注意的是前面的两个宏定义 DM_ADD和 DM_CMD,定义的内容表示指向无符号整形变量的
指针 ,在这里 0x800300 是 DM9000命令端口的地址, 对它的赋值操作就相当于把数据写到该地址
中,即把数据写到 DM9000的命令端口中。读的道理也一样。 这是一种很常见的宏定义,一般在
处理器中定义通用寄存器也是这样定义的 。
若没有总线接口的话,可以使用 IO 口模拟总线时序的方法实现寄存器的读写。 这里只说明
实现步骤。首先将处理器的 I/O 端口与 DM9000的 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);
PIO1 = data;
AEN = 0;
CMD = 0;
IOR = 1;
IOW = 0;
udelay(1);
AEN = 1;
IOW = 1;
}
读寄存器的写法类似,这里就略一下了。 这一过程看上去有些复杂, 呵呵, 其实执行起来也
蛮有效率的, 执行时间差不多。 这种模拟总线时序的方式实际并不复杂, 只是把总线方式下自动
执行的过程手动的执行了一遍而已。
在 DM9000中,还有一些 PHY寄存器,也称之为介质无关接口 MII (Media Independent
Interface )寄存器。对这些寄存器的操作会影响网卡芯片的初始化和网络连接,这里不对其进
行操作,所以对这些寄存器的访问方法这里也略了(在上篇文章中有介绍)。 操作不当反而使网
卡不能连接到网络。
至此,我们已经写好了两个最基本的函数: 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;
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) bit[0]=1 ,使 DM9000的 GPIO0~3为输
出。
剩余22页未读,继续阅读
资源评论
- qq_415701602022-06-30用户下载后在一定时间内未进行评价,系统默认好评。
qq_58157133
- 粉丝: 12
- 资源: 11万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功