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.

6678 SGMII0无法正常通信



是这样的,我通过修改硬件电路和程序,使用SGMII1连PHY或者SGMII1连SGMII1,测试都可以正常link,并且可以正常通信,使用的同样的硬件配置和软件配置修改为SGMII0,发现SGMII0不能link,当然也无法正常通信,我看论坛里也有其他人在问类似的问题,请问各位专家,如何解决这一问题?

  • Simba,

                   C6678 EVM板上SGMII0口是连接AMC插槽,我们没有相关文档介绍如何修改硬件电路支持SGMII0口。

                   SGMII0和SGMII1的功能是一样的,不知您要更改为SGMII0的原因是什么? 我们可以看一下是否有其他解决方法。

                  

  • 十分感谢Jane Lu的热情解答。我的用途很简单,就是让6678同时使用SGMII0和SGMII1与外界通信,说白了就是想让SGMII1像SGMII0一样工作,如果SGMII0和SGMII1的功能是一样的,那为什么SGMII1接PHY或者接SGMII无法正常通信呢?需要对寄存器做什么特殊设置么?

  • Simba,

               我先确认一下问题:

                  1   您是SGMII0不能通信还是SGMII1不能通信?

                   2   是EVM单板还是其他单板?

                

  • Jane Lu,

        抱歉,刚才说错了,应该是SGMII0不能像SGMII1一样通信。我们用的是自己画的板子,板卡上有两片DSP,模型如下图:  

    (1)目前SMGII1外接PHY都已经可以正常通信了,但是两片DSP之间互联的SGMII0无法正常通信。

    (2)我将两片DSP之间用SGMII1直连也做过实验,也是好的。

    (3)我两DSP的SGMII0外接PHY也做过实验,无法正常通信。

  • Simba,

                能否把SGMII0和SGMII1在代码上配置不同的地方列一下,或者把相关配置代码付上看一下。

                另外,出错的具体现象是什么? 可否把EMAC对应的寄存器值导一份出来?

                谢谢!

  • Jane Lu:

            谢谢你的积极解答,由于过年,这段时间没顾得上及时给你回复。SGMII0和SGMII1的初始化不同主要提下在以下的函数中:

    void C6678_Init_SGMII (uint32_t macPortNum)
    {
        CSL_SGMII_ADVABILITY    sgmiiCfg;
        CSL_SGMII_STATUS        sgmiiStatus;

        /* Reset the port before configuring it */
        CSL_SGMII_doSoftReset (macPortNum);
        while (CSL_SGMII_getSoftResetStatus (macPortNum) != 0);

         if (macPortNum == 1) {
            /* Hold the port in soft reset and set up
             * the SGMII control register:
             *      (1) Disable Master Mode
             *      (2) Enable Auto-negotiation
             */
            CSL_SGMII_startRxTxSoftReset (macPortNum);
            CSL_SGMII_disableMasterMode (macPortNum);
            CSL_SGMII_enableAutoNegotiation (macPortNum);
            CSL_SGMII_endRxTxSoftReset (macPortNum);

            /* Setup the Advertised Ability register for this port:
             *      (1) Enable Full duplex mode
             *      (2) Enable Auto Negotiation
             *      (3) Enable the Link
             */
            sgmiiCfg.linkSpeed      =   CSL_SGMII_100_MBPS;
            sgmiiCfg.duplexMode     =   CSL_SGMII_FULL_DUPLEX;
            CSL_SGMII_setAdvAbility (macPortNum, &sgmiiCfg);

            do
            {
                CSL_SGMII_getStatus(macPortNum, &sgmiiStatus);
            } while (sgmiiStatus.bIsLinkUp != 1);

            /* Wait for SGMII Autonegotiation to complete without error */
            do
            {
                CSL_SGMII_getStatus(macPortNum, &sgmiiStatus);
                if (sgmiiStatus.bIsAutoNegError != 0)
                    return; /* This is an error condition */
            } while (sgmiiStatus.bIsAutoNegComplete != 1);
        }

        if (macPortNum == 0) {
            /* Hold the port in soft reset and set up
             * the SGMII control register:
             *      (1) Disable Master Mode
             *      (2) Enable Auto-negotiation
             */
            CSL_SGMII_startRxTxSoftReset (macPortNum);
            CSL_SGMII_disableMasterMode (macPortNum);
            CSL_SGMII_enableAutoNegotiation (macPortNum);
            CSL_SGMII_endRxTxSoftReset (macPortNum);

            /* Setup the Advertised Ability register for this port:
             *      (1) Enable Full duplex mode
             *      (2) Enable Auto Negotiation
             *      (3) Enable the Link
             */
            sgmiiCfg.linkSpeed      =   CSL_SGMII_1000_MBPS;
            sgmiiCfg.duplexMode     =   CSL_SGMII_FULL_DUPLEX;
            sgmiiCfg.bLinkUp        =   1;
            CSL_SGMII_setAdvAbility (macPortNum, &sgmiiCfg);

            do
            {
                CSL_SGMII_getStatus(macPortNum, &sgmiiStatus);
            } while (sgmiiStatus.bIsLinkUp != 1);
         }

        /* All done with configuration. Return Now. */
        return;
    }

            向C6678_Init_SGMII函数传递0就是对SGMII0进行初始化,同理传参为1时则是对SGMII1初始化。

            目前的情况是,C6678_Init_SGMII(1)可以对SGMII1正常初始化,可以与PHY芯片linkup,而且可以正常完成TCP/IP通信。C6678_Init_SGMII(0)则不行。

            在网上查到这个帖子,似乎有解决办法,但是我也没太看懂,请专家给分析分析。

            http://e2e.ti.com/support/dsp/c6000_multi-core_dsps/f/639/p/226969/799906.aspx

            谢谢!!!

  • Hi, 您好

    如果您的其他部分代码(除上述SGMII代码)是相同的, 可以删掉如下分支代码:

    if (macPortNum == 0) {
            /* Hold the port in soft reset and set up
             * the SGMII control register:
             *      (1) Disable Master Mode
             *      (2) Enable Auto-negotiation
             */
            CSL_SGMII_startRxTxSoftReset (macPortNum);
            CSL_SGMII_disableMasterMode (macPortNum);
            CSL_SGMII_enableAutoNegotiation (macPortNum);
            CSL_SGMII_endRxTxSoftReset (macPortNum);

            /* Setup the Advertised Ability register for this port:
             *      (1) Enable Full duplex mode
             *      (2) Enable Auto Negotiation
             *      (3) Enable the Link
             */
            sgmiiCfg.linkSpeed      =   CSL_SGMII_1000_MBPS;
            sgmiiCfg.duplexMode     =   CSL_SGMII_FULL_DUPLEX;
            sgmiiCfg.bLinkUp        =   1;
            CSL_SGMII_setAdvAbility (macPortNum, &sgmiiCfg);

            do
            {
                CSL_SGMII_getStatus(macPortNum, &sgmiiStatus);
            } while (sgmiiStatus.bIsLinkUp != 1);
         }

    同时 删掉if (macPortNum == 1)的判断条件, 即SGMII0, SGMII1都用SGMII1相同的配置

    e2e链接中的问题是两个端口的模式在pdk中初始化成不一致, 分别是PLATFORM_EMAC_PORT_MODE_AMC模式和PLATFORM_EMAC_PORT_MODE_PHY模式,

    在初始化时会检查模式, 只有PLATFORM_EMAC_PORT_MODE_PHY可以支持, 所以0不可用,而1可以

    如果您使用了pdk的代码, 请帮忙检查上述问题

    谢谢!

     

     

  • Kevin Cai

        你好,谢谢你的及时解答,出了粘出来的代码部分,SGMII1和SGMII0没有什么不一样的地方,至少是我没有找到。我的测试历程是在PDK的例程的基础上写改的,但是已经不依赖于platform_init函数了,而是自己调用以上SGMII初始化函数(C6678_Init_SGMII函数),多以我觉得应该跟PLATFORM_EMAC_PORT_MODE_PHY模式无关。

        此外,我按照你上边提到的,将SGMII0和SGMII1初始化过程改为一致,仍不能解决问题。使用SGMII0建立TCP/IP连接时,

      if( connect( stcp, (PSA) &sin_svr, sizeof(sin_svr) ) < 0 )
      {
               platform_write("failed connect (%d)\n",fdError());
      }

    该函数发生阻塞。

    查看SGMII0状态寄存器(sgmiiStatus.bIsLinkUp),显示状态时link的。

    而相同的代码在SGMII1上实验是完全正确的!

  • Hi, 您好!

    您的两个DSP 的 SGMII0 是直连在一起的, 这种 情况需要将一个SGMII设置 成自协商 master; 将另一个SGMII设置 成自协商slave模式

    您原来的代码两个SGMII0都设置成了slave

     

  • Kevin Cai:

        你好,我知道你说的这个情况,我对SGMII0和SGMII1的测试,都是基于SGMII接PHY在接RJ45的情况完成的测试,以保证SGMII0和SGMII1外部连接的是相同的硬件环境,所以不存在你说的这个问题。

  • Kevin Cai:

          你好,在http://e2e.ti.com/support/dsp/c6000_multi-core_dsps/f/639/t/226969.aspx链接中对platform.c的修改:

    emac_port_mode[PLATFORM_MAX_EMAC_PORT_NUM] =

    {

    // CHAO HU: fake SGMII 0 as PHY. In nimu_eth.c, function EMACInit_Core() only looks for PHY port

    //    PLATFORM_EMAC_PORT_MODE_AMC,

    PLATFORM_EMAC_PORT_MODE_PHY,

    //~CHAO HU

    PLATFORM_EMAC_PORT_MODE_PHY

    };

    的修改,在nimu_eth.c  中的 EMACInit_Core()函数中得到调用,但是它如何对配置SGMII0起作用的,而且我看代码中似乎只有在nimu_eth例程中得到了调用,在helleworld 中并没有找到,那么这个修改又是如何在helleworld 例程中起作用的(链接中最后说该修改使helleworld 也可以通过SMGII0正常发包)。我想如果搞清楚这个,似乎对解决问题有帮助。

    再次谢谢专家的帮助!

  • Hi, 您好!

    EMACInit_Core()中,找到PLATFORM_EMAC_PORT_MODE_PHY的端口,并进行初始化配置; 对于非PLATFORM_EMAC_PORT_MODE_PHY类型的端口,没有配置     if (emac_info.mode == PLATFORM_EMAC_PORT_MODE_PHY)         {             break;         }

     

    另外您也可以参考我们写的以太网程序:

    http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/47664.aspx

    您需要修改GE_Test.c中的下列变量:

    GE_Test_Data_Path test_data_path= GE_TEST_DSP0_TO_DSP1;

    Ethernet_Mode ethernet_mode =ETHERNET_AUTO_NEGOTIAT_SLAVE; (一个DSP设置成master; 一个是slave)

    看您是用的哪个以太网端口, 将用的以太网端口设置成GE_PORT_CABLE_CONNECT, 不用的端口设置成GE_PORT_NO_CONNECT

    GE_Port_Connection port_connect[2]=
    {
     GE_PORT_CABLE_CONNECT, //SGMII port 0

     GE_PORT_NO_CONNECT, //SGMII port 1

    }

     

     

  • Hi , 您好!

    对于SGMII 直连的情况, 端口配置成GE_PORT_SGMII_CONNECT模式

    GE_Port_Connection port_connect[ 2]=
    {
     GE_PORT_SGMII_CONNECT, //SGMII port 0

     GE_PORT_NO_CONNECT, //SGMII port 1

    }

    谢谢

  • Kevin Cai:

            你好,我大概看了你共享出来的例程,而且尝试使用该例程进行测试实验,接收端(DSP1)运行正常,发送端(DSP0)在执行GE_DSP0_to_DSP1_test->GE_2DSP_Test->Fill_EMAC_header->buffer[1]= (_hill(destMAC)>>0)&0xFF;出现异常,由文件GE_vectors.asm文件的

    vectors:
     VEC_RESET _c_int00       ;RESET 
     VEC_ENTRY NMI_ISR ;NMI/Exception
     VEC_DUMMY     ;RSVD
     VEC_DUMMY     ;RSVD
     VEC_ENTRY GE_Message_ISR    ;interrupt 4
     VEC_ENTRY GE_MISC_MDIO_ISR    ;interrupt 5
     VEC_DUMMY     ;interrupt 6
     VEC_DUMMY     ;interrupt 7
     VEC_DUMMY       ;interrupt 8
     VEC_DUMMY     ;interrupt 9
     VEC_DUMMY     ;interrupt 10
     VEC_DUMMY     ;interrupt 11
     VEC_DUMMY     ;interrupt 12
     VEC_DUMMY     ;interrupt 13
     VEC_DUMMY     ;interrupt 14
     VEC_DUMMY     ;interrupt 15
     
     .end

    以上标红出抛出异常。

    请你帮助分析一下。

    此外:我看代码中是使用ARP包来进行测试,不知道有没有TCP/IP的例程可供参考?

  • Kevin Cai:

           你好,我之前的测试例程实是通过修改mcsdk_2_01_02_05\example\ndk\client例程进行的,该例程有完整的tcp\ip通信的机制,并且实在sys-bios基础上进行的,但是我将初始化SGMII1改为SGMII0进行测试就不行了,希望专家能帮忙支持,我使用SGMII1和使用SGMII0有什么不同,再该例程中我需要做哪些修改?

  • Hi, 您好!

    一个建议是在SGMII0和SGMII1两次测试中,比较两个网口的寄存器(含MAC, SGMII, SerDes)的差别

    因为是在ndk上修改的,  可能还是与e2e里提到的问题修改不彻底有关

    谢谢 !

  • Kevin Cai:

            你好,感谢你的指导!我通过跟踪SGMII0的状态发现服务器端DSP和客户端DSP的SGMII0状态时link的(这个在SGMII_init()函数能正常返回也是得到了验证),但是客户端DSP的connect函数仍然无法跟服务端DSP的accept建立连接,通过分析打印我观察到:

    static void NetworkIPAddr( IPN IPAddr, uint IfIdx, uint fAdd )
    {
        ......

        ......
        platform_write("If-%d:%d.%d.%d.%d\n", IfIdx,
                (UINT8)(IPTmp>>24)&0xFF, (UINT8)(IPTmp>>16)&0xFF,
                (UINT8)(IPTmp>>8)&0xFF, (UINT8)IPTmp&0xFF );

          ......

          ......

    }

    打印的是

            if-1:192.168.2.101

    进一步跟踪,发现

    int StackTest()中有对IP的绑定操作, 由于我们用的http模式(非DHCP模式),因此有以下代码完成对IP的绑定操作

    int StackTest()

    {       

           ......

           ......

            bzero( &NA, sizeof(NA) );
            NA.IPAddr  = inet_addr(LocalIPAddr);
            NA.IPMask  = inet_addr(LocalIPMask);
            strcpy( NA.Domain, DomainName );
            NA.NetType = 0;

            // Add the address to interface 1
            CfgAddEntry( hCfg, CFGTAG_IPNET, 1, 0,
                               sizeof(CI_IPNET), (UINT8 *)&NA, 0 );

            // Add the default gateway. Since it is the default, the
            // destination address and mask are both zero (we go ahead
            // and show the assignment for clarity).
            bzero( &RT, sizeof(RT) );
            RT.IPDestAddr = 0;
            RT.IPDestMask = 0;
            RT.IPGateAddr = inet_addr(GatewayIP);

            // Add the route
            CfgAddEntry( hCfg, CFGTAG_ROUTE, 0, 0,
                               sizeof(CI_ROUTE), (UINT8 *)&RT, 0 );

           ......

           ......

    }

    我将其中标红的代码改为:

    CfgAddEntry( hCfg, CFGTAG_IPNET, 0, 0,
                               sizeof(CI_IPNET), (UINT8 *)&NA, 0 );

    但是进过测试发现,类似于

     if-1:192.168.2.101

    的打印没有了,所以我怀疑我想将IP绑定到interface 0并没有成功,而且客户端DSP的connect操作虽然不再阻塞了,但是却在不停地打印connect failed!

            我认为我使用SGMII0进行通信就应该就IP绑定在interface 0上,否则connect将无法找到要连接的IP的服务器端,请专家分析我这样认为和这样修改正确么?

    如果不正确请给出正确的修改方法!

  • 你好,是否有通过6678初始化SRIO和SGMII的文档说明,比较详细的,最好能说明第一步第二步等干什么,非常感谢

  • Hi, 您好!

    如果您是需要初始化的步骤, 建议参考芯片手册。比如:

    SGMII 参考: <KeyStone Architecture Gigabit Ethernet (GbE) Switch Subsystem User Guide (SPRUGV9C)> 第2.5节

    SRIO参考: <KeyStone Architecture Literature Serial Rapid IO (SRIO) User Guide (SPRUGW1A)>

    另外附我们此前开发代码(代码链接见下)时写的文档,供参考

    http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/47664.aspx

    谢谢!

    KeyStone_1_GE_STK_User's_Guide.doc
  • 能否给出SRIO的文档,我不知道我已经下载的和你说的是否是一个,因为名称不一样.非常感谢

  • Hi, 您好!

    您可以在下面链接的Andy的回复(2014-1-23)中找到KI_STK_20140123.zip,  这个压缩包包含了代码和 文档

    http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/47664.aspx

    供参考,谢谢!

  • 你好,你能把C6678 SGMII1与phy通信具体的程序发我一份吗?我正在做这部分的研究,谢谢了!

  • baoquan  lin,还在调试吗???有些问题想咨询