用STM32CubeMX生成STM32F407ZG + LAN8720A 的LWIP

1、首先在ETH里面使能RMII,然后参数设置这里的PHY Address要根据你RXER引脚是否上拉决定是0还是1,如果有上拉就要设置为1,没有上拉就设置为0。我这里上拉了,所以地址就必须设置为1。这个设置在stm32f4xx_hal_conf.h中

/* lan8720_PHY_ADDRESS Address*/ 

#define lan8720_PHY_ADDRESS           1U

用STM32CubeMX生成STM32F407ZG + LAN8720A 的LWIP

2、关于50M晶振,看一下LAN8720A的手册上是这样说的,要注意这个STRAP这个单词的意思是背带的意思,可以理解成被设置的值,也就是说模式的设置不是由这个引脚决定的,手册上也明确的说到了模式配置是由nINT/REFCLKO决定的,就是说我们的这个50M晶振同时给网卡和PHY提供时钟源。还有低成本模式就是XTAL1和XTAL2之间接25M晶振,网卡的时钟由REFCLKO提供,但是此时复用中断使能功能引脚nINT就没有用了。

用STM32CubeMX生成STM32F407ZG + LAN8720A 的LWIP

 3、PHY的寄存器我们主要关注的有3个,BCR、BSR、PHY_SR地址偏移如下表所示:

 

用STM32CubeMX生成STM32F407ZG + LAN8720A 的LWIP

也是在stm32f4xx_hal_conf.h中配置。

#define PHY_BCR                         ((uint16_t)0x00U)    /*!< Transceiver Basic Control Register   */

#define PHY_BSR                         ((uint16_t)0x01U)    /*!< Transceiver Basic Status Register    */

/* Section 4: Extended PHY Registers */

#define PHY_SR                          ((uint16_t)31U)    /*!< PHY status register Offset                      */  

4、下面就是PHY的初始化了,首先找到ethernetif_init,如下图中所示,网卡初始化就在这个函数里面,然后再看这个函数里面的low_level_init(netif);这个就是PHY的初始化函数了,netif是网口的接口管理结构体,还有一个pbuf是网口数据包结构体,这两个结构体很重要。

用STM32CubeMX生成STM32F407ZG + LAN8720A 的LWIP

 下面继续看low_level_init(struct netif *netif)函数

用STM32CubeMX生成STM32F407ZG + LAN8720A 的LWIP