主题中讨论的其他器件: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、®Status、 mdioSemhandle); if (regStatus = 0x2000) { 返回 true; } 其他 { 返回 false; } }
是否有人可以帮助我解决这个问题?
请帮助...
Yi-Lin