是这样的,我通过修改硬件电路和程序,使用SGMII1连PHY或者SGMII1连SGMII1,测试都可以正常link,并且可以正常通信,使用的同样的硬件配置和软件配置修改为SGMII0,发现SGMII0不能link,当然也无法正常通信,我看论坛里也有其他人在问类似的问题,请问各位专家,如何解决这一问题?
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.
是这样的,我通过修改硬件电路和程序,使用SGMII1连PHY或者SGMII1连SGMII1,测试都可以正常link,并且可以正常通信,使用的同样的硬件配置和软件配置修改为SGMII0,发现SGMII0不能link,当然也无法正常通信,我看论坛里也有其他人在问类似的问题,请问各位专家,如何解决这一问题?
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的代码, 请帮忙检查上述问题
谢谢!
你好,谢谢你的及时解答,出了粘出来的代码部分,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:
你好,在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
}
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:
你好,感谢你的指导!我通过跟踪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的服务器端,请专家分析我这样认为和这样修改正确么?
如果不正确请给出正确的修改方法!
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
谢谢!
你好,你能把C6678 SGMII1与phy通信具体的程序发我一份吗?我正在做这部分的研究,谢谢了!