PHY芯片lan8720调试笔记

简介

因工作需要,设计一款产品,使用STM32F407+LAN8720实现TCP通信。板子焊好后,运行程序一直卡在while (ETH_GetSoftwareResetStatus() == SET); ,初始化失败,经过调试和网上查找资料,最终实现TCP联通。再此记录,防止遗忘。

电路图

参考正点原子战舰开发板电路,区别是部分引脚改变:

  1. RMII_TX_EN >>> PB11
  2. RMII_TXD0 >>> PB12
  3. RMII_TXD1 >>> PB13
  4. RMII_RST >>> PB15

程序

移植lwip 1.4协议栈,参考正点原子战舰开发板的程序,裸机运行。

出现的问题

  1. 运行软件重启单片机网络失败,卡在 while (ETH_GetSoftwareResetStatus() == SET); 函数中,肉眼检查没有发现焊接错误。于是在网上查找相似的问题,在正点原子的官方论坛上发现有好多人都是这个错误,楼下回复都是检查芯片的焊接。于是动用示波器,检测LAN8720的晶振,发现25M输入正常。检查nINT/REFCLKO 输出时钟,发现50M信号没有,查看lan8720的pdf,看到LED2/nINTSEL拉低到地,设置REFCLKO输出50M,没有发现问题,只能尝试重新焊接。我用烙铁重加焊锡后,再用风枪加热,保证焊盘的充分接触。动用风枪的原因是lan8720底部焊盘是GND。再次运行程序发现可以成功重启单片机网络。
  2. 上边问题解决后,又出现了新的问题,现象是开启DHCP后单片机不能正确获取分配的IP地址,超时设置为静态的IP地址,电脑也ping不通,实在找不到问题原因。请教同事伦哥,伦哥指导将PHY芯片寄存器数据读出来,看是否和设置的一致。听到这个方法的我第一反应是phy芯片绝对设置正确,因为单片机显示屏能够显示出网速是100M的,这个网速就是读取phy芯片得到的。后来实践证明,我的想法不对。经过使用**ETH_ReadPHYRegisterPHY(0x00,31)**函数读取phy寄存器,发现结果都是0XFFFF,这才确定phy芯片没有正确配置。至于上述的100M检测结果只是检测到8720特殊功能寄存器的返回值是7,也就是三个一,这里满足100M的(第二位为1)的检测条件,(见下图),所以误认为phy芯片配置成功。经过程序检查,发现对8720的gpio引脚配置出错,修改正确后能正确ping通。

PHY芯片lan8720调试笔记_第1张图片

	//网速检测函数
	speed = LAN8720_Get_Speed();//µÃµ½ÍøËÙ
	if(speed&1<<1)//这里不严谨,导致误认为phy已经成功配置
	{
		printf("Ethernet Speed:100M\r\n");
		sprintf((char *)buf,"Ethernet Speed:100M\r\n");
		LCD_ShowString(0,48,buf,12);
		LCD_Refresh_Gram();	
	}
	else
	{
		printf("Ethernet Speed:10M\r\n");
		sprintf((char *)buf,"Ethernet Speed:10M\r\n");
		LCD_ShowString(0,48,buf,12);
		LCD_Refresh_Gram();	
	}

总结

任何硬件的调试都不要想当然,在出现问题时首先检查硬件,具体方法是测量关键点电平和信号,比如8720的VDDCR是否正常输出1.2V,25M晶振是否正常工作,50M晶振是否正常输入到单片机中。保证硬件正常后,如果还不能工作,再检查软件配置,具体来说,GPIO引脚的配置是否正确、复用功能是否开启,外设时钟是否开启、以及对特定硬件寄存器读取,检查是否为写入的值。一步一步的来排除问题。

你可能感兴趣的:(单片机)