为您推荐:
精华内容
最热下载
问答
  • 5星
    1.46MB u010091262 2021-04-15 10:33:02
  • 5星
    189KB ldk99_ 2021-04-09 15:52:03
  • 5星
    26KB sinat_36710456 2021-04-20 09:54:23
  • 5星
    12KB GJZGRB 2021-03-05 17:14:38
  • 5星
    122KB qq_17291113 2014-07-27 16:02:48
  • 很多台式机没有无线网卡,只能插网线。想要使用WiFi,插个USB无线网卡就行,简单方便:USB无线网卡非常小巧,以至于会好奇,电路板是怎么塞进去的:下面拆解其中某个厂家的一款:另一个角度:...

    很多台式机没有无线网卡,只能插网线。

    想要使用WiFi,插个USB无线网卡就行,简单方便:

    USB无线网卡非常小巧,以至于会好奇,电路板是怎么塞进去的:

    下面拆解其中某个厂家的一款:

    另一个角度:

    撬开伸出来的用塑料包括的部分,看到了浅蓝色的天线:

    整个电路板拿了出来,露出了小巧而紧凑的电路板,非常漂亮:

    USB无线网卡采用REALTEK瑞昱半导体的解决方案,芯片型号是RTL8188CUS:

    陶瓷天线的局部细节图,用陶瓷天线主要是因为它的体积小:

    电路板的背面见下图。

    上面有一个封装为SOT23-5的黑色芯片,它是一个电源芯片,有5个脚,实现是5V转3.3V的功能:

    将关键的元器件拆下来,下图中从左到右,从上到下分别是:

    1、蓝色的陶瓷天线;

    2、金黄色的晶振;

    3、黑色的主芯片RTL8188CUS;

    5、5V转3.3V的电源芯片。

    主芯片的内部电路,拆的时候有损坏:

    微观的电路世界真美:

    将晶振开盖,看看里面的样子:

    对比看一下用同样芯片方案做的USB WiFi模块:(以及妹纸没有修指甲的手)

    这个模块同样小巧,但是因为用了PCB天线,所以相对大一些:

    标注一下关键的元器件:

    REALTEK瑞昱半导体RTL8188的这个软硬件解决方案很成熟,已经量产多年,但不确定是否仍是当下有竞争力的解决方案。

    本文主要是美图赏析,如果想自行制作,找芯片代理商拿原理图等参考设计资料就行,非常简单。

    最后说声抱歉,因为最近有点事在忙,更新变慢了。

    后面更新的频率应该会高一些。

    本文就到这里,下次再见啦!


    推荐阅读:

    专辑|Linux文章汇总

    专辑|程序人生

    专辑|C语言

    我的知识小密圈

    关注公众号,后台回复「1024」获取学习资料网盘链接。

    欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

    展开全文
    weiqifa0 2021-05-14 00:11:24
  • 44.97MB qq_38491826 2018-08-23 19:35:00
  • 如果在5年前,或许网卡与您无关,但在如今这网络的时代,无论是上网冲浪还是联网玩游戏,都离不开网卡,更何况,就算您不食人间烟火,多数主板上也会为您集成一块板载网卡。所以,对于想迈入网络之门的读者而言,先...

    PHY指物理层,OSI的最底层。 
    一般指与外部信号接口的芯片。 
    以太网PHY芯片 
           网络中最基础的部件是什么?不是交换机也不是路由器,而是小小的不起眼但又无处不在的网卡。如果在5年前,或许网卡与您无关,但在如今这网络的时代,无论是上网冲浪还是联网玩游戏,都离不开网卡,更何况,就算您不食人间烟火,多数主板上也会为您集成一块板载网卡。所以,对于想迈入网络之门的读者而言,先认识网卡,会让您在进行各种网络应用时更得心应手。  
    一、网卡的主要特点  
           网卡(Network Interface Card,简称NIC),也称网络适配器,是电脑与局域网相互连接的设备。无论是普通电脑还是高端服务器,只要连接到局域网,就都需要安装一块网卡。如果有必要,一台电脑也可以同时安装两块或多块网卡。  
    电脑之间在进行相互通讯时,数据不是以流而是以帧的方式进行传输的。我们可以把帧看做是一种数据包,在数据包中不仅包含有数据信息,而且还包含有数据的发送地、接收地信息和数据的校验信息。一块网卡包括OSI模型的两个层——物理层和数据链路层。物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。数据链路层则提供寻址机构、数据帧的构建、数据差错检查、传送控制、向网络层提供标准的数据接口等功能。  
    网卡的功能主要有两个:一是将电脑的数据封装为帧,并通过网线(对无线网络来说就是电磁波)将数据发送到网络上去;二是接收网络上其它设备传过来的帧,并将帧重新组合成数据,发送到所在的电脑中。网卡能接收所有在网络上传输的信号,但正常情况下只接受发送到该电脑的帧和广播帧,将其余的帧丢弃。然后,传送到系统CPU做进一步处理。当电脑发送数据时,网卡等待合适的时间将分组插入到数据流中。接收系统通知电脑消息是否完整地到达,如果出现问题,将要求对方重新发送。

    需要说明的是网卡芯片也有“软硬”之分,特别是对与主板板载(LOM)的网卡芯片来说更是如此,这是怎么回事呢?大家知道,以太网接口可分为协议层和物理层。 
    协议层是由一个叫MAC(Media Access Layer,媒体访问层)控制器的单一模块实现。 
    物理层由两部分组成,即PHY(Physical Layer,物理层)和传输器。 
    常见的网卡芯片都是把MAC和PHY集成在一个芯片中,但目前很多主板的南桥芯片已包含了以太网MAC控制功能,只是未提供物理层接口,因此,需外接PHY芯片以提供以太网的接入通道。这类PHY网络芯片就是俗称的“软网卡芯片”,常见的PHY功能的芯片有RTL8201BL、VT6103等等。 
    “软网卡”一般将网络控制芯片的运算部分交由处理器或南桥芯片处理,以简化线路设计,从而降低成本,但其多少会更多占用系统资源

    二、图解网卡  
          以最常见的PCI接口的网卡为例,一块网卡主要由PCB线路板、主芯片、数据汞、金手指(总线插槽接口)、BOOTROM、EEPROM、晶振、RJ45接口、指示灯、固定片等等,以及一些二极管、电阻电容等组成。下面我们就来分别了解一下其中主要部件。  
    ●主芯片  
          网卡的主控制芯片是网卡的核心元件,一块网卡性能的好坏和功能的强弱多寡,主要就是看这块芯片的质量。以常见的Realtek公司推出的RTL8139C和RTL8139D为例,二者首先在封装上略有不同,前者是128pin QFP/LQFP而后者为100pin,其次在搭配的EEPROM上,8139C比后者多出了对93c56的支持,而8139D是93C46。但是在功能方面,8139D更强一些,它多提供了对PCI Multi-function和PCI-bridge I/F的支持,PCI Multi-function允许把RTL8139D芯片和其他的功能芯片(如硬件调制解调芯片)设计在同块PCB板上协同工作来做成不同种类的多功能卡,在其中8139起的作用是辨别LAN信号还是PCI总线信号的作用;8139D还增强了电源管理功能。  
    如果按网卡主芯片的速度来划分,常见的10/100M自适应网卡芯片有Realtek 8139系列/810X系列、VIA VT610*系列、Intel 82550PM/82559系列、Broadcom 44xx系列、3COM 3C920系列、Davicom DM9102、Mxic MX98715等等。  
    常见的10/100/1000M自适应网卡芯片有Intel的8254*系列,Broadcom的BCM57**系列,Marvell的88E8001/88E8053/88E806*系列,Realtek的RTL8169S-32/64、RTL8110S-32/64(LOM)、RTL8169SB、RTL8110SB(LOM)、RTL8168(PCI Express)、RTL8111(LOM、PCI Express)系列,VIA的VT612*系列等等。  
    Marvell的88E8001千兆芯片  
           需要说明的是网卡芯片也有“软硬”之分,特别是对与主板板载(LOM)的网卡芯片来说更是如此,这是怎么回事呢?大家知道,以太网接口可分为协议层和物理层。  
    协议层是由一个叫MAC(Media Access Layer,媒体访问层)控制器的单一模块实现。  
    物理层由两部分组成,即PHY(Physical Layer,物理层)和传输器。  
    常见的网卡芯片都是把MAC和PHY集成在一个芯片中,但目前很多主板的南桥芯片已包含了以太网MAC控制功能,只是未提供物理层接口,因此,需外接PHY芯片以提供以太网的接入通道。这类PHY网络芯片就是俗称的“软网卡芯片”,常见的PHY功能的芯片有RTL8201BL、VT6103等等。  
           “软网卡”一般将网络控制芯片的运算部分交由处理器或南桥芯片处理,以简化线路设计,从而降低成本,但其多少会更多占用系统资源.  
    ●BOOTROM  
           BOOTROM插座也就是常说的无盘启动ROM接口,其是用来通过远程启动服务构造无盘工作站的。远程启动服务(Remoteboot,通常也叫RPL)使通过使用服务器硬盘上的软件来代替工作站硬盘引导一台网络上的工作站成为可能。网卡上必须装有一个RPL(Remote Program Load远程初始程序加载)ROM芯片才能实现无盘启动,每一种RPL ROM芯片都是为一类特定的网络接口卡而制作的,它们之间不能互换。带有RPL的网络接口卡发出引导记录请求的广播(broadcasts),服务器自动的建立一个连接来响应它,并加载MS-DOS启动文件到工作站的内存中。  
           此外,在BOOTROM插槽中心一般还有一颗93C46、93LC46或93c56的EEPROM芯片(93C56是128*16bit的EEPROM,而93C46是64*16bit的EEPROM),它相当于网卡的BIOS,里面记录了网卡芯片的供应商ID、子系统供应商ID、网卡的MAC地址、网卡的一些配置,如总线上PHY的地址,BOOTROM的容量,是否启用BOOTROM引导系统等内容。主板板载网卡的EEPROM信息一般集成在主板BIOS中。  
    ●LED指示灯  
           一般来讲,每块网卡都具有1个以上的LED(Light Emitting Diode发光二极管)指示灯,用来表示网卡的不同工作状态,以方便我们查看网卡是否工作正常。典型的LED指示灯有Link/Act、Full、Power等。Link/Act表示连接活动状态,Full表示是否全双工(Full Duplex),而Power是电源指示(主要用在USB或PCMCIA网卡上)等。  
    ●网络唤醒接口  
           早期网卡上还有一个专门的3芯插座网络唤醒(WOL)接口(PCI2.1标准网卡),Wake On LAN(网络唤醒)提供了远程唤醒计算机的功能,它是IBM公司和Intel公司于1996年10月成立的先进管理性联盟(Advanced Manageability Alliance)的一项成果,它可以让管理员在非工作时间远程唤醒计算机,并使它们自动完成一些管理服务,例如软件的更新或者病毒扫描。它也是Wired for Management基本规范中的一部分。网络唤醒的工作原理是先由一个管理软件包发出一个基于Magic Packet标准的唤醒帧,支持网络唤醒的网卡收到唤醒帧后对其进行分析并确定该帧是否包含本网卡的MAC地址。如果包含本网卡的MAC地址,该计算机系统就会自动进入开机状态。  
    目前主流的独立网卡或主板板载网卡都符合PCI2.2及以上的规范,所以不再需要这个接口,要启动网络唤醒功能,只需到主板BIOS中启用“Wake on PCI Card”功能即可。  
    ●数据汞  
           数据汞是消费级PCI网卡上都具备的设备,数据汞也被叫做网络变压器或可称为网络隔离变压器。它在一块网卡上所起的作用主要有两个,一是传输数据,它把PHY送出来的差分信号用差模耦合的线圈耦合滤波以增强信号,并且通过电磁场的转换耦合到不同电平的连接网线的另外一端;一是隔离网线连接的不同网络设备间的不同电平,以防止不同电压通过网线传输损坏设备。除此而外,数据汞还能对设备起到一定的防雷保护作用。  
    ●晶振  
           晶振是石英振荡器的简称,英文名为Crystal,它是时钟电路中最重要的部件,它的作用是向显卡、网卡、主板等配件的各部分提供基准频率,它就像个标尺,工作频率不稳定会造成相关设备工作频率不稳定,自然容易出现问题。由于制造工艺不断提高,现在晶振的频率偏差、温度稳定性、老化率、密封性等重要技术指标都很好,已不容易出现故障,但在选用时仍可留意一下晶振的质量。  
    例如某网卡的时钟电路采用了高精度的SKO25MHz的晶振,较可*保证了数据传输的精确同步性,大大减少了丢包的可能性,并且在线路的设计上尽量*近主芯片,使信号走线的长度大大缩短,可*性进一步增加。而如果采用劣质晶振,这样做虽然可以降低一点网卡成本,但因为频率的准确性问题,极易造成传输过程中的数据丢包的情况。  
    ●网线接口  
           在桌面消费级网卡中常见网卡接口有BNC接口和RJ-45接口(类似电话的接口),也有两种接口均有的双口网卡。接口的选择与网络布线形式有关,在小型共享式局域网中,BNC口网卡通过同轴电缆直接与其它计算机和服务器相连;RJ-45口网卡通过双绞线连接集线器(HUB)或交换机,再通过集线器或交换机连接其它计算机和服务器。  
    目前BNC接口这种接口类型的网卡已很少见,主要因为用细同轴电缆作为传输介质的网络就比较少及组网方式问题较多有关。RJ-45是8芯线,而电话线的接口是4芯的,通常只接2芯线(ISDN的电话线接4芯线);但大家可以仔细看看,其实10M网卡的RJ-45插口也只用了1、2、3、6四根针,而100M或1000M网卡的则是八根针都是全的,这也是区别10M和100M网卡的一种方法(见上图8)。  
    ●传输介质类型  
           说到网卡,就顺便就谈谈与网卡连接的双绞线。  
    双绞线,是由许多在一个绝缘外套中的对线组成的数据传输线,它的特点就是价格便宜,现在的网卡大部分都是使用的双绞线做为传输线缆。双绞线一般用于星型网的布线连接,两端安装有RJ-45头(水晶头),连接网卡与集线器,最大网线长度为100米左右。  
    双绞线有STP(屏蔽双绞线)和UTP(非屏蔽双绞线)两种。STP的双绞线内有一层金属隔离膜,在数据传输时可减少电磁干扰,所以它的稳定性较高。而UTP内没有这层金属膜,所以它的稳定性较差,但它的优势就是价格便宜。其中STP(屏蔽双绞线)主要分为3类和5类两种线,UTP(非屏蔽双绞线)主要分为3类/4类/5类/超5类/6类几种,一般网络主要使用的是5类双绞线,5类双绞线外层保护胶皮厚,胶皮上标注“CAT5”字样。超5类双绞线属非屏蔽双绞线,与普通5类双绞线比较,超5类双绞线在传送信号时衰减更小,抗干扰能力更强,在100M网络中,用户设备的受干扰程度只有普通5类线的1/4,其也是目前应用的主流。  
    ●总线接口  
           网卡要与电脑相连接才能正常使用,电脑上各种接口层出不穷,这也造成了网卡所采用的总线接口类型纷呈。此外,提到总线接口,需要说明的是人们一般将这类接口俗称为“金手指”,为什么叫金手指呢?是因为这类插卡的线脚采用的是镀钛金(或其它金属),保证了反复插拔时的可*接触,既增大了自身的抗干扰能力又减少了对其他设备的干扰。  
    为了方便您了解,下面我们就分别来图解一下常见的各种接口类型的网卡。  
    ①ISA接口网卡  
           ISA是早期网卡使用的一种总线接口,ISA网卡采用程序请求I/O方式与CPU进行通信,这种方式的网络传输速率低,CPU资源占用大,其多为10M网卡,目前在市面上基本上看不到有ISA总线类型的网卡,笔者从旧件堆中找到了几款ISA网卡,D-LINK的产品,居然用橡皮擦清洁金手指上机后还能用。  
    ②PCI接口网卡  
           PCI(peripheral component interconnect)总线插槽仍是目前主板上最基本的接口。其基于32位数据总线,可扩展为64位,它的工作频率为33MHz/66MHz。数据传输率为每秒132MB(32*33MHz/8)。目前PCI接口网卡仍是家用消费级市场上的绝对主流。  
    ③PCI-X接口网卡  
          PCI-X是PCI总线的一种扩展架构,它与PCI总线不同的是,PCI总线必须频繁的于目标设备和总线之间交换数据,而PCI-X则允许目标设备仅于单个PCI-X设备看已进行交换,同时,如果PCI-X设备没有任何数据传送,总线会自动将PCI-X设备移除,以减少PCI设备间的等待周期。所以,在相同的频率下,PCI-X将能提供比PCI高14-35%的性能。目前服务器网卡经常采用此类接口的网卡。  
    ④PCI-E接口网卡  
           PCI Express 1X接口已成为目前主流主板的必备接口。不同与并行传输,PCI Express接口采用点对点的串行连接方式,PCI Express接口根据总线接口对位宽的要求不同而有所差异,分为PCI Express 1X(标准250MB/s,双向500MB/s)、2X(标准500MB/s)、4X(1GB/s)、8X(2GB/s)、16X(4GB/s)、32X(8GB/s)。采用PCI-E接口的网卡多为千兆网卡。  
    ⑤USB接口网卡  
           在目前的电脑上很难找到没有USB接口(Universal Serial Bus,通用串行总线)的,USB总线分为USB2.0和USB1.1标准。USB1.1标准的传输速率的理论值是12Mbps,而USB2.0标准的传输速率可以高达480Mbps,目前的USB有线网卡多为USB2.0标准的。  
    ⑥PCMCIA接口网卡  
          PCMCIA接口是笔记本电脑专用接口,PCMCIA总线分为两类,一类为16位的PCMCIA,另一类为32位的CardBus,CardBus网卡的最大吞吐量接近90Mbps,其是目前市售笔记本网卡的主流。  
    ⑦Mini-PCI接口网卡  
            MiniPCI接口是在台式机PCI接口基础上扩展出的适用于笔记本电脑的接口标准,其速度和PCI标准相当,很多此类产品都是无线网卡。  
    除此而外,市场上还有AMR等接口的网卡等等,限于篇幅及其流行度,本文就不一一介绍了。

    展开全文
    gang_life 2015-11-24 16:58:54
  • 49KB yjc58 2013-11-13 17:32:25
  • 一、网卡 网卡(Network Interface Card,简称NIC),也称网络适配器,是电脑与局域网相互连接的设备。无论是普通电脑还是高端...物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路

    一、网卡

    网卡(Network Interface Card,简称NIC),也称网络适配器,是电脑与局域网相互连接的设备。无论是普通电脑还是高端服务器,只要连接到局域网,就都需要安装一块网卡。

    电脑之间在进行相互通讯时,数据不是以流而是以帧的方式进行传输的。我们可以把帧看做是一种数据包,在数据包中不仅包含有数据信息,而且还包含有数据的发送地、接收地信息和数据的校验信息。一块网卡包括OSI模型的两个层——物理层和数据链路层。物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。数据链路层则提供寻址机构、数据帧的构建、数据差错检查、传送控制、向网络层提供标准的数据接口等功能。  

    网卡的功能主要有两个:一是将电脑的数据封装为帧,并通过网线(对无线网络来说就是电磁波)将数据发送到网络上去;二是接收网络上其它设备传过来的帧,并将帧重新组合成数据,发送到所在的电脑中。网卡能接收所有在网络上传输的信号,但正常情况下只接受发送到该电脑的帧和广播帧,将其余的帧丢弃。然后,传送到系统CPU做进一步处理。当电脑发送数据时,网卡等待合适的时间将分组插入到数据流中。接收系统通知电脑消息是否完整地到达,如果出现问题,将要求对方重新发送。

    二、网卡的软硬之分

    以太网接口分为协议层(MAC,媒体访问层)和物理层(PHY+传输器)组成。

    • 硬网卡是指常见的将MAC和PHY集成在一个芯片的网卡。
    • 而目前也有很多主板的南桥芯片已包含了以太网MAC控制功能,只是未提供物理层接口,因此需要外接PHY芯片以提供以太网的接入通道。这类PHY网络芯片就是俗称的“软网卡芯片”,常见的有RTL8201BL、VT6103等等。“软网卡”一般讲网络控制芯片的运算部分交由处理器或南桥芯片处理,以简化电路从而降低成本。

    三、网卡的总线接口        

    网卡要与电脑相连接才能正常使用,电脑上各种接口层出不穷,这也造成了网卡所采用的总线接口类型纷呈。此外,提到总线接口,需要说明的是人们一般将这类接口俗称为“金手指”,为什么叫金手指呢?是因为这类插卡的线脚采用的是镀钛金(或其它金属),保证了反复插拔时的可*接触,既增大了自身的抗干扰能力又减少了对其他设备的干扰。  
    为了方便您了解,下面我们就分别来图解一下常见的各种接口类型的网卡。  

    ①ISA接口网卡  

           ISA是早期网卡使用的一种总线接口,ISA网卡采用程序请求I/O方式与CPU进行通信,这种方式的网络传输速率低,CPU资源占用大,其多为10M网卡,目前在市面上基本上看不到有ISA总线类型的网卡,笔者从旧件堆中找到了几款ISA网卡,D-LINK的产品,居然用橡皮擦清洁金手指上机后还能用。  

    ②PCI接口网卡  

           PCI(peripheral component interconnect)总线插槽仍是目前主板上最基本的接口。其基于32位数据总线,可扩展为64位,它的工作频率为33MHz/66MHz。数据传输率为每秒132MB(32*33MHz/8)。目前PCI接口网卡仍是家用消费级市场上的绝对主流。 

    ③PCI-X接口网卡  

          PCI-X是PCI总线的一种扩展架构,它与PCI总线不同的是,PCI总线必须频繁的于目标设备和总线之间交换数据,而PCI-X则允许目标设备仅于单个PCI-X设备看已进行交换,同时,如果PCI-X设备没有任何数据传送,总线会自动将PCI-X设备移除,以减少PCI设备间的等待周期。所以,在相同的频率下,PCI-X将能提供比PCI高14-35%的性能。目前服务器网卡经常采用此类接口的网卡。  
    ④PCI-E接口网卡  
           PCI Express 1X接口已成为目前主流主板的必备接口。不同与并行传输,PCI Express接口采用点对点的串行连接方式,PCI Express接口根据总线接口对位宽的要求不同而有所差异,分为PCI Express 1X(标准250MB/s,双向500MB/s)、2X(标准500MB/s)、4X(1GB/s)、8X(2GB/s)、16X(4GB/s)、32X(8GB/s)。采用PCI-E接口的网卡多为千兆网卡。  

    ⑤USB接口网卡  

           在目前的电脑上很难找到没有USB接口(Universal Serial Bus,通用串行总线)的,USB总线分为USB2.0和USB1.1标准。USB1.1标准的传输速率的理论值是12Mbps,而USB2.0标准的传输速率可以高达480Mbps,目前的USB有线网卡多为USB2.0标准的。  

    ⑥PCMCIA接口网卡  

          PCMCIA接口是笔记本电脑专用接口,PCMCIA总线分为两类,一类为16位的PCMCIA,另一类为32位的CardBus,CardBus网卡的最大吞吐量接近90Mbps,其是目前市售笔记本网卡的主流。  

    ⑦Mini-PCI接口网卡  
            MiniPCI接口是在台式机PCI接口基础上扩展出的适用于笔记本电脑的接口标准,其速度和PCI标准相当,很多此类产品都是无线网卡。  

     

     

    展开全文
    weixin_44890250 2020-10-20 19:21:12
  • 5星
    558KB tliang1984 2019-09-25 14:46:20
  • 和其它网卡芯片不同,DM9000系列网卡芯片在嵌入式开发板上很常见,尤其是有关ARM-Linux的开发板上的网络连接部分几乎都是采用该芯片完成的。当然,其它网卡芯片,如RTL8019的应用也很常见,在很多开发板上得到应用...

    和其它网卡芯片不同,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下拉电阻,因此可悬空该引脚,或作为网卡芯片唤醒输出用。其它型号请参考相应的数据手册。

    clip_image001

    图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的命令/数据切换引脚,低电平时读写命令操作,高电平时读写数据操作。 clip_image002

    图2 读时序

    clip_image003

    图3 写时序

    这些引脚接口和其它单片机外围器件的引脚接口基本相同,其使用也一样。对于有总线接口的单片机来说,如51系列,ARM等直接连接即可。对于没有总线接口的来说,如AVR mega32等可以直接用I/O引脚模拟总线时序进行连接。连接时要参考读写时序,如上图所示。具体连接电路,有时间我再画出来,暂时先略了。

    二、编写驱动程序

    在这,我使用C语言编写驱动程序,这需要非常注意一点,即处理器所用的C编译器使用“大端格式”还是“小端格式”,这可以在相应处理器的C编译器说明上找到。一般比较常见的是小端格式。而对于8位处理器来说,在编写驱动程序时,可以不考虑,但是在编写网络协议的时候,一定好考虑,因为网络协议的格式是大端格式,而大部分编译器或者我们习惯的是小端格式,这一点需要注意。

    在DM9000中,只有两个可以直接被处理器访问的寄存器,这里命名为CMD端口和DATA端口。事实上,DM9000中有许多控制和状态寄存器(这些寄存器在上一篇文章中有详细的使用说明),但它们都不能直接被处理器访问,访问这些控制、状态寄存器的方法是:

    (1)、将寄存器的地址写到CMD端口;

    (2)、从DATA端口读写寄存器中的数据;

        1、读、写寄存器

    其实,INDEX端口和DATA端口的就是由芯片上的CMD引脚来区分的。低电平为INDEX端口,高电平为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的GPIO3为输出。

        dm9000_reg_write(GPR, 0x00);//GPR bit[0]=0 使DM9000的GPIO3输出为低以激活内部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; i<6; i++)

            dm9000_reg_write(PAR + i, mac_addr[i]);//mac_addr[]自己定义一下吧,6个字节的MAC地址

    /*以上存储MAC地址(网卡物理地址)到芯片中去,这里没有用EEPROM,所以需要自己写进去*/

    /*关于MAC地址的说明,要参考网络相关书籍或资料*/

        dm9000_reg_write(NSR, 0x2c);

        dm9000_reg_write(ISR, 0x3f);

    /*为了保险,上面有清除了一次标志位*/

        dm9000_reg_write(IMR, 0x81);

    /*中断使能(或者说中断屏蔽),即开启我们想要的中断,关闭不想要的,这里只开启的一个接收中断*/

    /*以上所有寄存器的具体含义参考上一篇文章,或参考数据手册*/

    }

    这样就对DM9000初始化完成了,怎么样,挺简单的吧。

        3、发送、接收数据包

    同样,以程序为例,通过注释说明。

    //发送数据包

    //参数:datas为要发送的数据缓冲区(以字节为单位),length为要发送的数据长度(两个字节)。

    void sendpacket(unsigned char *datas, unsigned int length)


        unsigned int len, i; 
        dm9000_reg_write(IMR, 0x80);//先禁止网卡中断,防止在发送数据时被中断干扰 
        len = length;

        dm9000_reg_write(TXPLH, (len>>8) & 0x0ff);

        dm9000_reg_write(TXPLL, len & 0x0ff);

    /*这两句是将要发送数据的长度告诉DM9000的寄存器*/

        DM_ADD = MWCMD;//这里的写法是针对有总线接口的处理器,没有总线接口的处理器要注意加上时序。

        for(i=0; i<len; i+=2)//16 bit mode

        {

            udelay(20);

            DM_CMD = datas[i] | (datas[i+1]<<8);

        }

    /*上面是将要发送的数据写到DM9000的内部SRAM中的写FIFO中,注意没有总线接口的处理器要加上适当的时序*/

    /*只需要向这个寄存器中写数据即可,MWCMD是DM9000内部SRAM的DMA指针,根据处理器模式,写后自动增加*/

        dm9000_reg_write(TCR, 0x01);//发送数据到以太网上

        while((dm9000_reg_read(NSR) & 0x0c) == 0);//等待数据发送完成

        udelay(20);

        dm9000_reg_write(NSR, 0x2c);//清除状态寄存器,由于发送数据没有设置中断,因此不必处理中断标志位

        dm9000_reg_write(IMR, 0x81);//DM9000网卡的接收中断使能

    }

    以上是发送数据包,过程很简单。而接收数据包确需要些说明了。DM9000从网络中接到一个数据包后,会在数据包前面加上4个字节,分别为“01H”、“status”(同RSR寄存器的值)、“LENL”(数据包长度低8位)、“LENH”(数据包长度高8位)。所以首先要读取这4个字节来确定数据包的状态,第一个字节“01H”表示接下来的是有效数据包,若为“00H”则表示没有数据包,若为其它值则表示网卡没有正确初始化,需要从新初始化。

    如果接收到的数据包长度小于60字节,则DM9000会自动为不足的字节补上0,使其达到60字节。同时,在接收到的数据包后DM9000还会自动添加4个CRC校验字节。可以不予处理。于是,接收到的数据包的最小长度也会是64字节。当然,可以根据TCP/IP协议从首部字节中出有效字节数,这部分在后面讲解。下面为接收数据包的函数。

    //接收数据包

    //参数:datas为接收到是数据存储位置(以字节为单位)

    //返回值:接收成功返回数据包类型,不成功返回0

    unsigned int receivepacket(unsigned char *datas)

    {

        unsigned int i, tem;

        unsigned int status, len;

        unsigned char ready;

        ready = 0;//希望读取到“01H”

        status = 0;//数据包状态

         len = 0; //数据包长度

    /*以上为有效数据包前的4个状态字节*/

        if(dm9000_reg_read(ISR) & 0x01)

        {

            dm9000_reg_write(ISR, 0x01);

        }

    /*清除接收中断标志位*/

    /***********************************************************************************/

    /*这个地方遇到了问题,下面的黑色字体语句应该替换成成红色字体,也就是说MRCMDX寄存器如果第一次读不到数据,还要读一次才能确定完全没有数据。

    在做 PING 实验时证明:每个数据包都是通过第二次的读取MRCMDX寄存器操作而获知为有效数据包的,对初始化的寄存器做了多次修改依然是此结果,但是用如下方法来实现,绝不会漏掉数据包。*/

        ready = dm9000_reg_read(MRCMDX); // 第一次读取,一般读取到的是 00H

        if((ready & 0x0ff) != 0x01)

        {

            ready = dm9000_reg_read(MRCMDX); // 第二次读取,总能获取到数据

            if((ready & 0x01) != 0x01)

             {

                if((ready & 0x01) != 0x00) //若第二次读取到的不是 01H 或 00H ,则表示没有初始化成功

                {

                     dm9000_reg_write(IMR, 0x80);//屏幕网卡中断

                     DM9000_init();//重新初始化

                     dm9000_reg_write(IMR, 0x81);//打开网卡中断

                }

                retrun 0;

             }

        }

    /* ready = dm9000_reg_read(MRCMDX); // read a byte without pointer increment

        if(!(ready & 0x01))

        {

             return 0;

        }*/

    /***********************************************************************************/

    /*以上表示若接收到的第一个字节不是“01H”,则表示没有数据包,返回0*/

        status = dm9000_reg_read(MRCMD);

        udelay(20);

        len = DM_CMD;

        if(!(status & 0xbf00) && (len < 1522))

        {

            for(i=0; i<len; i+=2)// 16 bit mode

            {

                udelay(20);

                tem = DM_CMD;

                datas[i] = tem & 0x0ff;

                datas[i + 1] = (tem >> 8) & 0x0ff;

            }

        }

        else

        { 
            return 0;

        }

    /*以上接收数据包,注意的地方与发送数据包的地方相同*/

        if(len > 1000) return 0;

        if( (HON( ETHBUF->type ) != ETHTYPE_ARP) &&

            (HON( ETHBUF->type ) != ETHTYPE_IP) )

        {

            return 0;

        }

        packet_len = len;

    /*以上对接收到的数据包作一些必要的限制,去除大数据包,去除非ARP或IP的数据包*/ 
        return HON( ETHBUF->type ); //返回数据包的类型,这里只选择是ARP或IP两种类型

    }

    注意:上面的函数用到了一些宏定义,已经在头文件中定义过,这里说明一下:其中uint16定义为两个字节的变量,根据C编译器进行定义。

    unsigned char Buffer[1000];//定义了一个1000字节的接收发送缓冲区

    uint16 packet_len;//接收、发送数据包的长度,以字节为单位。

    struct eth_hdr //以太网头部结构,为了以后使用方便

    {

    unsigned char d_mac[6];   //目的地址

    unsigned char s_mac[6];   //源地址

    uint16 type;     //协议类型

    };

    struct arp_hdr //以太网头部+ARP首部结构

    {

    struct eth_hdr ethhdr;    //以太网首部

    uint16 hwtype;     //硬件类型(1表示传输的是以太网MAC地址)

    uint16 protocol;    //协议类型(0x0800表示传输的是IP地址)

    unsigned char hwlen;     //硬件地址长度(6)

    unsigned char protolen;    //协议地址长度(4)

    uint16 opcode;     //操作(1表示ARP请求,2表示ARP应答)

    unsigned char smac[6];    //发送端MAC地址

    unsigned char sipaddr[4];    //发送端IP地址

    unsigned char dmac[6];    //目的端MAC地址

    unsigned char dipaddr[4];    //目的端IP地址

    };

    struct ip_hdr //以太网头部+IP首部结构

    {

    struct eth_hdr ethhdr;    //以太网首部

    unsigned char vhl,      //4位版本号4位首部长度(0x45)

               tos;     //服务类型(0)

       uint16 len,      //整个IP数据报总字节长度

             ipid,           //IP标识

             ipoffset;     //3位标识13位偏移

    unsigned char ttl,             //生存时间(32或64)

              proto;         //协议(1表示ICMP,2表示IGMP,6表示TCP,17表示UDP)

    uint16 ipchksum;    //首部校验和

    unsigned char srcipaddr[4],    //源IP

                 destipaddr[4];   //目的IP

    };

    以上定义的三种首部结构,是根据TCP/IP协议的相关规范定义的,后面会对ARP协议进行详细讲解。

    展开全文
    dldw8816 2016-06-27 14:05:39
  • 7.46MB mszjie 2018-12-25 09:11:35
  • 736KB weixin_38562130 2020-08-07 02:54:37
  • joqian 2013-04-01 12:57:04
  • 430KB sdwfww725 2018-04-25 23:47:17
  • comwise 2013-11-07 00:59:44
  • 6.49MB qq_41376603 2018-08-16 15:17:58
  • b02330224 2012-08-22 14:31:13
  • 2.01MB u010425568 2018-01-24 10:13:48
  • 146B qq_38583464 2020-10-28 16:35:24
  • 50KB qq_22020445 2018-07-25 14:43:01
  • 14.32MB zxc406924714 2016-11-01 16:35:38
  • qq_24736541 2020-10-05 15:05:09
  • zhangchiytu 2013-09-29 20:28:42
  • Z_xiaoying 2017-05-06 16:00:06
  • fuqiulian 2019-10-22 14:56:10
  • 429KB cantus_wyb 2021-07-22 11:13:43
  • weixin_30640769 2019-07-21 23:03:09
  • weixin_39567870 2020-11-28 16:55:37
  • alingbo 2018-12-16 13:16:23
  • songforest1 2019-01-03 22:35:18
  • weixin_42188512 2021-08-09 04:15:22
  • 1.68MB weixin_38628211 2021-04-20 01:08:45

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,431
精华内容 2,972
关键字:

网卡芯片电路

友情链接: APIShims.rar