
STM32F107驱动Dp83848以太网芯片程序代码例程
最近在项目里折腾STM32F107和DP83848这对搭档,这PHY芯片配置起来真是让人头大。特别是当硬
件同事把原理图甩过来的时候,看到那一堆MDIO/MDC信号线就预感到要掉头发。好在最后摸清了套路,这
里把关键代码和踩坑经验分享给大家。
先说硬件接法,DP83848的PHYAD0引脚决定了PHY地址。咱们板子上这个引脚接地,所以PHY地址是0x
00。这个地址后面配置MAC的时候要特别注意,很多兄弟在这里栽跟头。
上电第一步得先伺候好时钟。STM32的AHB总线时钟要开启,别忘了MAC用的DMA时钟:
```c
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ETH_MAC | RCC_AHBPeriph_ETH_MAC_Tx |
RCC_AHBPeriph_ETH_MAC_Rx, ENABLE);
```
接下来是GPIO配置。以RMII接口为例,注意CR寄存器要配置成50MHz模式:
```c
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12; // RMII_TXD0/TXD1
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
```
PHY初始化这块最磨人。建议先用软件复位打个招呼:
```c
uint16_t phy_status;
ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_REG_BMCR, PHY_Reset);
do {
phy_status = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_REG_BMCR);
} while (phy_status & PHY_Reset); // 等复位完成
```
然后开启自动协商,这里有个坑——DP83848的自动协商完成标志位有点迟钝,实测要加个延时:
```c
ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_REG_BMCR, PHY_AutoNegotiation);