主题中讨论的其他器件: 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








