主题中讨论的其他部分:SysConfig、 DP83869
工具/软件:
您好、
我最近将一个 EtherCAT 子器件工程从工业通信 SDK 版本 9 更新为 11.00.00.08。 这更改了相对于 EtherCAT 和以太网 PHY 的 SysConfig 选项。
作为 SysConfig 参考、我使用了旧工程和工业 SDK 随附的 EtherCAT 示例工程中的现有 SysConfig 设置组合。
EtherCAT 初始化过程的一部分是启用以太网断电模式。 通过函数完成:
调试时、我注意到固件卡在第二个循环中评估 USER_ACCESS_REG、如以下代码片段所示:
if(retVal == SystemP_SUCCESS)
{
/* Wait till transaction completion if any */
while(CSL_MDIO_USER_GROUP_USER_ACCESS_REG_GO_EN_0x1 ==
CSL_FEXT(hMdioRegs->USER_GROUP[userGroup].USER_ACCESS_REG, MDIO_USER_GROUP_USER_ACCESS_REG_GO))
{}
CSL_FINS(regVal, MDIO_USER_GROUP_USER_ACCESS_REG_GO, CSL_MDIO_USER_GROUP_USER_ACCESS_REG_GO_EN_0x1);
CSL_FINS(regVal, MDIO_USER_GROUP_USER_ACCESS_REG_WRITE, CSL_MDIO_USER_GROUP_USER_ACCESS_REG_READ);
CSL_FINS(regVal, MDIO_USER_GROUP_USER_ACCESS_REG_PHYADR, phyAddr);
CSL_FINS(regVal, MDIO_USER_GROUP_USER_ACCESS_REG_REGADR, regNum);
CSL_REG_WR(&hMdioRegs->USER_GROUP[userGroup].USER_ACCESS_REG, regVal);
/* wait for command completion */
while(CSL_MDIO_USER_GROUP_USER_ACCESS_REG_GO_EN_0x1 ==
CSL_FEXT(hMdioRegs->USER_GROUP[userGroup].USER_ACCESS_REG, MDIO_USER_GROUP_USER_ACCESS_REG_GO))
{}
/* Store the data if the read is acknowledged */
if(CSL_MDIO_USER_GROUP_USER_ACCESS_REG_ACK_PASS ==
CSL_FEXT(hMdioRegs->USER_GROUP[userGroup].USER_ACCESS_REG, MDIO_USER_GROUP_USER_ACCESS_REG_ACK))
{
*pData = (uint16_t)(CSL_FEXT(hMdioRegs->USER_GROUP[userGroup].USER_ACCESS_REG,
MDIO_USER_GROUP_USER_ACCESS_REG_DATA));
retVal = SystemP_SUCCESS;
}
else
{
retVal = SystemP_FAILURE;
}
}
作为诊断问题的第一步、我检查了文档。 这说明、不应在调用`MDIO_initClock`的情况下调用` DIO_phyRegRead `M。 我通过在驱动程序函数`ETHPHY_DP83869_OPEN`中添加一条 LOG 语句来测试这是否完成、其中 initClock 函数是用基址参数调用的。 它打印了两次:
使用正确的参数调用 ETH PHY 进行初始化。 在“30090E40"处“处初始化 MDIO 时钟
使用正确的参数调用 ETH PHY 进行初始化。 在“30090E40"处“处初始化 MDIO 时钟
但是、即使 MDIO 时钟初始化、phyRegRead 函数也会挂起。 我还可以采取哪些其他步骤来进一步诊断问题? 我应该查看哪些特定的 SysConfig 设置吗?
此致、
Matthijs