This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/PROCESSOR-SDK-AM437X:定制板 PHY 初始化失败

Guru**** 2587935 points
Other Parts Discussed in Thread: TLK105

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/637646/rtos-processor-sdk-am437x-custom-board-phy-init-fails

器件型号:PROCESSOR-SDK-AM437X
主题中讨论的其他器件:TLK105

工具/软件:TI-RTOS

你(们)好

我正在将 EtherCAT + EnDAT 项目从 AM437x 工业 EVM (1.4A 版)迁移到我的定制板。

定制板的设计遵循 AM437x 工业 EVM 的电路、将外设模块缩减为 EnDat、QSPI (用于闪存)和 ICSS 以太网端口。

软件环境:

SYS/BIOS:IND SDK 02.01.03.02

编译器:GNU v4.4.8 (Linaro)

SYS/BIOS:6.41.4.54

XDCtool:3.31.2.38

  EtherCAT + EnDAT 项目是通过使用 EtherCAT 示例项目扩展 FOC 来开发的。

定制板将在 bsp_tlk105_init()函数中的 while 循环处卡住(tisebsp.c line1409)。

void bsp_tlk105_init (PRUICSS_Handle pruIcssHandle、UINT8 phy0addr、
uint8 phy1addr、uint8 enhancedlink_enable)
{
if (TIESC_MDIO_RX_LINK_ENABLE =增强型 LINK_ENABLE)
{
Board_phyMLEDConfig (((((PRUICSS_HwAttrs *))(
pruIcssHandle->hwAttrs)->baseAddr + PRU_ICSS_MDIO)、phy0addr、PHY_MLED_100、
null);
Board_phyMLEDConfig (((((PRUICSS_HwAttrs *))(
pruIcssHandle->hwAttrs)->baseAddr + PRU_ICSS_MDIO)、phy1addr、PHY_MLED_100、
空);
}

while (!mdio_getPhyIdentifyStat (((((PRUICSS_HwAttrs *))(
pruIcssHandle->hwAttrs)->baseAddr + PRU_ICSS_MDIO)、phy0addr、NULL)
{
} 

PRUETH 电路的设计遵循 AM437x IDK、仅更换 Mag RJ-45插孔。

我发现在 MDIO_getPhyIdentifyStat ()函数调用的 MDIOPhyRegRead (MDIO.c line90)中执行 HW_WR_REG32 ()函数时会出现怪异的情况。


void MDIOPhyRegRead (uint32_t baseAddr、
uint32_t phyAddr、
uint32_t Regnum、
uint16_t *pData)
{
uint32_t regVal = 0U;

/*等待事务完成(如果有)*/
while (MDIO_useraccess_GO_EN_0x1 =>
HW_RD_FIELD32 (baseAddr + MDIO_useraccess (0U)、
MDIO_useraccess_go));

HW_SET_FIELD (regVal、MDIO_useraccess_go、MDIO_useraccess_go_EN_0x1);
HW_SET_FIELD (regVal、MDIO_useraccess_write、MDIO_useraccess_read);
HW_SET_FIELD (regVal、MDIO_useraccess_PHYADR、phyAddr);
HW_SET_FIELD (regVal、MDIO_useraccess_REGADR、RegNum);
HW_WR_REG32 (baseAddr + MDIO_useraccess (0U)、regVal);

/*等待命令完成*/
while (MDIO_useraccess_GO_EN_0x1 =>
HW_RD_FIELD32 (baseAddr + MDIO_useraccess (0U)、
MDIO_useraccess_go));

/*如果读取得到确认、则存储数据*/
if (MDIO_useraccess_ack_pass ==
HW_RD_FIELD32 (baseAddr + MDIO_useraccess (0U)、
MDIO_useraccess_ACK);
{
*pData =(uint16_t)(HW_RD_FIELD32 (baseAddr + MDIO_useraccess (0U)、
mdio_useraccess_data);
}
} 

参数的值是

baseAddr: 0x54432400

phyAddr:0x0

寄存器编号:0x2

由于参数"baseAddr"和"regVal"的值为"0x54432400"和"0x80400000"  

在 AM437x IDK 上,0x54432480处的寄存器值应为0x80400000,但0x20402000。

在定制板上、值将为0x0040FFFF、不会传递 MDIO_getPhyIdentifyStat ()函数(osdrv_mdio.c line509)中的 if 语句

uint8_t MDIO_getPhyIdentifyStat (uint32_t mdioBaseAddress、uint32_t phyAddr、
MDIOSEM_Handle mdioSemhandle)
{
uint16_t regStatus;
MDIO_regRead (mdioBaseAddress、phyAddr、PHY_PHYIDR1_REG、regStatus、&regStatus、
mdioSemhandle);

if (regStatus = 0x2000)
{
返回 true;
}

其他
{
返回 false;
}
} 

是否有人可以帮助我解决这个问题?

请帮助...

Yi-Lin