简介

因工作需要,设计一款产品,使用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通。

 //网速检测函数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引脚的配置是否正确、复用功能是否开启,外设时钟是否开启、以及对特定硬件寄存器读取,检查是否为写入的值。一步一步的来排除问题。

PHY芯片lan8720调试笔记相关推荐

  1. PHY芯片88EE1111 MDIO接口调试

    本次调试88EE1111 PHY芯片之主要目的主要对应为了将其默认的GMII接口通过配置成RGMII接口.因此,可能本文档涉及到的内容并没有涉及到PHY芯片的88EE1111所有内容. PHY芯片管理 ...

  2. 千兆以太网PHY芯片调试-88E1111(RGMII接口-数据收发ECHO测试) Verilog实现python测试

    千兆以太网PHY芯片调试-基于RGMII接口的88E1111(数据收发ECHO测试) 先放结果: Py测试代码: import socket #网络通信 TCP,UDP DST_IP = '192.1 ...

  3. Ksz8081目前为MICROCHIP主推的PHY芯片之一,原为MICREL公司设计;芯片分为MII接口型号,RMII接口型号,分了两种不同的产品型号。enc28j60集成了MAC和PHY芯片

    从硬件的角度看,以太网接口电路主要由 MAC(Media Access Control,MAC)控制器和物理层接口 PHY(Physical Layer,PHY)两大部分构成.如下图所示: Ksz80 ...

  4. 转载:ZYNQ+linux网口调试笔记(1)PS-GEM0

    ZYNQ+linux网口调试笔记(1)PS-GEM0 转载原文:https://www.jianshu.com/p/a4e25e8b2f5e 开发环境 Windows SDK 2017.4 Ubunt ...

  5. zynq linux ip配置,ZYNQ+linux网口调试笔记(2)PS-GEM1

    1. 开发环境 Windows SDK 2017.4 Ubuntu Petalinux 2017.4 硬件平台:米联客ZYNQ开发板MIZ7035 2. 开发目标 在ZYNQ上使用gigE Visio ...

  6. 单片机+PHY芯片+Powerlink协议实现高效数据采集探究(工业总线485和CAN的升级)

    CAN总线和RS-485总线作为常用的工业通信总线,在许多工业领域中得到广泛使用.但随着工业应用的不断扩展和网络化的需求增加,它们面临着一些局限性.例如CAN总线虽然具有较高的通信速率和可靠性,但存在 ...

  7. 调试笔记--jlink 变量转实时波形小技巧

    调试笔记–jlink 变量转实时波形小技巧 上篇讲了jlink RTT组件在RAM中开辟一段内存,将printf字符串存入然后通过jlink调试接口读取RAM,将printf字符串在jlink-RTT ...

  8. Linux下rgmii接口与fpga相连,FPGA控制RGMII接口PHY芯片88E1512网络通信

    一.前言 网络通信中的PHY芯片接口种类有很多,之前接触过GMII接口的PHY芯片RTL8211EG.但GMII接口数量较多,本文使用RGMII接口的88E1512搭建网络通信系统.这类接口总线位宽小 ...

  9. 千兆网络PHY芯片 RTL8211E的实践应用(原理图及PCB实现)

    一.完成基于RTL8211E的千兆以太网外围电路的PCB实现 1.PCB的板级分析 采用了八层PCB板的制作工艺,层级分布分别为 TOP->GND->SIG1->PWR->PE ...

最新文章

  1. C语言 —— 把字符指针中的字符串,存入字符数组中
  2. php foreach 修改数组,php如何使用foreach修改数组
  3. [译] 标准化的包布局(Standard Package Layout)
  4. mysql data transfer_MySQL主从同步加速 Transfer-- FAQ
  5. node.js——麻将算法(五)胡牌算法的一些优化处理方案(有赖子版)
  6. 【Kubernetes系列】Kubernetes组件介绍
  7. RHEL 6.5 静默安装 oracle 11.2.4
  8. Master Reactor Manager Worker TaskWorker(Task)
  9. 插入排序 java实现
  10. 2020 快手 被吊打面经
  11. UNIX再学习 -- RS485 串口编程
  12. mysq8窗口(开窗)及新特性函数
  13. Java之非对称加密
  14. C/S模式与P2P模式的对比
  15. 损失函数大全Cross Entropy Loss/Weighted Loss/Focal Loss/Dice Soft Loss/Soft IoU Loss
  16. mysql对结果再查询_SQL如何在查询结果里再次查询?
  17. 区块链技术及实际应用
  18. 淘宝引力魔方复制后怎么移除?有什么优势?
  19. bootstra查阅参考文档
  20. 大学生蓝桥杯比赛时间2020_注意!第十一届蓝桥杯大赛青少年创意编程组比赛开始报名啦!...

热门文章

  1. PAL制式和NTSC制式的定义及区别
  2. 按位与、按位或、按位异或
  3. 重塑CRM 销售易这样成为中国的Salesforce
  4. Excel中如何超链接到另一张表格的匹配数据
  5. Codeforces Round #807 (Div. 2) E. Mark and Professor Koro 二进制/线段树
  6. lighthouse_Laravel中的GraphQL做得正确:如何在一个简单的博客中设置Lighthouse
  7. 『对话』埃森哲互动Lamy:数字营销的变与不变
  8. JAVA中数据类型转换
  9. golang 初始化并赋值_声明和初始化
  10. 【python中break、continue 、pass终止循环的区别】