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状态一致,才上报更新最终状态;正常普通场景下直接用即可

 

posted on 2026-09-03 17:54  Lqqq123  阅读(8)  评论(0)    收藏  举报

导航