问题描述:根据正点原子的LAN8720原理图我自己画了一块板子,测试用的是LWIP的TCP客户端和服务器的两个例程,始终是无法通过初始化。
原理图如下,不说十分相似,也可以说是一模一样。
有一点需要注意,8720的复位引脚,原子的电路是通过一个三极管进行了取反操作,如果用GPIO复位,注意电平变化。
在初始化函数HAL_ETH_Init中有一条读取LAN8720状态寄存器,代码如下。运行过程中printf打印出来的数值为0x7809,while判断没有网线接入,那么问题就出现在LAN8720和网口之间。
/* We wait for linked status */do{//读取状态寄存器 HAL_ETH_ReadPHYRegister(heth, PHY_BSR, &phyreg);printf("PHY_BSR 01 :0x%x\r\n",phyreg);/* Check for the Timeout */if((HAL_GetTick() - tickstart ) > LINKED_STATE_TIMEOUT_VALUE){/* In case of write timeout */err = ETH_ERROR;/* Config MAC and DMA */ETH_MACDMAConfig(heth, err);heth->State= HAL_ETH_STATE_READY;/* Process Unlocked */__HAL_UNLOCK(heth);return HAL_TIMEOUT;}}while (((phyreg & PHY_LINKED_STATUS) != PHY_LINKED_STATUS));////通过值判断是否链接网线。
网线是差分信号传输,感觉加电容不太合理,就把电容拆掉,然后就可以正常通信了。
LAN8720手册给出的电路图中也并没有电容,不知道原子的板子为什么加电容,而且还没有问题。