https://e2e.ti.com/support/interface-group/interface/f/interface-forum/972917/dp83822if-dp83822if
器件型号:DP83822IF你(们)好
我正在尝试使用 Xilinx Ultrascale + TI DP83822 PHY 在定制板上设置免费的 RTOS + TCP。
PHY 不是引导自举、因为硬件团队希望通过软件对其进行配置。
电路板上的 PHY 布线应使用 RGMII 接口。
我无法通过以太网获取任何流量、但最令人困惑的是、电路板连接的 PC 指示电缆已断开连接。
根据我的理解、即使没有任何 MAC 发送、如果初始化正常、PC 至少应该识别连接的电缆。
我已经为 PHY 完成了以下初始化:
#define PHY_TI_BMCCR 0x00 //基本控制模式寄存器
#define PHY_TI_BMCCR_RESET_MASK 0x8000
#define PHY_MODE_TI_DP83822_AUTONEGO_EN 0x1000
#define PHY_MODE_TI_DP83822_AUTONEGO_RESTART 0x0200
#define PHY_TI_PHYRCR 0x1F // PHY 复位控制寄存器
#define PHY_TI_PHYRCR_DIGITAL_RESET_MASK 0x8000
#define PHY_TI_PHYRCR_DIGITAL_RESTK_MASK 0x4000
#define PHY_MODE_TI_DP83822 0x24
#define PHY_MODE_MASK 0x3F
#define PHY_MODEL 0x4
#define PHY_MODE_TI_DP83822_LEDCR 0x18
#define PHY_MODE_TI_DP83822_OVRLED0_EN 0x10
#define PHY_MODE_TI_DP83822_OVRLED0_ON 0x02
#define PHY_MODE_TI_DP83822_CR1 0x09
#define PHY_MODE_TI_DP83822_LINKLOSSREC_EN 0x80
#define PHY_MODEL TI_DP83822_FASTAUTOMDIX_EN 0x40
#define PHY_MODE_TI_DP83822_ROBUSTAUTOMDIX_EN 0x20
#define PHY_MODE_TI_DP83822_FASTAUTONEGO_EN 0x10
#define PHY_MODE_TI_DP83822_CR2 0x0A
#define PHY_MODE_TI_DP83822_100BASE-FX_EN 0x4000
#define PHY_MODE_TI_DP83822_EXT_FULL_DUPLE_YPULTRAINY_EN 0x0020
#define PHY_MODE_TI_DP83822_CR3 0x0B
#define PHY_MODE_TI_DP83822_RCSR 0x17
#define PHY_MODEL TI_DP83822_RGMII_RX_CLCK_SHIFT_EN 0x1000
#define PHY_MODE_TI_DP83822_RGMII_TX_CLCK_SHIFT_EN 0x0800
#define PHY_MODEL TI_DP83822_RGMII_MODE_EN 0x0200
#define PHY_MODEL TI_DP83822_RGMII_50MHz_CLCK_SEL 0x0080
#define PHY_MODE_TI_DP83822_PHYCR 0x19
#define PHY_MODEL TI_DP83822_AUTOMDIX_EN 0x8000
#define PHY_MODE_TI_DP83822_LEDCFG_MODE1_EN 0x0020
#define PHY_RESET_MAX_WAIT_TIME 1000000000
#define PHY_RESET_MIN_WAIT_TIME 10000
#define DEBUG_Ethernet 1.
uint32_t configure_IEEE_phy_speed_US (xemacp * xemacsp,unsigned speed,u32 phy_addr)
{
uint16_t phyregtemp、phyregtempcheck;
uint16_t 控制;
uint16_t phy_identity;
uint16_t phy_model;
uint32_t 返回状态;
volatile uint32_t wait = 0;
/*执行与硬件复位等效的芯片复位*/
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_TI_PHYRCR,(uint16_t *)&phyregtemp);
phyregtemp |= PHY_TI_PHYRCR_DIGITAL_RESET_MASK;
XEmacps_PhyWrite (xemacpsp、phy_addr、PHY_TI_PHYRCR、phyregtemp);
//返回状态= XEmacps_PhyRead (xemacsp、phy_addr、PHY_TI_PHYRCR、(uint16_t *)&phyregtemp);
//
// if (RetStatus!= XST_Success)
//{
// xil_printf (“数字重启时出错\n\r\n);
//返回 XST_FAILURE;
//}
/*等待重置完成*/
Wait = 0;
while (WAIT++< PHY_RESET_MAX_WAIT_TIME)
{
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_TI_PHYRCR、(uint16_t *)&phyregtemp);
if (((phyregtemp & PHY_TI_PHYRCR_DIGITAL_RESET_MASK)= 0x00)&&(Wait >= PHY_RESET_MIN_WAIT_TIME))
中断;
}
if (Wait >= PHY_RESET_MAX_WAIT_TIME)//重置没有按时完成
{
xIL_printf ("复位时出错\n\r\n);
返回 XST_FAILURE;
}
/*执行 PCS 寄存器复位-可能在第一次复位后是冗余的*/
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_TI_BMCCR、(uint16_t *)&phyregtemp);
phyregtemp |= 0x8000;
XEmacps_PhyWrite (xemacpsp、phy_addr、PHY_TI_BMCCR、phyregtemp);
/*等待重置完成*/
Wait = 0;
while (WAIT++< PHY_RESET_MAX_WAIT_TIME)
{
XEmacps_PhyRead (xemacpsp、phy_addr、0、(uint16_t *)&phyregtemp);
if (((phyregtemp & PHY_TI_BMCCR_RESET_MASK)= 0x00)&&(Wait >= PHY_RESET_MIN_WAIT_TIME))
中断;
}
if (Wait >= PHY_RESET_MAX_WAIT_TIME)//重置没有按时完成
{
xIL_printf (“PCS 寄存器复位时出错\n\r\n);
返回 XST_FAILURE;
}
//获取设备标识
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_identifier_1_REG、&phy_identity);
//获取设备模型
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_identifier_2_REG、&phy_model);
PHY_MODEL =((phy_model >> PHY_MODEL)& PHY_MODEL 掩码);
if (PHY_TI_identifier = phy_identity)
{
switch (phy_model)
{
案例 PHY_MODE_TI_DP83822:// MK4 BMU HW PHY
//设置基本模式控制寄存器以启用自动协商
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_TI_BMCCR、(uint16_t *)&phyregtemp);
phyregtemp |= PHY_MODE_TI_DP83822_AUTONEGO_EN;
XEmacps_PhyWrite (xemacpsp、phy_addr、PHY_TI_BMCCR、phyregtemp);
#if defineed (debug_ethernet)&&(debug_ethernet = 1)
//检查初始化
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_TI_BMCCR、(uint16_t *)&phyregtempcheck);
xil_printf ("PHY %x 中的注册地址-设置:%x -值:%x\n"、PHY_TI_BMCCR、phyregtemp、phyregtempcheck);
#endif
//设置控制寄存器1以启用链路丢失恢复等
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_MODLE_TI_DP83822_CR1、(uint16_t *)&phyregtemp);
// phyregtemp |=(PHY_MODE_TI_DP83822_LINKLOSSREC_EN |
// PHY_MODE_TI_DP83822_FASTAUTOMDIX_EN |
// PHY_MODE_TI_DP83822_ROBUSTAUTOMDIX_EN);
phyregtemp |=(PHY_MODE_TI_DP83822_FASTAUTOMDIX_EN |
PHY_MODE_TI_DP83822_ROBUSTAUTOMDIX_EN);
phyregtemp &=~Phy_model_TI_DP83822_FASTAUTONEGO_EN;//禁用快速自动协商
XEmacps_PhyWrite (xemacpsp、phy_addr、PHY_MODLE_TI_DP83822_CR1、phyregtemp);
#if defineed (debug_ethernet)&&(debug_ethernet = 1)
//检查初始化
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_MOD_TI_DP83822_CR1、(uint16_t *)&phyregtempcheck);
xil_printf ("PHY %x 中的注册地址-设置:%x -值:%x\n"、PHY_MODEL TI_DP83822_CR1、phyregtemp、phyregtempcheck);
#endif
//启用100Mbps 功能
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_MODEL _TI_DP83822_CR2、(uint16_t *)&phyregtemp);
phyregtemp |= PHY_MODE_TI_DP83822_100BASE-FX_EN;
phyregtemp |= PHY_MODEL TI_DP83822_EXT_FULL_DUPLE_ANTIA_EN;
XEmacps_PhyWrite (xemacpsp、phy_addr、PHY_MODLE_TI_DP83822_CR2、phyregtemp);
#if defineed (debug_ethernet)&&(debug_ethernet = 1)
//检查初始化
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_MODEL _TI_DP83822_CR2、(uint16_t *)&phyregtempcheck);
xil_printf ("PHY %x 中的注册地址-设置:%x -值:%x\n"、PHY_MODEL TI_DP83822_CR2、phyregtemp、phyregtempcheck);
#endif
//禁用快速下行链路选项
XEmacps_PhyWrite (xemacpsp、phy_addr、PHY_MODLE_TI_DP83822_CR3、0x0);
#if defineed (debug_ethernet)&&(debug_ethernet = 1)
//检查初始化
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_MODEL _TI_DP83822_CR3、(uint16_t *)&phyregtempcheck);
xil_printf ("PHY %x 中的注册地址-设置:%x -值:%x\n"、PHY_MODEL TI_DP83822_CR3、phyregtemp、phyregtempcheck);
#endif
//将器件设置为 RGMII 模式
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_MODEL _TI_DP83822_RCSR、(uint16_t *)&phyregtemp);
phyregtemp &=~Phy_model_TI_DP83822_RGMII_RX_CLCK_SHIFT_EN;//禁用 RX 时钟移位
phyregtemp &=~Phy_model_TI_DP83822_RGMII_TX_CLCK_SHIFT_EN;//禁用 TX 时钟移位
phyregtemp |= PHY_MODE_TI_DP83822_RGMII_MODE_EN;//板载硬件接口为 RGMII
phyregtemp &=~Phy_model_TI_DP83822_RGMII_50MHz_CLCK_SEL;//确保使用的 clck 为25MHz
XEmacps_PhyWrite (xemacpsp、phy_addr、PHY_MODLE_TI_DP83822_RCSR、phyregtemp);
#if defineed (debug_ethernet)&&(debug_ethernet = 1)
//检查初始化
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_MODEL _TI_DP83822_RCSR、(uint16_t *)&phyregtempcheck);
xil_printf ("PHY %x 中的注册地址-设置:%x -值:%x\n"、PHY_MODEL TI_DP83822_RCSR、phyregtemp、phyregtempcheck);
#endif
//设置自动 MDI 启用,LED 指示灯在活动中闪烁
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_MODEL _TI_DP83822_PHYCR、(uint16_t *)&phyregtemp);
phyregtemp |= PHY_MODE_TI_DP83822_AUTOMDIX_EN;//启用自动 MDIX 以防我们交叉对
phyregtemp &=~Phy_model_TI_DP83822_LEDCFG_MODE1_EN;//模式2:在链路上使 Led0亮起,并在 Tx 活动时闪烁
XEmacps_PhyWrite (xemacpsp、phy_addr、PHY_MODLE_TI_DP83822_PHYCR、phyregtemp);
#if defineed (debug_ethernet)&&(debug_ethernet = 1)
//检查初始化
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_MODEL _TI_DP83822_PHYCR、(uint16_t *)&phyregtempcheck);
xil_printf ("PHY %x 中的注册地址-设置:%x -值:%x\n"、PHY_MODEL TI_DP83822_PHYCR、phyregtemp、phyregtempcheck);
#endif
中断;
默认值:
xIL_printf(“不支持网络设备\n\r\n”);
返回 XST_FAILURE;
中断;
}
}
其他
{
xIL_printf(“不支持网络设备\n\r\n”);
返回 XST_FAILURE;
}
//
// XEmacps_PhyWrite (xemacpsp、phy_addr、IEEE-page_address_register、2);
// XEmacps_PhyRead (xemacpsp、phy_addr、IEEE_control_REG_MAC、&control);
//控制|= IEEE_RGMII_TXRX_CLOCK _DERAMED_MASK;
// XEmacps_PhyWrite (xemacpsp、phy_addr、IEEE_control_REG_MAC、control);
// XEmacps_PhyWrite (xemacpsp、phy_addr、IEEE_PAGE_ADDRESS_REGISTER、0);
XEmacps_PhyRead (xemacpsp、phy_addr、IEEE_AUTONEGO_advertised_REG、&control);
control |= IEEE_ONGICAL_PAUSE_MASK;
CONTROL |= IEEE-PAUST_MASK;
XEmacps_PhyWrite (xemacpsp、phy_addr、IEEE_AUTONEGO_advertised_REG、CONTROL);
// XEmacps_PhyRead (xemacpsp、phy_addr、IEEE_CONTRAL_REG_OFFSET、&CONTROL);
//控制&=~IEEE_CTRL_LINKSPEED_1000M;
//控制&=~IEEE_CTRL_LINKSPEED_100M;
//控制&=~IEEE_CTRL_LINKSPEED_10M;
if (速度=1000)
{
//控制|= IEEE-CTRL_LINKSPEED_1000M;
xIL_printf (“不支持1000Mbps 速度\n\r\n);
返回 XST_FAILURE;
}
否则(速度==100)
{
//控制|= IEEE-CTRL_LINKSPEED_100M;
/* Dont 广播1000Mbps 的 PHY 速度*/
//XEmacps_PhyWrite (xemacpsp、phy_addr、IEEE_1000_advertised_REG_offset、0);
/* Dont 广播10 Mbps 的 PHY 速度*/
XEmacps_PhyWrite (xemacpsp、phy_addr、IEEE_AUTONEGO_advertised_REG、advertised_100);
}
否则 if (speed ==10)
{
//控制|= IEEE-CTRL_LINKSPEED_10M;
/* Dont 广播1000Mbps 的 PHY 速度*/
//XEmacps_PhyWrite (xemacpsp、phy_addr、IEEE_1000_advertised_REG_offset、0);
/* Dont 广播100Mbps 的 PHY 速度*/
XEmacps_PhyWrite (xemacpsp、phy_addr、IEEE_AUTONEGO_advertised_REG、advertised_10);
}
/*执行数字重新启动*/
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_TI_PHYRCR,(uint16_t *)&phyregtemp);
phyregtemp |= PHY_TI_PHYRCR_DIGITAL_RESTK_MASK;
XEmacps_PhyWrite (xemacpsp、phy_addr、PHY_TI_PHYRCR、phyregtemp);
//返回状态= XEmacps_PhyRead (xemacsp、phy_addr、PHY_TI_PHYRCR、(uint16_t *)&phyregtemp);
//
// if (RetStatus!= XST_Success)
//{
// xil_printf (“数字重启时出错\n\r\n);
//返回 XST_FAILURE;
//}
/*等待重置完成*/
Wait = 0;
while (WAIT++< PHY_RESET_MAX_WAIT_TIME)
{
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_TI_PHYRCR、(uint16_t *)&phyregtemp);
if (((phyregtemp & PHY_TI_PHYRCR_DIGITAL_REST_BANK_MASK)= 0x00)&&(Wait >= PHY_RESET_MIN_WAIT_TIME))
中断;
}
if (Wait >= PHY_RESET_MAX_WAIT_TIME)//重置没有按时完成
{
xIL_printf ("数字重启时出错\n\r\n);
返回 XST_FAILURE;
}
//XEmacps_PhyWrite (xemacsp、phy_addr、IEEE_CONTRAL_REG_OFFSET、CONTROL | IEEE_CTRL_RESET_MASK);
//查询以重新启动自动执行
XEmacps_PhyRead (xemacpsp、phy_addr、PHY_TI_BMCCR、(uint16_t *)&phyregtemp);
phyregtemp |= PHY_MODE_TI_DP83822_AUTONEGO_RESTART;
XEmacps_PhyWrite (xemacpsp、phy_addr、PHY_TI_BMCCR、phyregtemp);
// for (wait = 0;wait < 100000;wait++);
xIL_printf ("\n PHY 初始化序列完成! \n\n");
返回 XST_SUCCESS;
}
下面是一个寄存器转储:
寄存器0x0操作值:0x1100
寄存器0x1操作值:0x7849
寄存器0x2操作值:0x2000
寄存器0x3操作值:0xA240
寄存器0x4操作值:0x0180
寄存器0x5操作值:0x0000
寄存器0x6操作值:0x0004
寄存器0x7操作值:0x2001
寄存器0x8操作值:0x0000
寄存器0x9操作值:0x0060
寄存器0xA 操作值:0x4120
寄存器0xB 操作值:0x0000
寄存器0xC 操作值:0x0000
寄存器0xD 操作值:0x401F
寄存器0xE 操作值:0x0005
寄存器0xF 操作值:0x0000
寄存器0x10操作值:0x0206
寄存器0x11操作值:0x0108
寄存器0x12操作值:0x0000
寄存器0x13操作值:0x0000
寄存器0x14操作值:0x0000
寄存器0x15操作值:0x0000
寄存器0x16操作值:0x0100
寄存器0x17操作值:0x0241
寄存器0x18操作值:0x0400
寄存器0x19操作值:0x8001
寄存器0x1A 的操作值:0x0000
寄存器0x1B 操作值:0x007D
寄存器0x1C 操作值:0x05EE
寄存器0x1D 操作值:0x0000
寄存器0x1E 操作值:0x0002
寄存器0x1F 的操作值:0x0000
寄存器0x461的操作值:0x0410
寄存器0x462操作值:0x0000
寄存器0x467的操作值:0x5FD3
寄存器0x468操作值:0x0005
我的侧面看不到任何错误、也不知道为什么至少 PC 无法识别连接。
有关在 JTAG 模式下使用 DP83867为 ZCU 104评估板加电而不运行任何代码的信息、至少 PC 会检测到未识别网络上的连接。
是否有人能够向正确的方向指出我?
谢谢
SEB