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.

AMIC110配合KSZ8041NL做ECAT

Other Parts Discussed in Thread: AMIC110, TLK110

使用贵司ethercat_slave_full_AMIC11x_arm例程,使用AMIC110_demo板OK,由于我们使用了ksz8041NL的phy,因此修改了一下程序。

#define AM335X_ICSS1_PORT1_PHY_ADDR 1
#define AM335X_ICSS1_PORT2_PHY_ADDR 2

我们的板子PHY地址为1和2,所以修改phy的地址为1和2,

修改

while(!Board_getPhyIdentifyStat((((PRUICSS_HwAttrs *)(
pruIcssHandle->hwAttrs))->prussMiiMdioRegBase), pmdio_params->addr0));

while(!Board_getPhyIdentifyStat((((PRUICSS_HwAttrs *)(
pruIcssHandle->hwAttrs))->prussMiiMdioRegBase), pmdio_params->addr1)); 

uint16_t regStatus = 0;

CSL_MDIO_phyRegRead((((PRUICSS_HwAttrs *)(
pruIcssHandle->hwAttrs))->prussMiiMdioRegBase), pmdio_params->addr0, PHY_ID1_REG, &regStatus);
if(regStatus == 0x0022)
{
// return TRUE;
}

else
{
// return FALSE;
while(1);
}
regStatus = 0;
CSL_MDIO_phyRegRead((((PRUICSS_HwAttrs *)(
pruIcssHandle->hwAttrs))->prussMiiMdioRegBase), pmdio_params->addr1, PHY_ID1_REG, &regStatus);

if(regStatus == 0x0022)
{
// return TRUE;
}

else
{
// return FALSE;
while(1);
}

注释掉以下代码,因为KSZ8041NL和TLK110的phy寄存器不一样。

Board_enablePhyAutoMDIX((((PRUICSS_HwAttrs *)(
pruIcssHandle->hwAttrs))->prussMiiMdioRegBase), pmdio_params->addr0); //0x19
Board_enablePhyAutoMDIX((((PRUICSS_HwAttrs *)(
pruIcssHandle->hwAttrs))->prussMiiMdioRegBase), pmdio_params->addr1);
uint16_t phyregval = 0;
CSL_MDIO_phyRegRead((((PRUICSS_HwAttrs *)(
pruIcssHandle->hwAttrs))->prussMiiMdioRegBase),
pmdio_params->addr0, TLKPHY_PHYCR_REG, &phyregval);
phyregval |= TLKPHY_AUTOMDIX_ENABLE;
CSL_MDIO_phyRegWrite((((PRUICSS_HwAttrs *)(
pruIcssHandle->hwAttrs))->prussMiiMdioRegBase),
pmdio_params->addr0, TLKPHY_PHYCR_REG, phyregval);

CSL_MDIO_phyRegRead((((PRUICSS_HwAttrs *)(
pruIcssHandle->hwAttrs))->prussMiiMdioRegBase),
pmdio_params->addr1, TLKPHY_PHYCR_REG, &phyregval);
phyregval |= TLKPHY_AUTOMDIX_ENABLE;
CSL_MDIO_phyRegWrite((((PRUICSS_HwAttrs *)(
pruIcssHandle->hwAttrs))->prussMiiMdioRegBase),
pmdio_params->addr1, TLKPHY_PHYCR_REG, phyregval);

/* Turning OFF RMII mode and selecting MII mode */
phyregval = 0;
CSL_MDIO_phyRegWrite((((PRUICSS_HwAttrs *)(
pruIcssHandle->hwAttrs))->prussMiiMdioRegBase),
pmdio_params->addr0, TLKPHY_RCSR_REG, phyregval);

/* Turning OFF RMII mode and selecting MII mode */
phyregval = 0;
CSL_MDIO_phyRegWrite((((PRUICSS_HwAttrs *)(
pruIcssHandle->hwAttrs))->prussMiiMdioRegBase),
pmdio_params->addr1, TLKPHY_RCSR_REG, phyregval);

// bsp_ethphy_init(pruIcssHandle, pmdio_params->addr0, pmdio_params->addr1,
// pmdio_params->enhancedlink_enable);

//Select PHY address enable link change interrupt at MDIOLinkIntMasked and MDIOLinkIntRaw
if(pmdio_params->enhancedlink_enable == 0)
{
MDIO_enableLinkInterrupt((((PRUICSS_HwAttrs *)(
pruIcssHandle->hwAttrs))->prussMiiMdioRegBase), 0, pmdio_params->addr0,
MDIO_LINKSEL_DISABLE);
MDIO_enableLinkInterrupt((((PRUICSS_HwAttrs *)(
pruIcssHandle->hwAttrs))->prussMiiMdioRegBase), 1, pmdio_params->addr1,
MDIO_LINKSEL_DISABLE);
}

else
{
MDIO_enableLinkInterrupt((((PRUICSS_HwAttrs *)(
pruIcssHandle->hwAttrs))->prussMiiMdioRegBase), 0, pmdio_params->addr0,
MDIO_LINKSEL_ENABLE);
MDIO_enableLinkInterrupt((((PRUICSS_HwAttrs *)(
pruIcssHandle->hwAttrs))->prussMiiMdioRegBase), 1, pmdio_params->addr1,
MDIO_LINKSEL_ENABLE);

}

此番修改后,如果代码烧录后,全速运行,无法链接到主站。

后面debug发现需要先phy建立链接状态了,再去运行协议栈,可以顺利连接主站。

例如在phy操作时加入一下语句等待。


bsp_pruss_mdio_init(pruIcssHandle, &mdioParamsInit);
while(bsp_pruss_mdio_phy_link_state(pruIcss1Handle, 1) != 2);

让初始化程序等在这里,插上网线即可连接主站成功。

有以下疑问:

1、AMIC110配合KSZ8041NL的phy硬件是否能和ET1100配合KSZ8041NL一致?目前我们电路是一致的。

2、目前的问题是否可以确定是phy的时序问题,是否可通过设置相关寄存器配置目前的时序?

3、TI ESC中0xE00~0xE14这段寄存器具体定义是什么?有没有说明文档?

#define ESC_ADDR_TI_PORT0_ACTIVITY 0xE00
#define ESC_ADDR_TI_PORT1_ACTIVITY 0xE04
#define ESC_ADDR_TI_PORT0_PHYADDR 0xE08
#define ESC_ADDR_TI_PORT1_PHYADDR 0xE09
#define ESC_ADDR_TI_PDI_ISR_PINSEL 0xE0A
#define ESC_ADDR_TI_PHY_LINK_POLARITY 0XE0C
#define ESC_ADDR_TI_PORT0_TX_START_DELAY 0xE10
#define ESC_ADDR_TI_PORT1_TX_START_DELAY 0xE12
#define ESC_ADDR_TI_ESC_RESET 0xE14