Ethernet link status for the K64F

Dependents:   JRO_CR2 K64F_EthLink_HelloWorld frdm_test JRO_DDSv2

Simple K64F technique to determine if the Ethernet PHY link is up or down. The routine utilizes the Ethernet MII interface to gain access to the Ethernet PHY which contains the actual link status.

I wrote this because the mbed Ethernet function does not recognize its own "int link();" function with the K64F.

Committer:
loopsva
Date:
Wed Oct 01 00:23:48 2014 +0000
Revision:
1:cbd7e77b6e38
Parent:
0:a447869e1046
Child:
2:59166b94dfd0
Changed MDIO timeout from 200mS to 300mS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:a447869e1046 1 #include "k64f_EthLink.h"
loopsva 0:a447869e1046 2 #include "rtos.h"
loopsva 0:a447869e1046 3
loopsva 0:a447869e1046 4 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a447869e1046 5 // Constructor
loopsva 0:a447869e1046 6
loopsva 0:a447869e1046 7 k64fEthLink::k64fEthLink() {
loopsva 0:a447869e1046 8 }
loopsva 0:a447869e1046 9
loopsva 0:a447869e1046 10 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a447869e1046 11 // Get Ethernet link status on the K64F
loopsva 0:a447869e1046 12
loopsva 0:a447869e1046 13 int k64fEthLink::GetELink() {
loopsva 0:a447869e1046 14 int mdio_timer = 0;
loopsva 0:a447869e1046 15 uint32_t k64f_mdio_reg = ENET_EIR;
loopsva 0:a447869e1046 16
loopsva 0:a447869e1046 17 //wait for MDIO interface to be ready
loopsva 0:a447869e1046 18 do {
loopsva 0:a447869e1046 19 k64f_mdio_reg = ENET_EIR;
loopsva 0:a447869e1046 20 Thread::wait(1); //release RTOS to do other functions
loopsva 0:a447869e1046 21 mdio_timer++;
loopsva 1:cbd7e77b6e38 22 } while(((k64f_mdio_reg & MDIO_MII_READY_BIT) == 0) && (mdio_timer < 300));
loopsva 1:cbd7e77b6e38 23 if(mdio_timer > 298) { //average is about 122mS
loopsva 0:a447869e1046 24 return(MDIO_TIMEOUT); //timeout error
loopsva 0:a447869e1046 25 }
loopsva 0:a447869e1046 26
loopsva 0:a447869e1046 27 //get Basic Status Register
loopsva 0:a447869e1046 28 ENET_MMFR = MDIO_GET_LINK_REG;
loopsva 0:a447869e1046 29 wait_us(35); //20 is absolute minimum!!
loopsva 0:a447869e1046 30 k64f_mdio_reg = ENET_MMFR; //get the phy result
loopsva 0:a447869e1046 31 if(k64f_mdio_reg & MDIO_MII_LINK_BITS) return(PHY_UP);
loopsva 0:a447869e1046 32 return(PHY_DOWN);
loopsva 0:a447869e1046 33 }
loopsva 0:a447869e1046 34