PHY的基本知识

PHY的基本知识写 DM9000 网卡芯片驱动的预备知识 from http blog sina com cn s blog 522a41b20100 htmlETHERNET 的接口实质是 MAC 通过 MII 总线控制 PHY 的过程 MAC 是 MediaAccessC 的缩写 即媒体访问控制子层协议 该协议位于 OSI 七层协议中数据链路层的下半部分 主要负责控制与连接物理层的物理介质 在发送数

ETHERNET的接口实质是MAC通过MII总线控制PHY的过程。

MAC是MediaAccess Control的缩写,即媒体访问控制子层协议。该协议位于OSI七层协议中数据链路层的下半部分,主要负责控制与连接物理层的物理介质。在发送数据的时候,MAC协议可以事先判断是否可以发送数据,如果可以发送将给数据加上一些控制信息,最终将数据以及控制信息以规定的格式发送到物理层;在接收数据的时候,MAC协议首先判断输入的信息并是否发生传输错误,如果没有错误,则去掉控制信息发送至LLC层。以太网MAC由IEEE-802.3以太网标准定义。

MII(MediaIndependent Interface)即媒体独立接口,“媒体独立”表明在不对MAC硬件重新设计或替换的情况下,任何类型的PHY设备都可以正常工作。包括分别用于发送器和接收器的两条独立信道。每条信道都有自己的数据、时钟和控制信号。MII数据接口总共需要16个信号,包括TX_ER,TXD<3:0>,TX_EN,TX_CLK,COL,RXD<3:0>,RX_EX,RX_CLK,CRS,RX_DV等。

MII以4位半字节方式传送数据双向传输,时钟速率25MHz。其工作速率可达100Mb/s。MII管理接口是个双信号接口,一个是时钟信号,另一个是数据信号。通过管理接口,上层能监视和控制PHY。其管理是使用SMI(SerialManagementInterface)总线通过读写PHY的寄存器来完成的。PHY里面的部分寄存器是IEEE定义的,这样PHY把自己的目前的状态反映到寄存器里面,MAC通过SMI总线不断的读取PHY的状态寄存器以得知目前PHY的状态,例如连接速度,双工的能力等。当然也可以通过SMI设置PHY的寄存器达到控制的目的,例如流控的打开关闭,自协商模式还是强制模式等。不论是物理连接的MII总线和SMI总线还是PHY的状态寄存器和控制寄存器都是有IEEE的规范的,因此不同公司的MAC和PHY一样可以协调工作。当然为了配合不同公司的PHY的自己特有的一些功能,驱动需要做相应的修改。

EthernetInterface=MAC+PHY with MII

PHY是物理接口收发器,它实现物理层。包括MII/GMII(介质独立接口)子层、PCS(物理编码子层)、PMA(物理介质附加)子层、PMD(物理介质相关)子层、MDI子层。

100BaseTX采用4B/5B编码。PHY在发送数据的时候,收到MAC过来的数据(对PHY来说,没有帧的概念,对它来说,都是数据而不管什么地址,数据还是CRC),每4bit就增加1bit的检错码,然后把并行数据转化为串行流数据,再按照物理层的编码规则把数据编码,再变为模拟信号把数据送出去。收数据时的流程反之。

PHY还有个重要的功能就是实现CSMA/CD的部分功能。它可以检测到网络上是否有数据在传送,如果有数据在传送中就等待,一旦检测到网络空闲,再等待一个随机时间后将送数据出去。如果两个碰巧同时送出了数据,那样必将造成冲突,这时候,冲突检测机构可以检测到冲突,然后各等待一个随机的时间重新发送数据。这个随机时间很有讲究的,并不是一个常数,在不同的时刻计算出来的随机时间都是不同的,而且有多重算法来应付出现概率很低的同两台主机之间的第二次冲突。

通信速率通过双方协商,协商的结果是两个设备中能同时支持的最大速度和最好的双工模式。这个技术被称为AutoNegotiation或者NWAY。

