Part Number:TMS320C6678
【环境】TMS320C6678 + 88E111
【问题描述】
TMS320C6678 + 88E111环境下进行网口功能开发,初始化SGMII的时候程序一直卡在通过CSL_SGMII_getStatus获取sgmii状态的流程里。
【当前排查点】
1、在调用获取sgmii状态函数前使用CSL_SGMII_enableLoopback函数设置sgmii自回环模式,获取sgmii状态是正确的。
2、查看phy的指示灯,连接网线后LED_LINK1000,LED_DUPLEX正常点亮,LED_RX处于闪烁状态,初步判定phy工作正常。
3、在另一块开发板上进行代码测试,通信正常,说明代码没有问题。
4、查看phy和mac部分的原理图,phy时钟部分 正常的板卡原理图上XTAL1和XTAL2连接的是25M差分时钟,异常的原理图上XTAL1连接的是25M单端时钟,XTAL1悬空,查看88E1111手册,该时钟配置应该是支持的。
5、phy配置引脚设置,配置中只有phy地址感觉会影响phy和mac之间的通信,其他配置应该对连接状态没有影响,由于硬件不太好更改,phy地址设置为0测试不通
附出问题的原理图及初始化部分代码:
初始化部分代码:
void init_sgmii (uint32_t macPortNum)
{
int32_t wait_time;
CSL_SGMII_ADVABILITY sgmiiCfg;
CSL_SGMII_STATUS sgmiiStatus;
/* Configure the SERDES, set MPY as 10x mode */
CSL_BootCfgSetSGMIIConfigPLL(0x00000051);
/* delay 100 cycles */
cpu_delaycycles(100);
/*
* ENRX: 0x1 – Enable Receive Channel
* RATE: 0x10 – PLL output clock rate by a factor of 2x
* ALIGN: 0x01 – Enable Comma alignment
* EQ : 0xC – Set to 1100b when RATE = 0x10
* ENOC: 0x1 – Enable offset compensation
*/
CSL_BootCfgSetSGMIIRxConfig (macPortNum, 0x00700621);
/*
* ENRX: 0x1 – Enable Transmit channel
* RATE: 0x10 – PLL output clock rate by a factor of 2x
* INVPAIR: 0x0 – Normal polarity
*/
CSL_BootCfgSetSGMIITxConfig (macPortNum, 0x000108A1);
/* Wait sgmii serdes configure complete time set as 1ms */
wait_time = 1000;
while(wait_time) {
CSL_SGMII_getStatus(macPortNum, &sgmiiStatus);
if (sgmiiStatus.bIsLocked == 1) {
break;
} else {
/* delay 1000 cycles */
cpu_delaycycles(1000);
wait_time –;
}
}
if(wait_time == 0) {
printf("configure sgmii0 serdes time out!\n");
return;
}
/* Reset the port before configuring it */
CSL_SGMII_doSoftReset(macPortNum);
while(CSL_SGMII_getSoftResetStatus(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);
//CSL_SGMII_enableLoopback(macPortNum);//loopback
/*
* 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;
}
原理图:
【疑问】
1、当前代码中使用的地址是mac的地址,6678中固定两个值0和1,phy地址是否需要在程序中指定?
2、当前通过灯的状态是否可以确认phy的自协商及接收状态是正常的,mac自闭环可以link是否证明mac配置是正常的,那还有其他会影响link状态的因素吗?如何进行后续的排查?
望能够得到各位专家的指点!
Nancy Wang:
请参考Keystone I 以太网子系统调试手册看一下:
www.ti.com/…/zhca536.pdf
,
?? ?:
请问这里的测试例程在哪里能找到?
,
?? ?:
问题已解决通过CSL_BootCfgSetSGMIIConfigPLL修改SERDES时钟为156.25M
,
Nancy Wang:
好的,感谢分享!