是这样的,我通过修改硬件电路和程序,使用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外部连接的是相同的硬件环境,所以不存在你说的这个问题。