2009-10-13 08:26 AM
Configure the MAC with the Duplex Mode fixed by the autonegotiation process
2011-05-17 12:58 AM
In the code snipit below, from 91x_enet.c the ENET_MAC is fixed up based on the reprted result of auto-negotiation.
I dont understand why the duplex mode is fixed up after comparing for speed. I've added pseudo line numbers to point to the lines I don't understand. The correct register is read in line 0004. Then in line 0005 I see ''if( regValue & PHY_Configured_Speed)''. It seems to me this should read ''if( regValue & PHY_Configured_Duplex)''. Does anyone have an explanation or is this an error? Regards Hugh if(ENET_OperatingMode == AUTO_NEGOTIATION) { /* The Link Status bit is a Latching High bit, so we need to read twice to get the real value */ 0000 ENET_MIIReadReg (PHY_ADDRESS, PHY_XSR); /* We wait for linked satus... */ 0001 while( !(ENET_MIIReadReg (PHY_ADDRESS, PHY_XSR) & PHY_Linked_Status) ); /* Enable Auto-Negotiation */ 0002 ENET_MIIWriteReg (PHY_ADDRESS, PHY_XCR, PHY_AutoNegotiation); /* Wait until the autonegotiation will be completed */ 0003 while( !(ENET_MIIReadReg (PHY_ADDRESS, PHY_XSR) & PHY_AutoNego_Complete) ); /* Read the result of the autonegotiation */ 0004 regValue = ENET_MIIReadReg (PHY_ADDRESS, PHY_XCIIS); /* */ 0005 if( regValue & PHY_Configured_Speed) { ENET_MAC->MCR |=ENET_MCR_FDM; /* Full Duplex Mode */ ENET_MAC->MCR &=~ENET_MCR_DRO; /* Enable frame reception during transmission */ } else { ENET_MAC->MCR &=~ENET_MCR_FDM; /* Half Duplex Mode */ ENET_MAC->MCR |=ENET_MCR_DRO; /* Disable frame reception during transmission */ } }2011-05-17 12:58 AM
There may be errors in the library. Can you please test your suggestion and reply? ST is not saint, although... :D