主题中讨论的其他器件: DP83822I、 C2000WARE、 TMDSCNCD28388D、 TMDSHSECDOCK
我正在使用 TMS320F28388D 开发以太网。
所规范的 PHY 为 dp83822i。
(配置如下所述)
我正在使用 C2000ware 驱动程序进行初始以太网设置。 当我设置为"10Mbps"时、发送和接收都成功、但当我设置为"100Mbps"时、接收时会出现许多错误。
查看 Statistic、错误的原因似乎是"rxCRCrorPackets"。 10Mbps 不会导致此问题。
PHY BMCR 选择正确、因此我认为 PHY 侧没有问题。 自动导航在关闭状态下检查、但在打开状态下观察到相同的行为。
测试环境由两个具有上述环境的电路板和一个仅更改了 MAC 地址的程序组成。
TMS320F28388D <-(RMII)->dp83822i <-(full/100m)->dp83822i <-(RMII)->TMS320F28388D
使用"100Mbps"时、我是否忘记设置任何内容?
Ethernet_InitInterfaceConfig initInterfaceConfig; Ethernet_InitConfig *pInitCfg; initInterfaceConfig.ssbase = EMAC_SS_BASE; initInterfaceConfig.enet_base = EMAC_BASE; initInterfaceConfig.phyMode = ETHERNET_SS_PHY_INTF_SEL_RMII; initInterfaceConfig.clockSel = ETHERNET_SS_CLK_SRC_EXTERNAL; // PHY : RMII Master mode. PHY output 50Mhz clock. EMAC input. initInterfaceConfig.ptrPlatformInterruptDisable = &Platform_disableInterrupt; initInterfaceConfig.ptrPlatformInterruptEnable = &Platform_enableInterrupt; initInterfaceConfig.ptrPlatformPeripheralEnable = &Platform_enablePeripheral; initInterfaceConfig.ptrPlatformPeripheralReset = &Platform_resetPeripheral; initInterfaceConfig.peripheralNum = SYSCTL_PERIPH_CLK_ENET; initInterfaceConfig.interruptNum[0] = INT_EMAC; initInterfaceConfig.interruptNum[1] = INT_EMAC_TX0; initInterfaceConfig.interruptNum[2] = INT_EMAC_TX1; initInterfaceConfig.interruptNum[3] = INT_EMAC_RX0; initInterfaceConfig.interruptNum[4] = INT_EMAC_RX1; pInitCfg = Ethernet_initInterface(initInterfaceConfig); Ethernet_getInitConfig(pInitCfg); pInitCfg->pktMTU = 1536; pInitCfg->numChannels = 2; for ( i = 0U; i < pInitCfg->numChannels; i++ ) { pInitCfg->chInfo[ETHERNET_CH_DIR_TX][i].numBD = 1; pInitCfg->chInfo[ETHERNET_CH_DIR_TX][i].chNum = i; pInitCfg->chInfo[ETHERNET_CH_DIR_RX][i].numBD = 8; pInitCfg->chInfo[ETHERNET_CH_DIR_RX][i].dmaBufferSize = 384; // dmaBuffSize <<= 2 ; // RX Only pInitCfg->chInfo[ETHERNET_CH_DIR_RX][i].chNum = i; } pInitCfg->emacSSConfig.phyIntfSel = ETHERNET_SS_CTRLSTS_PHY_INTF_SEL_RMII; pInitCfg->emacSSConfig.clkSrcSel = ETHERNET_SS_CTRLSTS_CLK_SRC_SEL_EXTERNAL; pInitCfg->emacSSConfig.LoopBackModeClkSel = ETHERNET_SS_CTRLSTS_LMCLKSEL_NORMAL; pInitCfg->emacSSConfig.flowControlEn = ETHERNET_SS_CTRLSTS_FLOW_CTRL_EN_DISABLED; pInitCfg->loopbackMode = ETHERNET_MAC_CONFIGURATION_LM_LOOPBACK_DISABLED; pInitCfg->maxPacketLengthRxBuffer = 1536; pInitCfg->dmaMode.TxRxArbitration = ETHERNET_DMA_OPERATION_MODE_DA_ROUND_ROBIN; // DA // pInitCfg->dmaMode.TransmitPriority = 0; // TXPR // Priority Rx pInitCfg->dmaMode.PriorityRatio = ETHERNET_DMA_OPERATION_MODE_PR_TX4_RX1; // PR // Rx4:Tx1 pInitCfg->linkMode = ETHERNET_MAC_CONFIGURATION_DM_FULL_DUPLEX; pInitCfg->pfcbGetPacket = &func_CB_pfcbGetPacket; // self pInitCfg->pfcbRxPacket = &func_CB_pfcbRxPacket; // self pInitCfg->pfcbFreePacket = &func_CB_pfcbFreePacket;// self /* Since the buffer for descriptors is managed and operated by the user, pInitCfg->rxBuffer is not necessary. */ Ethernet_getHandle((Ethernet_Handle)1, pInitCfg, &etHandel); Ethernet_clearMACConfiguration( EMAC_BASE, 0x2 ); // TX Disable Ethernet_clearMACConfiguration( EMAC_BASE, 0x1 ); // RX Disable (void)Interrupt_enableInProcessor(); Interrupt_registerHandler(INT_EMAC_TX0, Ethernet_transmitISR); Interrupt_registerHandler(INT_EMAC_TX1, Ethernet_transmitISR); Interrupt_registerHandler(INT_EMAC_RX0, Ethernet_receiveISR); Interrupt_registerHandler(INT_EMAC_RX1, Ethernet_receiveISR); Interrupt_enable(INT_EMAC_TX0); Interrupt_enable(INT_EMAC_TX1); Interrupt_enable(INT_EMAC_RX0); Interrupt_enable(INT_EMAC_RX1); /* MAC Address Set */ uint32_t mac[2] = {0}; device->emacMACaddrCfg.channelNum = 0; // instanseNUM 0 = ETHERNET_O_MAC_ADDRESS0, 1 = ETHERNET_O_MAC_ADDRESS1, 2... 0-7 mac[0] = ((uint32_t)m_MAC.addr[4] << 8 | m_MAC.addr[5]); mac[1] = ((uint32_t)m_MAC.aaddr[0] << 24 | m_MAC.addr[1] << 16 | m_MAC.aaddr[2] << 8 | m_MAC.addr[3]); Ethernet_setMACAddr( EMAC_BASE, // Base Address 0, // InstansNum 0-7 mac[0], // MAC Address HIGH mac[1], // MAC Address LOW ETHERNET_CHANNEL_0); // CHANNEL0 or CHANNEL1 /* Change Speed, Duplex */ uint16_t mdio_reg = PHY_MdioRegRead( 0x0010 ); /* linkSpeed ( MAC_Configuration Register "FES" ) */ if ( (mdio_reg & 0x2) != 0 ) Ethernet_clearMACConfiguration( EMAC_BASE, ((uint32_t)1 << 14) ); // EMAC 100Mbps else Ethernet_setMACConfiguration( EMAC_BASE, ((uint32_t)1 << 14) ); // EMAC 10Mbps /* linkMode ( MAC_Configuration Register "DM" ) */ if ( (mdio_reg & 0x4) != 0 ) Ethernet_setMACConfiguration( EMAC_BASE, ((uint32_t)1 << 13) ); // EMAC Full Duplex else Ethernet_clearMACConfiguration( EMAC_BASE, ((uint32_t)1 << 13) ); // EMAC Half Duplex Ethernet_setMACConfiguration( EMAC_BASE, 0x2 ); // TX Enable Ethernet_setMACConfiguration( EMAC_BASE, 0x1 ); // RX Enable