学习笔记 --- DM9000网卡原理与基地址设置

前面有文章分析了网卡也是属于类内存总线的设备,类内存总线的设备有地址总线和数据总线,先来看下DM9000的管脚:

从上面可以看出DM9000的地址总线就一根,它不像CS8900那样地址总线和数据总线都齐全。而这里只有一根地址线(CMD),16跟数据线,所以可以确定位宽为16位,而地址线为什么只有一根,这是DM9000决定的,看手册可以知道CPU总线只访问它的两个地址,CMD管脚为0时,数据线送的是DM9000的寄存器地址,CMD管脚为1时,数据线上送的是16位的寄存器数据,所以对DM9000的操作至少需要两步:先写地址,再写(读)数据。他不像其他类内存总线那样直接把数据写到地址传输一次就可以了,而他要传输两次,因为他的总线地址就退化成了类似于NAND的ALE信号,就是地址和数据的区分信号了,而不是DM9000里面操作的寄存器地址。

上面的片选信号为:nLAN_CS,链接到S3C2440的CS4,对应BANK4,所以基地址为0X20000000,网上很多人讨论为什么有的开发板基地址设置为0X20000300,这个是没有任何作用的,之前分析了,DM9000对于CPU的地址线只认识一根线,只要这根线对应的CPU传送的地址的对应位匹配就可以了,上面接到LADDR2,也就是说:

传寄存器地址的时候操作的总线地址满足:

以基地址起头(0x20000000),偏移基地址LADDR2为0(低四位:0000),也就是写的时候总线地址为:0x20000000

传寄存器数据的时候操作的总线地址满足:

以基地址起头,偏移基地址LADDR2为1 (低四位:0100),也就是写的时候总线地址为:0x20000004

所以首先满足总线地址在BANK4里面(这样CS4才能自动选中),其次满足最后四位为0(传送寄存器地址)或4(传送数据)就可以了,满足这两个条件地址随便设

所以上面0x20000300这个多出的300H没任何意义,他满足上面条件,你设置为0x20000400,0x20000320,0x23456780这些地址都没任何影响


上面分析知道了基地址,位宽,再简要说下中断引脚:

这里的IRQ_LAN接的是S3C2440的ENT7,用的外部中断7,这个中断用于接收数据时触发的,中断服务函数处理接收数据,向协议层上报接收数据。这个中断号要和驱动里面的对应起来。


DM9000移植的要点:

1 基地址(看CS接口)

2 CPU的寄存器设置:位宽,时序等设置

3  设置中断号(看中断接口)
原文链接:https://blog.csdn.net/wangshuchangfrank/article/details/22588179?utm_source=blogxgwz7

 

 

上面的内容是转载的,下面补充本人理解的:

基地址的设置并不一定要0x2000 0000,只要满足在一定范围内,让片选使能;然后LADDR2为0则表示data线上传输的是地址,LADDR2为1表示data线上传输的是数据

 

主控芯片上面发出的地址,只不过决定了DM9000是否被片选,且ADDR2决定了是传输地址还是数据,仅此而已,而访问DM9000上某个寄存器所需的地址,是在数据线上传输的!!!!!!

在DM9000的厂家驱动程序里面,我们可以看到

		outb(DM9KS_VID_L, iobase); /* DM9000C的索引寄存器(cmd引脚为0) */		这里其实就是写 DM9KS_VID_L (0x28)这个值给DM9000,告诉他是地址(通过把ADDR2拉低的方式)id_val = inb(iobase + 4);  /* 读DM9000C的数据寄存器(cmd引脚为1) */	这里就是读取数据了(iobase + 4 表示传输的是数据),读出来到 id_val		这在第二个视频第二分钟的时候有讲到outb(DM9KS_VID_H, iobase);id_val |= inb(iobase + 4) << 8;outb(DM9KS_PID_L, iobase);id_val |= inb(iobase + 4) << 16;outb(DM9KS_PID_H, iobase);id_val |= inb(iobase + 4) << 24;

读DM9000上的寄存器的步骤如下:

把要读取的寄存器地址写到“索引寄存器”里面,然后再读数据寄存器。(怎么分辨操作的是索引寄存器还是数据寄存器呢?通过ADDR2的状态来决定)

 

CMD引脚一般都是接到主控的ADDR2引脚,包括DM9000的厂家程序也是默认如此,所以我们才不用改,如果我们不是把CMD接到ADDR2,而是ADDR1,那 iobase +4 就得改成 iobase + 2 了,但一般没有硬件工程师这么干,而是参照芯片厂家给出的参考电路图去设计的,所以大多数的开发板也都把主控的ADDR2接到DM9000的CMD引脚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Micrium/UCOS官网账号密码重新改问题

https://blog.csdn.net/qq_42312125/article/details/104122502

静态VLAN的配置

在一台交换机上连接3台PC机&#xff0c;然后创建两个VLAN&#xff0c;分别为VLAN 10 和VLAN 20&#xff0c;把第一台PC机分配给VLAN 10&#xff0c;把其他两台分配给VLAN 20.然后测试他们的互通情况。 在这里命令我用的都是简化命令&#xff0c;想卡完整版命令&#xff0c;请到…

静态路由原理

