ZYNQ网络通信之PHY应用(型号:88E1145)

接上篇《ZYNQ网络通信之PHY详解》,实例介绍工程中PHY的应用,包括原理图设计、配置和软件设计。
五 ZYNQ PS网络通信
5.1 PHY芯片原理图设计
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从原理图可以得知:
① 网络控制器使用的是ZYNQ的PS网络控制器。
② 关于PHY的配置,大部分通过硬件配置完成,体现在P0_CONFIG[4:0]。
③ 使用RGMII接口与MAC层连接,使用铜线外部连接RJ45转接器。
④ MDC/MDIO接口连接到PS_MIO52和PS_MIO53。(原理图中ZYNQ端接口未展示)

5.2 硬件配置
针对上面硬件原理图设计,对基于硬件配置完成的PHY功能进行详细的描述。先通过一个表格梳理硬件配置pin的连接方式和配置参数。
在这里插入图片描述
对照下面这个表格,也就是3.5节讲到过的硬件配置对应映射关系。
在这里插入图片描述
结合datasheet里面关于寄存器的详细描述,可以得知硬件配置关系如下:
(1) PHY地址为二进制10000,即十进制16。
(2) HWCFG_MODE[3:0]=1011,即RGMII to copper。
(3) PHY自协商模式告知速率、双工等,参数尽量以主机为主。
(4) ENA_XC=1使能自动转接,自协商。
(5) DIS_FC=1关闭自动选择铜线/光纤模式,本工程只外接到铜线接口,通过交叉双绞线连接到RJ45水晶头固定,然后至网线。
(6) DIS_SLEEP=1关闭睡眠模式。
(7) SEL_TWSI=0选择MDC/MDIO接口。
(8) 本设计中定义寄存器4.11:10 to 11 – copper。
(9) GCONFIG0=1011,即关闭DTE选择;50阻抗终端连接到铜线;4个独立的MDC/MDIO接口连接方式;关闭125MHz时钟,由软件进行定义。
(10) GCONFIG1=0111,一些简单配置,主要包含指示灯LED闪烁、上电、中断等。

5.3 软件设计
1、按照xilinx的惯用套路,首先通过查表的方式初始化一个MAC层的网络接口结构体,包括PHY的ID和地址等,然后设置mac允许接收多播地址,设置mac地址并挂载到mac层。代码如下:

instGMACPS.Config = XEmacPs_ConfigTable[XPAR_PS7_ETHERNET_0_DEVICE_ID];
XEmacPs_CfgInitialize(&instGMACPS, &instGMACPS.Config, instGMACPS.Config.BaseAddress);
XEmacPs_SetOptions(&instGMACPS, XEMACPS_MULTICAST_OPTION);
XEmacPs_SetMacAddress(&instGMACPS, (void*)(mac_ethernet_address), 1);

进入需要初始化的项目表项函数XEmacPs_ConfigTable查看初始化项目。

XEmacPs_Config XEmacPs_ConfigTable[XPAR_XEMACPS_NUM_INSTANCES] =
{
   
   
	{
   
   
		XPAR_PS7_ETHERNET_0_DEVICE_ID,
		XPAR_PS7_ETHERNET_0_BASEADDR,
		XPAR_PS7_ETHERNET_0_IS_CACHE_COHERENT
	}
};

设置mac地址部分,这里挂载的mac地址存放在自定义的mac_ethernet_address数组里面。
unsigned char mac_ethernet_address[] = { 0x00, 0x0a, 0x35, 0x00, 0x01, 0x02 };
mac地址在MAC层设计的时候就已经存在,但是,我们可以手动写入mac地址进行修改,在网络交换、连接和传输中表现得更加清晰,但是同一个网络拓扑结构中不能出现同样的mac地址。

2、设置MDIO的工作时钟MDC,获取PHY传输速率。先上代码:

/*  Read PHY address and number PHY speed */
u32 phy_addr;
u16 phy_reg;
/* setup the MDIO clock with XEmacPs_SetMdioDivisor() */
XEmacPs_SetMdioDivisor(&instGMACPS, MDC_DIV_224); 
phy_addr = 16;
ethPhySpeed[phy_addr] = 0;
XEmacPs_PhyRead(&instGMACPS, phy_addr, PHY_DETECT_REG, &phy_reg);
if ((phy_reg != 0xFFFF) && ((phy_reg & PHY_DETECT_MASK) == PHY_DETECT_MASK)) {
   
   
	xil_printf("XEmacPs detect_phy: PHY detected at address %d.    ", phy_addr);
XEmacPs_PhyRead(&instGMACPS, phy_addr, 2, &phy_reg);
if(phy_reg
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值