您好,现在使用EVM6678LE的开发板调试网口,需要通过SGMII1口发送数据。根据数据手册中KeyStone Architecture Gigabit Ethernet(GbE) Switch Subsystem的第2.5节进行操作,并使用了开发例程提供的void KeyStone_MDIO_PHY_Set_Reg(Uint32 phyNum, Uint32 regNum, Uint16 data)函数发送UDP报文,使用Wireshark进行抓包,没有收到任何数据。有如下以及疑问:
1、 KeyStone_MDIO_PHY_Set_Reg中的形参Uint16 data是否就是需要发送的UDP报文,phyNum和regNum分别如何配置;
2、现在无法发送数据是不是还是因为配置不对;
3、如果配置正常的话,是不是就可以使用Wireshark抓到数据;
4、UDP报文最终的CRC-32是否需要自己产生?在PA这个例程中似乎没有看到CRC-32如何产生;
5、UDP报文中的CRC-16是不是即便错了数据也能发送?在PA例程中,故意将CRC-16置错,数据照样能发送,但是Wireshark软件中会提示校验有错。
//SGMII KeyStone_main_PLL_init(100, 10, 1); KeyStone_PASS_PLL_init(100, 21, 2);
KeyStone_GE_Config *ge_cfg; memset(&ge_cfg, 0, sizeof(ge_cfg)); ge_cfg->serdes_cfg.commonSetup.inputRefClock_MHz = 312.5;
ge_cfg->ethernet_port_cfg[1]->mode = ETHERNET_AUTO_NEGOTIAT_SLAVE; ge_cfg->ethernet_port_cfg[1]->CPPI_Src_ID= 1; ge_cfg->ethernet_port_cfg[1]->RX_FIFO_Max_blocks= 8; ge_cfg->ethernet_port_cfg[1]->RX_flow_control_enable= TRUE; ge_cfg->ethernet_port_cfg[1]->TX_flow_control_enable= TRUE; ge_cfg->ethernet_port_cfg[1]->flow_control_MAC_Address= 0x0017EAC9F88F; ge_cfg->ethernet_port_cfg[1]->ethenet_port_statistics_enable= TRUE; ge_cfg->ethernet_port_cfg[1]->host_port_statistics_enable= TRUE; ge_cfg->ethernet_port_cfg[1]->prmiscuous_mode = ETHERNET_RX_CMF_EN;
ge_cfg->mdio_cfg->clock_div = 0; ge_cfg->mdio_cfg->link_INT0_PHY_select= MDIO_INT_SELECT_PHY_0; ge_cfg->mdio_cfg->link_INT1_PHY_select= MDIO_INT_SELECT_PHY_1;
ge_cfg->RX_MAX_length= 9504;
KeyStone_GE_Init(ge_cfg);
Wait_PHY_link(); gpMDIO_regs->USER_GROUP[0].USER_ACCESS_REG = gpMDIO_regs->ALIVE_REG; gpSGMII_regs[0]->CONTROL_REG |= CSL_CPSGMII_CONTROL_REG_MASTER_MASK;
while(1) {
//SGMII
if(gpMDIO_regs->LINK_REG == 0)
{
printf("link PHY%d is NOT up\n", 1);
}
else
{
printf("link PHY%d is up\n", 1);
}
for(i=0; i<sizeof(pktMatch);i++)
{
test = (pktMatch[i]<<8) | pktMatch[i+1];
i++;
KeyStone_MDIO_PHY_Set_Reg(0,0,test);
}
十分着急,谢谢了。
Allen35065:
KeyStone_MDIO_PHY_Set_Reg 这个函数是用来配置PHY芯片的寄存器的,跟UDP包无关
ping liu1:
回复 Allen35065:
谢谢。那请问我应该使用KeyStone中的何函数使得DSP发送数据?
我使用GE例程中的DSP_2DSP_TEST测试由DSP向PC机发送数据。例程默认的数据类型是ARP,我将其改为IPV4后无法正常发送32个数据包。
另外我所需要发送数据包的内容在何处写入,例程中好像没有体现,谢谢。
ping liu1:
回复 ping liu1:
通过修改GE例程中GE_TEST_DSP0_TO_DSP1和ETHERNET_AUTO_NEGOTIAT_MASTER,当Fill_EMAC_header(ucpBuffer, ETHERNET_IPV4_PACKET, Source_MAC_address[j], Dest_MAC_address[j])时可以发送成功,现在最主要的问题时,我准备好的数据包改如何利用函数KeyStone_queuePush(GE_DIRECT_TX_QUEUE, TxDescriptorTempBuffer[i]|FETCH_SIZE_64)发送,例程中并未体现数据包具体内容,非常感谢。
yuxiang li:
回复 Allen35065:
您好,我想问您一个问题:
在keystone的这个gbe中函数 Wait_PHY_link()中有while(0==gpMDIO_regs->LINK_REG&(1<<i));
但是当我查到gpMDIO_regs->LINK_REG这个寄存器在运行while之前和运行while之后都是0,但是while语句通过了,这让我很费解,还请帮忙解答一下。
我还想问下,这个phy alive和phy link的区别,这个link是板子上的phy要和其他外设的phy通信之后才算link么,当时看文档觉得有些没有理解,还想请您帮忙解释一下。
感激不尽
renyi su:
回复 yuxiang li:
@yuxiang li 我也遇到了同样的问题:
do { CSL_SGMII_getStatus(macPortNum, &sgmiiStatus); } while (sgmiiStatus.bIsLinkUp != 1);在while 之前和之后sgmiiStatus寄存器的值都是0x38,linkup位是0的情况。
你的问题是怎么解决的?