用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
2、关于50M晶振,看一下LAN8720A的手册上是这样说的,要注意这个STRAP这个单词的意思是背带的意思,可以理解成被设置的值,也就是说模式的设置不是由这个引脚决定的,手册上也明确的说到了模式配置是由nINT/REFCLKO决定的,就是说我们的这个50M晶振同时给网卡和PHY提供时钟源。还有低成本模式就是XTAL1和XTAL2之间接25M晶振,网卡的时钟由REFCLKO提供,但是此时复用中断使能功能引脚nINT就没有用了。
3、PHY的寄存器我们主要关注的有3个,BCR、BSR、PHY_SR地址偏移如下表所示:
也是在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是网口数据包结构体,这两个结构体很重要。
下面继续看low_level_init(struct netif *netif)函数