微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > SAM4E单片机之旅——22、GMAC和PHY的介绍与初始化

SAM4E单片机之旅——22、GMAC和PHY的介绍与初始化

时间:04-28 来源:互联网 点击:

网络通信的作用不用多说,而这次进行的工作即是对以太网通信过程中,需要用到的硬件部分进行初始化,也介绍了发送和接收数据的方法。

由于较为复杂,所以使用了ASF框架。但是也会对用到的库函数的实现做一个介绍。

  一、 MAC、PHY和MII

IEEE 802.3是现在常用的以太网标准,它定义了物理层(Physical Layer, PHY)和介质访问控制层(Media Access Control, MAC)的标准。另外,在OSI模型中,MAC则处于数据链路层的底层。

而在硬件实现上,M4使用的GMAC外设实现了802.3中MAC的功能。开发板携带型号为KSZ8051MNL的PHY芯片以及RJ45接口则实现了物理层的功能:

MAC和PHY之间交互的接口则是介质独立接口(Media Independent Interface,MII)。MII包含一个数据通信接口,以及一个管理接口(Management Data Input/Output ,MDIO)。由于PHY的接口是面向MAC的,所以我们需要通过MAC来对PHY进行管理及数据交互。

另外,更早制定的Ethernet II帧则是现在以太网传输中常使用的帧格式。

  二、 GMAC的DMA缓冲区

GMAC使用了一个DMA接口。和M4的通用DMAC一样,它也可以自动进行多次传输,但是方式稍微有点区别。GMAC的DMA 对发送和接收使用不同的缓冲区列表,而缓冲区描述符列表是一个数组,而不是DMAC所使用的链表。数组的起始位置保存在寄存器(GMAC_RBQB、GMAC_TBQB)中,且缓冲区描述符中有一个字段(Wrap)指示其是否为数组中的最后一个描述符。如接收缓冲区:

  

在工作过程中,DMA会顺序访问每个缓冲区描述符,而在访问最后一个描述符时,就会重新开始遍历。

对于接收缓冲,列表中每一个缓冲区的长度是一样的,这个长度由DMA配置寄存器(GMAC_DCFGR)中的DRBS字段指定。在DMA将数据写入接收缓冲时,也会设置描述符相应的字段,以表明每帧的起始与结束;同时,也会标注相关的信息,如是否为广播帧等。

对于发送缓冲,其帧长度、是否需要添加CRC等控制信息也均在描述符中表示。在准备好数据后,向GMAC_NCR寄存器写入TSTART字段即可触发发送操作。

  三、 使用ASF初始化GMAC

由于PHY是通过MAC访问的,所有在设置PHY前要完成GMAC的设置。

GMAC约有94个寄存器,其中约有40个为统计寄存器,约15个寄存器与1588和PTP相关,约15个寄存器与特殊地址和ID有关。另外,在有些状态寄存器中,需要向特定位写入1才会清除该位的状态。

使用的ASF模块为Ethernet GMAC,然后conf_eth.h中可以设置MAC地址,IP地址,子网掩码,网关以及缓冲区大小等参数。

然后调用gmac_dev_init( ) 函数即可对GMAC进行初始化:

pmc_enable_periph_clk(ID_GMAC);

// MAC地址

uint8_t mac_address[] =

{ ETHERNET_CONF_ETHADDR0, ETHERNET_CONF_ETHADDR1,

ETHERNET_CONF_ETHADDR2,ETHERNET_CONF_ETHADDR3,

ETHERNET_CONF_ETHADDR4, ETHERNET_CONF_ETHADDR5

};

// GMAC选项

gmac_options_t gmac_option;

gmac_option.uc_copy_all_frame = 0; // 不拷贝所有帧

gmac_option.uc_no_boardcast = 0; // 不忽略广播

memcpy(gmac_option.uc_mac_addr,

mac_address, sizeof(mac_address)); //拷贝MAC地址

// GMAC驱动设置

gmac_device_t gmac_dev;

gs_gmac_dev.p_hw = GMAC; // 指定GMAC寄存器基址

// 初始化GMAC

gmac_dev_init(GMAC, &gmac_dev, &gmac_option);

gmac_dev_init(Gmac* p_gmac, gmac_device_t* p_gmac_dev, gmac_options_t* p_opt) 函数完成了以下的工作:

禁用发送接收,禁用GMAC所有中断;清除统计寄存器,以及发送接受状态寄存器。

设置GMAC_NCFGR寄存器。根据p_opt,判断是否拷贝所有帧,以及是否忽略广播。同时,追加GMAC_NCFGR_PEN 和 GMAC_NCFGR_IRXFCS位。(我觉得这里应该是个BUG,从其注释判断需要追加的应该是GMAC_NCFGR_RFCS位)

设置好DMA缓冲,然后调用gmac_init_mem( ) 对缓冲区描述符等进行初始化。这个函数里也会使能发送和接收,同时也会启用一系列的中断。设置完成后,DMA缓冲的信息将储存在p_gmac_dev中。

将MAC地址写入特别地址寄存器1。

  四、 PHY的地址

在MDIO通信过程中,每个PHY都会有一个4位的地址。而开发板携带的KSZ8051MNL芯片,可以在上电或复位时,根据引脚设置地址的低3位:

  

在开发板中,上电时PHYAD[2:0]的值为

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top