1、路由器的工作原理 路由工作简单原理图 1&#xff09;主机1.1要发生数据包给主机4.1.因为IP地址不在同一网段&#xff0c;所以主机会将数据包发送给本网段的网关路由器。 2&#xff09;路由器A 接收到数据包&#xff0c;先查看数据包IP首部中的目标IP地址。再查找自己的路由表…

静态路由和默认路由

一、静态路由的配置 下边实验对该拓扑图进行配置 实验目标&#xff1a;配置静态路由&#xff0c;实现全网互通 1、配置路由器R1 进入接口f0/0&#xff0c;配置IP&#xff0c;并开启。 进入接口f0/1&#xff0c;配置IP&#xff0c;并开启。 设置静态路由。 查看PC1的路由表 2、配…

IP地址192.168.1.1/24中的/24是什么意思

/24是指子网掩码的位数。 子网掩码的位数总共有32个&#xff0c;写的的/24个就是24个1&#xff0c;其它8位都是0。 /24就可以写成子网掩码是&#xff1a;11111111 11111111 11111111 00000000 例如&#xff1a; /25&#xff0c;就代表有25个1&#xff0c;7个0&#xff0c;…

VLAN与子网划分区别

转自&#xff1a;http://bbs.51cto.com/thread-1514066-1.html 经常看到论坛里有新手上来发贴说已经弄了VLAN了&#xff0c;为什么还要划分IP子网的问题。今天详细讲一下。 VLAN与IP子网&#xff08;划分&#xff09;的区别。有点类似于重量和质量的区别: 重量的的单位是牛顿&…

IP地址中A类、B类、C类地址的区别

区别如下&#xff1a; 1、IP地址表示方法不同&#xff1a; 一个A类IP地址是指&#xff0c; 在IP地址的四段号码中&#xff0c;第一段号码为网络号码&#xff0c;剩下的三段号码为本地计算机的号码。如果用二进制表示IP地址的话&#xff0c;A类IP地址就由1字节的网络地址和3字…

原始套接字简介

一 原始套接字概述 原始套接字&#xff0c;指在传输层下面使用的套接字。流式套接字和数据报套接字这两种套接字工作在传输层&#xff0c;主要为应用层的应用程序提供服务&#xff0c;并且在接收和发送时只能操作数据部分&#xff0c;而不能对IP首部或TCP和UDP首部进行操作&am…

原始socket例子

https://blog.csdn.net/qq_35426012/article/details/98858401 https://blog.51cto.com/u_13603157/2095503

Ucosii消息邮箱使用

https://blog.csdn.net/oyhb_1992/article/details/75270739 https://www.cnblogs.com/itloverhpu/p/3139511.html

ucosii中消息队列、消息邮箱、信号量的区别

1、用信号量进行行为同步时&#xff0c;只能提供同步的时刻信息&#xff0c;不能提供内容信息。若被控制方要求得到控制方的内容信息时&#xff0c;可以使用消息邮箱或消息队列。 2、但由于消息邮箱里只能存放一条消息&#xff0c;所以使用消息邮箱进行任务的同步时&#xff0c…

宏的使用 extern

https://www.cnblogs.com/chulin/p/9389254.html

#ifdef __cplusplus extern “C”的作用详解

https://blog.csdn.net/dayou1024/article/details/107017432

C++和C语言函数相互调用

C代码调用C函数&#xff1a; 在C中引用C语言中的函数和变量&#xff0c;在包含C语言头文件&#xff08;假设为cExample.h&#xff09;时&#xff0c;需进行下列处理&#xff1a; extern "C" { #include "cExample.h" } …

浅谈可重入函数与不可重入函数

浅谈可重入函数与不可重入函数【转】_shareinfo2018-CSDN博客_可重入函数

TCP socket心跳包示例程序

TCP socket心跳包示例程序_xqhrs232的专栏-CSDN博客_setsockopt 心跳包 原文地址::TCP socket心跳包示例程序_神奕的专栏-CSDN博客_tcp心跳包 相关文章 1、Linux网络编程--服务端判断客户端断开的经验方法 ----Linux网络编程--服务端判断客户端断开的经验方法_志存高远-CSDN博…

sizeof()计算结构体的大小

原文链接&#xff1a;sizeof()计算结构体的大小_海月汐辰-CSDN博客_结构体的sizeof怎么计算 简要说明&#xff1a;结构体成员按照定义时的顺序依次存储在连续的内存空间&#xff0c;但是结构体的大小并不是简单的把所有成员大小相加&#xff0c;而是遵循一定的规则&#xff0c…

Shell export命令

Shell&#xff1a;export命令 - 百度文库

Linux select 实现并发服务器和客户端

转载&#xff1a;http://blog.csdn.net/szkbsgy/article/details/10558881 [cpp] view plaincopy <span style"font-size:18px;">服务端&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys…

总线/通信笔记3 —— PDO与SDO的区别

PDO&#xff1a;过程数据对象&#xff08;Process Data Object&#xff09;&#xff0c;过程数据的发送&#xff0c;实时、速度快&#xff0c;提供对设备应用对象的直接访问通道&#xff0c;它用来传输实时短帧数据&#xff0c;具有较高的优先权。PDO 传输的数据必须少于或等于…