[GD32]PHY芯片替换需要注意的细节
1.定义并设置芯片类型
#define DP83848 0
#define PHY_TYPE DP83848
2.设置PHY地址
#define PHY_ADDRESS ((uint16_t)1U)
PHY芯片地址取决于PHYAD[0]引脚,引脚拉高则置1,拉低或者浮空置0。
3.设置PHY速度以及工作模式
在PHY状态寄存器里,位1表示速度,位2表示工作模式,寄存器地址为0x10。
15 | 14 | 13 | … | 3 | 2 | 1 | 0 | ||
---|---|---|---|---|---|---|---|---|---|
速度 | √ | 0x0002 | |||||||
模式 | √ | 0x0004 |
在代码中设置如下
#elif(PHY_TYPE == DP83848)
#define PHY_SR 16U /*!< tranceiver status register */
#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< configured information of speed: 10Mbit/s */
#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< configured information of duplex: full-duplex */
#endif /* PHY_TYPE */
在gd32f4xx_enet.c文件里,对PHY速度以及工作模式判断部分代码需要按照寄存器工作模式以及速度设置更改。如PHY状态寄存器中
位1
0 | 100M |
---|---|
1 | 10M |
位2
0 | 半双工 |
---|---|
1 | 全双工 |
代码如下
if((uint16_t)RESET != (phy_value & PHY_DUPLEX_STATUS)){
media_temp = ENET_MODE_FULLDUPLEX;
}else{
media_temp = ENET_MODE_HALFDUPLEX;
}
/* configure the communication speed of MAC following the auto-negotiation result */
if((uint16_t)RESET !=(phy_value & PHY_SPEED_STATUS)){
media_temp |= ENET_SPEEDMODE_10M;
}else{
media_temp |= ENET_SPEEDMODE_100M;
}