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.

TMS320F28388D: 关于CM核实现ESC PHY寄存器读取以及PHY偏移地址的问题

Part Number: TMS320F28388D

大家好,

1、我最近使用CM核实现ECAT从站控制器进行与上位通信,想问一下如何去读取与ESC连接的PHY芯片寄存器,如果是ENET的话可以通过Ethernet_readPHYRegister(EMAC_BASE,0)来执行,但如果是ESC的话应该怎么去读取?

2、我目前使用自制的28388D板子,在移植完cia402协议栈后能够正常与TwinCAT通信并能切换op状态,此时我是通过Port0来与上位连接,当我使用Port1连接时无法与上位通信,TwinCAT无法扫描到设备,我一开始以为是PHY芯片地址的问题,按照数据手册的说明

通过修改硬件电路使Port0的偏移地址设置为0,Port1设置为1,但是否还需要在程序上进行设置?我看到有配置偏移地址的这个函数ESCSS_configurePhyAddressOffset(ESC_SS_CONFIG_BASE, 1);经过尝试,无论程序偏移地址设置任何值都没有效果,也不知道是否需要设置,麻烦各位解答一下,谢谢。

  • 你好,英文论坛已经有工程师回复了,麻烦您帮我转述问题2的回答

    我用的PHY设备是YT8512H

    如图所示,24引脚和25引脚决定了PHY address的bit0和bit1

    ESC_PHY1_LINKSTATUS信号连接的是图中24引脚,Port1连接的PHY芯片中24引脚外接了一个10k的上拉电阻,25引脚外接下拉电阻,PHY address为1,

    同样的,Port0连接的PHY芯片中24引脚和25引脚外接了一个10k的下拉电阻,PHY address为0

    但是不管Port0端的PHY地址配置为何值,都能正常连接,而Port1不行。

    另外,想问下您说的ESC_PHYx_LINKSTATUSd的行为具体指的是什么?

  • 好的,我跟进过去了

  • 你好,我根据英文论坛问题1回复的代码进行了修改,PHY芯片的寄存器读写代码如下

    #define ESC_MII_CTRL_STATUS_1_OFFSET        0x0510
    #define ESC_MII_CTRL_STATUS_2_OFFSET        0x0511
    #define ESC_PHY_ADDRESS_OFFSET              0x0512
    #define ESC_PHY_REG_ADDRESS_OFFSET          0x0513
    #define ESC_PHY_DATA_OFFSET                 0x0514
    #define ESC_MII_ECAT_ACCESS_OFFSET          0x0516
    #define ESC_MII_PDI_ACCESS_OFFSET           0x0517
    #define ESC_PHY_STATUS_REG_OFFSET			0x0518
    
    uint16_t mii_readPhyRegister(uint8_t phyOffsetAddr, uint8_t regAddr)
    {
    	// Give PDI access to MII management
    	ESC_writeByteISR(0x01, ESC_MII_PDI_ACCESS_OFFSET);
    
        // Set PHY offset address to read/write, (0x0512)
    	ESC_writeByteISR(phyOffsetAddr, ESC_PHY_ADDRESS_OFFSET);
    
    	// Set PHY address to read/write, (0x0513)
    	ESC_writeByteISR(regAddr, ESC_PHY_REG_ADDRESS_OFFSET);
    
        // Write PHY reg, (0x0511)
    	ESC_writeByteISR(0x01, ESC_MII_CTRL_STATUS_2_OFFSET);
    
        while(ESC_readByteISR(ESC_MII_CTRL_STATUS_1_OFFSET) != 0x3); // wait till read is completed and successful
    
        return ESC_readWordISR(ESC_PHY_DATA_OFFSET);
    }

    我使用的是CM核来实现EtherCAT通信

    在执行上述读PHY寄存器函数时没有相关数据返回,不知道我的读写代码是否有问题,而且查看ESC寄存器0x0511时,MII busy位始终为1

    另外,我直接读取ESC寄存器0x0518的值时也是0,但Port0的连接状态是正常的,ESC能切换至op状态,想知道该如何正确读取PHY的linkstatus

    麻烦您帮忙转述一下,谢谢哈。

  • 客气了,已经转达

  • 你好,

    1、关于PHY设备寄存器读写问题

    我在初始化时执行了ESCSS_enableDebugAccess(ESC_SS_BASE);

    然后通过Debug进行查看寄存器的值

    通过Expressions查看0x0510:0x0511的值为0x03:0x81,一直这样保持,而当我在Memory Browser 查看0x400A0510的值为03,0x400A0511的值为00

    通过不同的方法查看寄存器的值不同,不知道哪一个是正确的,下面是我在CM核while循环上执行的代码

    while(1)
    {
        if(bRunApplication == TRUE) 
    	{
    	   MainLoop();
    	   Cia402Flag = 0;
    	}
    	else
    	{
    		if(!Cia402Flag)
    		{
    			CiA402_DeallocateAxis();
    			HW_Release();
    			Cia402Flag = 1;
    		}
    	}
    	
    	if(stsDetCnt >= 1000)
    	{
    		// read Port0 mii_reg 0x11
    		ESC_PhyP0LinkStatus = mii_readPhyRegister(0, 0x11);
    		
    		HW_EscReadByte(ESC_PhyP1LinkStatus, 0x0518);
    
    		HW_EscReadByte(mii_status, 0x0510);
    		HW_EscReadByte(mii_status1, 0x0511);
    
    		stsDetCnt = 0;
    
    		// mii_reg 0x11 Link_status_real-time set 1 and Duplex set 1 and Speed_mode set 0 or 1
    		if(ESC_PhyP0LinkStatus == 0x3f || ESC_PhyP0LinkStatus == 0x7f)
    		{
    			GPIO_writePin(mGPIO_PIN_LED12, 0);
    		}
    		else
    		{
    			GPIO_writePin(mGPIO_PIN_LED12, 1);
    		}
    
    	}
    	else
    	{
    		stsDetCnt++;
    	}
    }

    通过查看0x0511的值为0x81,所以mii busy一直都是置1的,当我去读PHY设备寄存器0x11的值时,在Expressions查看mii_readPhyRegister函数读回来的值是C000,而在Memory Browser查看的0x400A0514值为C03F,也就是说在Expressions和在Memory Browser中查看的值不一致,这些值都是设置的自动刷新。

    而当我用led进行测试时发现,偶尔会读回C03F的值,大多数情况都是C000。

    2、关于Port1端口无法被扫描的情况

    根据您的指示,我读回0x0110和0x0111的值如下

    ESC Reg Addr (Hex):

    No ECAT Master Connect

    ECAT Master Connect P0

    ECAT Master Connect P0 & P1, NO SCAN

    ECAT Master Connect P0 & P1, POST SCAN

    0x110:0x111

    0x17:0x56

    0x17:0x56

    P0:0x17:0x56, P1:0x17:0x56

    P0:0x17:0x56, P1:can not scan(Device1)

    我使用的ECAT Master是TwinCAT。

    麻烦您帮忙回复一下。

  • 你好,麻烦您转述一下。

    1、关于phy地址问题我按照工程师的建议通过硬件配置了Port0的地址为0,Port1地址为1,结果还是一样,Port1无法通信,我查询了28388D的数据手册说到:The ESC addresses the Ethernet PHYs typically using the logical port number plus the PHY address offset.Ideally, the Ethernet PHY addresses should correspond with the logical port number, so PHY addresses 0 and 1 are used.是不是可以理解为phy地址的值等于端口号加phy偏移地址(也就是硬件配置的phy地址)?就是说我硬件配置Port1的phy地址为3,那我在代码中访问该phy寄存器地址,是不是需要将4写入到ESC寄存器0x0512?

    2、另外,我按照工程师的建议,去读取ESC寄存器时,Debug后发现通过Expressions查看到的值与在Memory Browser查看的值不一致,请问这是什么原因造成的?

  • 好的,我已转达~

  • 感谢,还得再麻烦您转述一下。

    1、按照您的建议,通过硬件电路配置,已经把Port0的PHY address设置为0,Port1的PHY address设置为1。此时会改变C2000 ESC ESC_PHYx_LINKSTATUS引脚的输入电平极性,目前测得ESC_PHY0_LINKSTATUS的输入一直保持低电平,ESC_PHY1_LINKSTATUS的输入一直保持高电平,此时Port0端口能正常与主机通信,而Port1无法正常通信。

    我通过修改代码GPIO_setPadConfig(149, GPIO_PIN_TYPE_INVERT);将ESC_PHY1_LINKSTATUS输入电平进行极性反转,然后发现Port0端口和Port1都无法正常通信了,而此时ESC_LED_LINK0_ACTIVE和ESC_LED_LINK1_ACTIVE引脚输出电平的行为是一致的(同时输出为高电平或者低电平),想请教一下ESC_LED_LINKx_ACTIVE的行为有什么含义?为什么当ESC_PHY0_LINKSTATUS和ESC_PHY1_LINKSTATUS的输入电平都为低电平时,ESC_LED_LINKx_ACTIVE输出的电平行为一致,而且此时Port0和Port1端口都无法正常通信了。

    2、由于公司是内网,无法正常连接网络,关于这个问题的截图我会后续想办法提供给您,谢谢。

  • 好的,已转达

  • 你好,工程师有回复了,麻烦转述一下。

    关于YT8512H的24引脚行为是这样的:

    Port0端口:在PHY设备硬件复位时,24引脚作为PHY地址进行配置;复位完成后作为LED0工作,一直输出低电平

    Port1端口:在PHY设备硬件复位时,24引脚作为PHY地址进行配置;复位完成后作为LED0工作,当link up或者数据传输时,24引脚输出低电平,当link down时,24引脚输出高电平。

    此时ESC_PHYx_LINKSTATUS的输入都为低电平,所以在代码中ESC_PHYx_LINKSTATUS没有进行电平反转。

    但这样的结果是:

    只有P0连接TwinCAT时,P0的PHY设备24引脚输出低电平,P1的PHY设备24引脚输出高电平,TwinCAT能与设备正常通信。

    P0和P1同时连接TwinCAT时,P0的PHY设备24引脚输出低电平,P1的PHY设备24引脚也输出低电平,TwinCAT与P0和P1都无法正常通信

    在上一次回复中,我想表达的意思是,当ESC_PHY0_LINKSTATUS和ESC_PHY1_LINKSTATUS同时输入低电平时,P0和P1都无法正常通信。

  • 好的,我跟进过去了

  • 你好,麻烦再帮我转述一下。

    是的,当P0和P1的PHY设备24引脚同时输出低电平时,在TwinCAT中P0和P1都无法扫描到从站节点,

    令我感到奇怪的是,只要P0或者P1中任何一个PHY设备的24引脚输出高电平,则在TwinCAT中能扫描到P0的从站节点。

    我的理解是,ESC_PHYx_LINKSTATUS并不能表示真实的连接状态,针对这种情况,我还能从哪些方面去查找问题。

  • 你好,麻烦帮我转述一下。

    关于24引脚的输出行为是可以通过写phy寄存器配置的。

    默认的24引脚输出行为是您说的这种,我曾经在代码中尝试过将ESC_PHYx_LINKSTATUS输入电平进行反转,但结果就是上一次回复的那样,只要两个ESC_PHYx_LINKSTATUS同时输入为低电平时,TwinCAT都无法扫描P0和P1的从站节点。

    现在的情况是我把两个PHY设备的24引脚输出行为都改为了link up时输出低电平,所以在代码没有进行电平极性反转,但结果也是TwinCAT都无法扫描P0和P1的从站节点。

  • 你好,麻烦帮忙转述一下。

    1、关于这款YT8512H,我查阅了数据手册,是支持MII的,而且 读取P0和P1两个PHY设备寄存器的值也是一样的,但只有P0的PHY能被TwinCAT扫描到。

    2、另外,我打算换一个方案,换其他PHY设备使用,我公司目前已经引进了TI DP83848这款PHY设备,我想问C2000 28388D是否支持这款PHY设备,有没有相关的硬件连接方案作为参考。

    虽然打算换方案,但我还是想找到YT8512H连不上的原因,这里附上YT8512H数据手册。

    C2685350_以太网芯片_YT8512H_规格书_MOTORCOMM(裕太微)以太网芯片规格书.PDF