我们新做的板子,使用C6678,网口的配置不同于开发板,我们的PASS参考时钟和SGMII端口参考时钟都是156.25,开发板上的PASS参考钟应该是100,SGMII的端口参考时钟是312.5。我们使用的网口是port0,开发板上是port1;目前的情况下,phy在物理连接上可以正常与pc连接,但是,在我们配置过PASS时钟和SGMII端口时钟后,也就是配置寄存器SGMII_SERDES_CFGPLL = 0x00000081,改* PASS PLL settings for 1050 MHz */ #define PLLM_PASS=335 #define PLLD_PASS=24,SGMII端口pll能够锁住,并且能够linkup, 但是网络一直ping不通,太速也做过类似时钟的板子,我们咨询他们,他们说使用这个时钟端口1可以调通,端口0调不通。我想问问,是不是端口0和端口1的配置有什么区别?在配置端口0的时候有什么需要特别注意的吗?
我看开发板的原理图,网络端口0并未连接到网卡芯片88e11上,但是我用MCNDK里面的实例去配置网络的0口,仍然能够ping通,这是怎么回事?
Kevin Cai:
Hi,
端口0和端口1的配置一样,没有什么特殊, 在你的配置里,SGMII_SERDES_CGFRXn配的是什么?
开发板上端口1是连接了PHY的, MCNDK可能是同时把端口0和端口1都配置了, 所以从端口1过来的ping包也能发到DSP, 并收到DSP的回复
Wenguo Li1:
回复 Kevin Cai:
谢谢您的解答。
void ConfigSerdes(){ /* Unlock the chip configuration registers to allow SGMII SERDES registers to * be written */ CSL_BootCfgUnlockKicker();
/* Configure the SERDES */ /* Multiply to be 8 with Quarter Rate in the Rx registers */ CSL_BootCfgSetSGMIIConfigPLL (0x00000081);
pll_delay(100);
//31:25 Reserved 0000000 //23:24 LOOPBACK 00 // 22 ENOC 1 //21:18 EQ 0001 //17:15 CDR 001 — first order threshold of 17 //14:12 LOS 000 — tie off //11:10 ALIGN 01 — Comma Aligned //09:07 TERM 100 — tie off (100) // 06 INVPAIR 0 //05:04 RATE 01 — tie off (10) //00 = Full Rate, 01 = Half Rate (*0.5), 10 = Quarter Rate (*0.25) //03:01 BUSWIDTH 000 — tie off // 00 ENRX 1 // 0000 0000 0100 0100 0000 0010 0001 0001 = 0x0044_0211 — My estimated value // 0000 0000 0100 0100 0000 0100 0001 0001 = 0x0044_0411 — New DV value // 0000 0000 0000 1000 0000 1000 0100 0001 = 0x0008_0841 — Original DV value
CSL_BootCfgSetSGMIIRxConfig (0, 0x00700621); CSL_BootCfgSetSGMIIRxConfig (1, 0x00700621);
//31:22 Reserved 0 //21:20 LOOPBACK 00 //19:18 RDTCT 00 — tie off // 17 ENIDL 0 — tie off // 16 MYSNC 1 — tie off //15:12 DEMPHASIS ???? – 0001 Lets give some de-emphasis //11:08 SWING ???? // 07 CM 1 — tie off // 06 INVPAIR 0 //05:04 RATE 01 — tie off //03:01 BUSWIDTH 000 — tie off // 00 ENTX 1 // 0000 0000 0011 0001 ???? ???? 1001 0001 = 0x0031_1E91 — My estimated value // 0000 0000 0000 0001 0000 1111 0001 0001 = 0x0001_0F11 — New DV value // 0000 0000 0100 0000 0001 1110 0100 0001 = 0x0040_1e41 — Original DV value CSL_BootCfgSetSGMIITxConfig (0, 0x000108A1); CSL_BootCfgSetSGMIITxConfig (1, 0x000108A1);
/* Poll the SGMII0 lock bit to confirm that the sgmii module has recognized that the SERDES PLL has locked */ do { CSL_SGMII_getStatus(0, &sgmii_status); printf("port 0 sgmii_status.bIsLocked = %d.\n",sgmii_status.bIsLocked); } while (sgmii_status.bIsLocked != 1);
/* Poll the SGMII1 lock bit to confirm that the sgmii module has recognized that the SERDES PLL has locked */ do { CSL_SGMII_getStatus(1, &sgmii_status); printf("port 1 sgmii_status.bIsLocked = %d.\n",sgmii_status.bIsLocked); } while (sgmii_status.bIsLocked != 1);}
void Init_SGMII (unsigned int macPortNum){ CSL_SGMII_ADVABILITY sgmiiCfg; CSL_SGMII_STATUS sgmiiStatus;
int nCount = 10;
/* 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);
/* 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; CSL_SGMII_setAdvAbility (macPortNum, &sgmiiCfg);
do { nCount–; CSL_SGMII_getStatus(macPortNum, &sgmiiStatus);
printf("port %d sgmiiStatus.bIsLinkUp = %d.\n",macPortNum,sgmiiStatus.bIsLinkUp);
} while (sgmiiStatus.bIsLinkUp != 1 && nCount > 0);
/* Wait for SGMII Autonegotiation to complete without error */ do { CSL_SGMII_getStatus(macPortNum, &sgmiiStatus);
printf("port %d,sgmiiStatus.bIsAutoNegError = %d, sgmiiStatus.bIsAutoNegComplete = %d.\n",macPortNum,sgmiiStatus.bIsAutoNegError,sgmiiStatus.bIsAutoNegComplete);
if (sgmiiStatus.bIsAutoNegError != 0) return; /* This is an error condition */ } while (sgmiiStatus.bIsAutoNegComplete != 1 && nCount > 0);
/* All done with configuration. Return Now. */ return;}
以上是156.25参考钟下的配置程序,这些寄存器应该都配置正确了吧?
我试过将开发板的SGMII port0 飞线到88e11上,开发板网络也会ping不通,但是换回SGMII port1就可以。最后实在没办法只能将我们自制板卡上的 SGMII port1 飞线连接到88e11上,这样可以ping通。所以我还是疑问SGMII port0 和port1在配置上有什么区别?还是NDK有什么区别?我使用的是ndk_2_22_03_20。
Kevin Cai:
Hi,
请修改下面的配置:SGMII_SERDES_CFGPLL = 0x00000041
建议检查一下SGMII0, 您可以设置 SGMII0 的serdes环回, 这个环回从DSP发包到SGMII 0 的serdes再环回到DSP收包, 看SGMII0 是否正常
在这个论坛里有可供测试的程序:
http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/47664.aspx
Wenguo Li1:
回复 Kevin Cai:
谢谢您的回复,我在最开始调试的时候就用的是0x00000041,不行,我才找原因,发现时serdes的时钟配的不正确,开发板上应该是0x00000041,但是我的板卡的参考时钟是156.25,所以应该是0x00000081吧,不管是开发板,还是我们做的板子,回环都是可以的。
参考实例我已经跑过了,回环模式可以,外部phy不可以。
谢谢您的解答!
Kevin Cai:
回复 Wenguo Li1:
Hi,
是的, 参考时钟是156.25 时, 是0x00000081
SGMII0 的问题是你们的多块板子上都有出现吗, 还是只有一块?
Wenguo Li1:
回复 Kevin Cai:
多谢您的回复。
我只在开发板和我们自制的板卡(我们自己制作一块卡的成本很高,一般都是先调试通了才会在重新做板的)上试过,在开发板上,我们是将SGMII port 0飞线连接到88e11上的,在我们的板卡上,SGMII port 0本身就是连接到88e11上的。
le wang3:
回复 Wenguo Li1:
你好,我也在调SGMII0的网口,请问你们当时是怎么解决SGMII0无法通信的?可以简单说说思路吗?
非常感谢
user5032060:
回复 Wenguo Li1:
您好,请问这个问题如何解决的您还有印象吗,我调了好几天一直解决不了