CH182 判断link状态、速度及双工模式
CH182作为一款百兆PHY芯片,常规都需要搭配带MAC的主控MCU,加在驱动去使用,而一般驱动中,流程中往往会判断PHY芯片这边的link状态,双工状态、速度状态信息来作为后续通信的前置条件。
本文介绍两种获取PHY的link状态、速度及双工模式的方式
(1)
状态寄存器(0x01)的bit2可以指示PHY是否有成功建立连接,
再已建立连接的基础上,
控制寄存器(0x00)的bit8和bit13分别可以指示双工和速度,代码如下
1 phy_bsr = ETH_ReadPHYRegister( gPHYAddress, PHY_BSR);//0x01状态寄存器 2 phy_bcr = ETH_ReadPHYRegister( gPHYAddress, PHY_BCR);//0x00控制寄存器 3 if(phy_bsr & ((uint16_t)0x0004)) //LinkUp 4 { 5 if(phy_bcr & ((uint16_t)0x1000))//判断是否为自协商模式 6 { 7 if(phy_bsr & ((uint16_t)0x0020))//自协商完成 8 { 9 if(phy_bcr & ((uint16_t)0x2000)) 10 { 11 if(phy_bcr & ((uint16_t)0x0100)) 12 { 13 //百兆全双工 14 } 15 else { 16 //百兆半双工 17 } 18 } 19 else //十兆 20 { 21 if(phy_bcr & ((uint16_t)0x0100)) 22 { 23 //十兆全双工 24 } 25 else { 26 //十兆半双工 27 } 28 } 29 } 30 else { 31 //自协商模式,但自协商过程未未完成,可以按照未稳定做防抖重复读取操作 32 } 33 } 34 else { //不是自协商,为强制模式 35 if(phy_bcr & ((uint16_t)0x2000)) 36 { 37 if(phy_bcr & ((uint16_t)0x0100)) 38 { 39 //百兆全双工 40 } 41 else { 42 //百兆半双工 43 } 44 } 45 else 46 { 47 //十兆 48 if(phy_bcr & ((uint16_t)0x0100)) 49 { 50 //十兆全双工 51 } 52 else { 53 //十兆半双工 54 } 55 } 56 } 57 } 58 else { 59 //link down,无意义 60 }
(2)
1 ETH_WritePHYRegister(gPHYAddress, 0x1F, 0x0 ); 2 Delay_Us(1); 3 phy_stat = ETH_ReadPHYRegister( gPHYAddress, 16); 4 phy_stat_link = (phy_stat >> 0) & 0x01; 5 phy_stat_speed = (phy_stat >> 1) & 0x01; 6 phy_stat_dup = (phy_stat >> 2) & 0x01; 7 if(phy_stat_link == 1) 8 { 9 //link up! 10 if(phy_stat_speed == 1) 11 { 12 //100M Speed 13 }else { 14 //10M Speed 15 } 16 if(phy_stat_dup == 1) 17 { 18 //full-dup 19 } 20 else { 21 //half-dup 22 } 23 }else { 24 //link down! 25 }
如果对应用状态稳定性要求较高,可以增加简单的防抖逻辑,比如连续多次读取,每次读取间隔5~20ms状态一致,才上报更新最终状态;正常普通场景下直接用即可
浙公网安备 33010602011771号