隔离变压器把PHY送出来的差分信号用差模耦合的线圈耦合滤波以增强信号,并且通过电磁场的转换耦合到连接网线的另外一端。RJ-45中1、2是传送数据的,3、6是接收数据的。新的PHY支持AUTOMDI-X功能(也需要隔离变压器支持)。它可以实现RJ-45接口的1、2上的传送信号线和3、6上的接收信号线的功能自动互相交换。

)。它可以实现RJ-45接口的1、2上的传送信号线和3、6上的接收信号线的功能自动互相交换。

DM9000原理

DM9000 是Davicom公司的一款以太网控制芯片,在网络中它可自动获得同设定MAC地址一致的IP包,完成IP包的收发,再用一个单片机来结合完成上层协议,就构成了一个完整的网络终端。在单片机中嵌入了一个精简TCP/IP协议栈。

API 总共分7部分,包括网络接口层、动态内存管理模块、缓冲区管理模块、UDP层、TCP层、DHCP模块和DNS模块。

协议栈本身需求ROM空间为21KWord。

(1)内存工作原理DM9000 共有6 K Byte(0000h-3FFFh)内存,而读写内存由MWCMD、MRCMD这两个寄存器来控制。MWRL,MWRH寄存器提供现在写入内存的位置,MRRL,MRRH寄存器提供现在读取内存的位置。内存移动工作模式为每次移动1 个Byte(8bit)或2个Byte(16bit)。

(2)封包传送工作原理内存中默认值有3 KByte(0000h-0BFFh)提供给传送功能使用。而传送一个封包流程如下:①将要传送封包的长度,填入到TXPLL,TXPLH寄存器;②将要传送封包的资料由MWCMD 寄存器填入内存中;③由TCR寄存器使DM9000送出封包资料;④若内存的写入位置超过0BFFh时,自动将下一个位置回复到0000h。

(3)封包接收工作原理内存中默认值有13K Byte(0C00h-03FFh)提供给接收功能使用。在每一个封包,会有4个Byte存放一些封包相关资料。第1 个Byte是封包是否已存放在接收内存,若值为“01h”为封包已存放于接收内存,若为“00h”则接收内存尚未有封包存放。在读取其它Byte之前,必需要确定第1 个byte 是否为“01h”。第2 个Byte则为这个封包的一些相关讯息,它的格式像RSR寄存器的格式。第3和4个Byte是存放这个封包的长度大小。

接一个封包的流程如下:

①检查MRCMDX寄存器值是否为01,若是则有封包进入需读取;

②读取MRCMD,将前4 个Byte封包讯息读入;

③由前4 个Byte封包讯息取到待得封包长度(以Byte 为单位),连续读取MRCMD,将封包资料移到系统内存之中;

④若读取位置超过3FFFh 时,自动会移到0C00h。

1。认识网卡,我们上网必备组件之一。

网卡工作在osi的最后两层,物理层(PHY)和数据链路层(MAC,即MAC实现了一个数据链路层),物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。物理层的芯片称之为PHY。数据链路层则提供寻址机构、数据帧的构建、数据差错检查、传送控制、向网络层提供标准的数据接口等功能。以太网卡中数据链路层的芯片称之为MAC控制器。很多网卡的这两个部分是做到一起的。他们之间的关系是pci总线接mac总线,mac接phy,phy接网线(当然也不是直接接上的,还有一个变压装置)。

10BaseT和100BaseTXPHY实现方式不同:10BaseT采用曼彻斯特编码,100BaseTX采用4B/5B编码。

曼彻斯特编码,常用于局域网传输。在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号;从高到低跳变表示”1”,从低到高跳变表示”0”。还有一种是差分曼彻斯特编码,每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示”0”或”1”,有跳变为”0”,无跳变为”1”。

