使用贵司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, ®Status);
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, ®Status);
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