TI中文支持网
TI专业的中文技术问题搜集分享网站

6678 SGMII0无法正常通信

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

Jane Lu:

Simba,

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

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

              

Simba John:

回复 Jane Lu:

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

Jane Lu:

回复 Simba John:

Simba,

           我先确认一下问题:

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

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

            

Simba John:

回复 Jane Lu:

Jane Lu,

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

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

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

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

Jane Lu:

回复 Simba John:

Simba,

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

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

            谢谢!

Simba John:

回复 Jane Lu:

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

        谢谢!!!

Kevin Cai:

回复 Simba John:

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的代码, 请帮忙检查上述问题

谢谢!

 

 

Simba John:

回复 Kevin Cai:

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上实验是完全正确的!

Kevin Cai:

回复 Simba John:

Hi, 您好!

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

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

 

Simba John:

回复 Kevin Cai:

Kevin Cai:

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

赞(0)
未经允许不得转载:TI中文支持网 » 6678 SGMII0无法正常通信
分享到: 更多 (0)