如何读写dm9000的寄存器:

 DM9000内部有64多个8位寄存器,常用 的有40多个。还有12个特殊的16位PHY寄存器,其中常用的PHY寄存器有4个。对其寄存器的读写有别于前面的64个寄存器。其寄存器的功能请参看 DM9000寄存器功能详解上下文。 如前面所说,DM9000是数据地址线复用的,即INDEX Port,DATA Port;DM9000访问的是地址端口,还是数据端口由A2信号线的电平决定。 那么可以做这样的宏定义: #define DM9000_PPTR *(volatile uint16 *)(DM9000_BASE) //地址端口 #define DM9000_PDATA *(volatile uint16 *)(DM9000_BASE +4) //数据端口 其中 DM9000_BASE 是基地址,由板子的设计决定。 对64个8位寄存器的读写代码如下: uint8 ior(uint8 reg) //读寄存器 { DM9000_PPTR=reg; return DM9000_PDATA&0xff; } void iow(uint8 reg, uint8 value) //写寄存器 { DM9000_PPTR = reg; DM9000_PDATA = value & 0xff; } 其中由于MCU 的处理速度和DM9000 的处理速度可能有差别,最好加入适当的延迟。 对PHY16位寄存器的读写由8位寄存器的操作完成,代码如下: uint16 phy_read(uint8 reg) //读PHY寄存器 { uint16 val; iow(DM9KS_EPAR, DM9KS_PHY | reg); iow(DM9KS_EPCR, 0x0c); iow(DM9KS_EPCR, 0x08); val = (ior(DM9KS_EPDRH) << 8) | ior(DM9KS_EPDRL); return val; } void phy_write(uint8 reg, uint16 value) //写PHY寄存器 { iow(DM9KS_EPAR,DM9KS_PHY|reg); iow(DM9KS_EPDRL,(value&0xff)); iow(DM9KS_EPDRH,((value>>8)&0xff)); iow(DM9KS_EPCR,0xa); iow(DM9KS_EPCR, 0x08); } 最后我们再一次读出DM9000的ID。 uint32 GetDM9000ID(void) { uint32 id_val; DM9000_PPTR = DM9KS_PID_H; id_val = (DM9000_PDATA & 0xff) << 8; DM9000_PPTR = DM9KS_PID_L; id_val+= (DM9000_PDATA & 0xff); id_val = id_val << 16; DM9000_PPTR = DM9KS_VID_H; id_val += (DM9000_PDATA & 0xff) << 8; DM9000_PPTR = DM9KS_VID_L; id_val += (DM9000_PDATA & 0xff); return id_val; } 

最近在看DM9000网卡驱动,一直不太明白,这几天问师兄,查资料总算明白了一点,在这里整理出来,也当加深理解。我刚刚学习ARM,很多东西不懂,理解错误或者不当之处还请指出,大家共同进步。

S3C2440是32位微处理器,有32根地址线,支持4GB存储空间。其中0-的1G空间被分为8块128M空间,分别由NGCS0-NGCS7片选。DM9000的AEN地址使能引脚与S3C2440的NGCS4相连(对应匹配),对应的初始地址为0x,地址范围为0x-0x。

1、 DM9000地址线

DM9000地址线SA4-SA9用于S3C2440选择DM9000网卡。因为DM9000的AEN地址使能引脚已经和S的NGCS4引脚相连,完成了选通,其余位可不连直接置位即可:SA9、SA8置为高电平,SA7置为低电平,SA6-SA4和TXD2-TXD0匹配(如果取DM9000 IO默认基地址,SA6-SA4可置为低电平)。

2、 DM9000数据线

DM9000数据线SD0-SD15与S3C2440数据线DATA0-DATA15相连。

3、 DM9000数据端口和命令端口的确定

由开始讨论知,对于DM9000网卡寄存器的操作在0x-0x的区间内进行,由于网卡IO默认基地址为300H,所以操作网卡对应内存的起始地址为0x,又有DM9000网卡CMD端口与S3C2440的地址总线ADDR2相连,并且DM9000的CMD命令管脚有这样的特性:当为高电平时,从数据线传输的是数据,当为低电平时传输的是命令。

4、 具体程序

define DM_ADD (((volatile unsigned short) 0x))

define DM_CMD (((volatile unsigned short) 0x))

在定义端口,分别把0x和0x宏定义为DM_ADD和DM_CMD

寄存器读写操作函数

static void dm9000_reg_write(INT16U reg, INT16U data)

{

udelay(20); DM_ADD=reg; udelay(20); DM_CMD=data; 

}

static INT8U dm9000_reg_read(INT16U reg)

{

udelay(20);

DM_ADD=reg;

udelay(20);

return DM_CMD;

}

程序中volatile类型修饰符,在处理器对外部寄存器读写时几乎是必用的,作用是确保变量每次被调用的时候都会从内存中重新读取而不是读取内部缓存cache(处理器把常用的数据进行备份保存在此处,避免每次调用该数据时都要操作内存)里面的数据,尽管这样浪费的时间,可是提高了系统的准确性。

通过确定了地址线和数据线的连线,加上在内存里的地址映射,可以通过对内存的操作实现对寄存器的读取。具体过程是这样的:

当对以0x(DM_ADD)为起始地址的内存空间进行操作时,对应的ADDR2管脚为低电平,CMD命令管脚为低电平,数据线传输的是地址,同理,当对0X(DM_CMD)为起始地址的内存空间进行操作时,对应管脚为高电平,数据线传输的是数据。传输到外部芯片的地址选取寄存器,传输到外部芯片的数据写相应寄存器,这个过程由CMD控制,当CMD为低电平时选取寄存器(此时可以直接读取寄存器的内容),CMD为高电平时,写入寄存器(之前必须先选取寄存器)。在内存里的情况,这样理解。

原文请搜“PHY的基本知识”

100BaseTX,100BaseFX,和100BaseT4。

图 5.1

7.1.3.1 由 M8E3081 组成的交换系统框图

7.1.3.2 88E3081 和隔离变压器及RJ-45 连结示意

7.1.3.3 芯片内部功能结构

接收功能块

间隔为0.05 英寸。如图七

灌水时注意把各种电源分割开来。如下图所示:

等长、等间距。发送的差分信号对与接收的差分信号对不要在同一走线层,中间必须间隔着地层。

8.1.3.2 芯片的内部的功能框图。

四个部分的供电必须分开,以免电源之间互相干扰。如下图所示:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229997.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午3:22
下一篇 2026年3月16日 下午3:22


相关推荐

  • about ubuntu hard disk

    about ubuntu hard disk

    2021年5月3日
    142
  • vue获取时间戳转换为日期格式

    vue获取时间戳转换为日期格式vue 获取时间戳转换为日期格式 方法一为转载黄轶老师的 format 方法 出处 黄轶老师 github nbsp nbsp nbsp https github com ustbhuangyi date jsexportfunc date fmt if y test fmt fmt fmt replace R

    2026年3月26日
    2
  • 智能体并发处理机制:AI Agents for Beginners并行计算技术

    智能体并发处理机制:AI Agents for Beginners并行计算技术

    2026年3月16日
    3
  • 树莓派3b入门指南「建议收藏」

    树莓派3b入门指南「建议收藏」近日,入手了树莓派3b,准备把它当一台防火墙用,配置如下:我买的套装是最简版的,只有一个电源线、一个塑料外壳,一个8GSD卡,几个散热片。捣鼓了几天,网上搜索了一些资料,在此记录下详细的过程,方便之后入手的朋友。一.烧写树莓派镜像(需要一个SD卡读写器)1.进入官网https://www.raspberrypi.org/downloads/下载页面,选择“RASP…

    2022年6月25日
    54
  • python字符串删除指定符号(不限位置)「建议收藏」

    python字符串删除指定符号(不限位置)「建议收藏」python中去掉字符串中某些不想要的字符:1、一般的可以用replace()这个函数不限定位置,是可以替换原来不想要的字符,替换成空字符就相当于删除了2、也可以用strip(),删除两边的字符(默认是删除左右空格)rstrip(),lstrip()这两个可以选择只删除左边或者右边3、re.sub这个可以根据正则删除,此处是删除串中的数字1-9,字符a-z,A-Z,还可以加其他的importrestr=”aksj2343ngr4545g黄金叶子fg”temp=re.sub(‘[a

    2022年6月4日
    76
  • python安装uwsgi_微服务怎么部署到服务器的

    python安装uwsgi_微服务怎么部署到服务器的什么是uWSGIuWSGI旨在为部署分布式集群的网络应用开发一套完整的解决方案。主要面向web及其标准服务。由于其可扩展性,能够被无限制的扩展用来支持更多平台和语言。uWSGI是一个web服务器,实现了WSGI协议,uwsgi协议,http协议等。uWSGI的主要特点是:超快的性能低内存占用多app管理详尽的日志功能高度可定制uWSGI服务器自己实现了基于uwsgi协议的ser…

    2025年9月12日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号