之前搞了max3232通讯,并在实际测试中稳定使用,故准备将板子升级下进入互联网时代
环境:stm32cubeIDE+自己做的板子+LAN4720A+lwip1.4.1+野火的例程(标准外设库)
因为用的IDE是stm32cubeIDE ,野火的标准外设库版本是 keil MDK,所以,stmf429_eth 文件中首先要改下伪代码的对齐如下:
//__align(4) ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB];/* Ethernet Rx MA Descriptor *///__align(4) ETH_DMADESCTypeDef DMATxDscrTab[ETH_TXBUFNB];/* Ethernet Tx DMA Descriptor *///__align(4) uint8_t Rx_Buff[ETH_RXBUFNB][ETH_RX_BUF_SIZE]; /* Ethernet Receive Buffer *///__align(4) uint8_t Tx_Buff[ETH_TXBUFNB][ETH_TX_BUF_SIZE]; /* Ethernet Transmit Buffer */__attribute__((aligned(4))) ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB];/* Ethernet Rx MA Descriptor */__attribute__((aligned(4))) ETH_DMADESCTypeDef DMATxDscrTab[ETH_TXBUFNB];/* Ethernet Tx DMA Descriptor */__attribute__((aligned(4))) uint8_t Rx_Buff[ETH_RXBUFNB][ETH_RX_BUF_SIZE];/* Ethernet Receive Buffer */__attribute__((aligned(4))) uint8_t Tx_Buff[ETH_TXBUFNB][ETH_TX_BUF_SIZE]; /* Ethernet Transmit Buffer */
然后改了一些代码及结构更符合自己使用的代码风格。
接着就是编译下载进板子,调试了,上来的第一个问题:在MAC DMA配置中,软复位直接卡死在了while循环这。
/* Software reset */ETH_SoftwareReset();/* Wait for software reset */while (ETH_GetSoftwareResetStatus() == SET);
接着翻stm32f4xx的编程手册,查看对应寄存器说明,但是里面只提了一句,由硬件自动复位完成后自动置位。
这就莫名奇妙了,这只跟主控MCU有关?然后就是百度一下了,网上这问题很多,一搜到处都是,在以下的两个链接中,得到了问题的解决,和对LAN8720A芯片的更加深入了解,主要第二个链接的下方,下载到了LAN8720A的 datasheet
/huanjun-p-11928051.html
/yangxuli/p/7738431.html
所以万用表,示波器一出,一量,LAN4720A芯片居然都没有正常工作,就是硬件画错了,在自己的板子上找出了不少细节错误,飞线修正了一下,基本问题直接解决。
过掉此处之后,进入了LWIP 初始化,直接一顺到底,返回成功,但是网口灯不亮,而且ping 毫无反应。然后决定先读一下LAN8720A 的ID ,并且准备单步跟一下,毕竟经过上面的情况,怕可能是自己的PCB绘制的时候存在EMC问题。
一读,才发现初始化流程中的SMI通讯返回都是0xFFFF,关键初始化的流程中也只是对应标志位的判断,所以忽略了0xFFFF这个情况,然后修改下逻辑判断流程,同时也感觉事情大条了呀,这SMI通讯都没能初始化成功呢?还是因为板子的EMC问题呢?或是其他原因呢?
然后重新对比了下GPIO管脚的初始化代码,感觉大概率和初始化和代码没啥关系。
然后在百度下找到一篇文章解了下SMI站管理通讯:
MDC:周期性时钟,提供以最大频率2.5 MHz传输数据时的参考时序。MDC的最短高电平时间和最短低电平时间必须均为160 ns。MDC的最小周期必须为400 ns。在空闲状态下,SMI管理接口将MDC时钟信号驱动为低电平。
这样算下来,通讯的频率也不算很高,感觉大概率也可以排除EMC的问题,然后又是一通百度,也有此类情况的,不过看到了LAN4720A的焊接导致的问题挺多着,毕竟自己买的也是QFN-24封装的,想着死马当活马医,重新吹了一下,没想到还真可以了!!!
成功读取了ID,ETH_Init单步进入里面的对应读写寄存器操作也都有了不同的值和响应!
一切顺利之后,插入网线,初始化OK,网口灯也亮了起来,但是一ping还是没有反应,这就奇怪了,仔细看板子网口指示灯是常亮啊!!这也是有问题吧?
自己是通过路由局域网测试的,登入路由查看,也没看到有对应的设备,
这里华为的路由器有个坑,后来成功了,在【终端】有线连接设备里面也没有设备显示。
在自动协商成功后,可以在路由里面查看到对应的LAN口的速率。
起初笔者根本不知道路由的这个坑呀,而且路由后面对应的LAN连对应的指示灯都没有呀!!
所以就想着索性和PC的网口直连测试吧,毕竟这还有个网口指示灯可以判断,直连测试之后就更无语了,都识别不到板子,PC端网口指示灯都不亮,网络适配器直接是个红色的叉。
莫名其妙又纠结呀,不经又想到了EMC问题,索性就把自动协商改成了固定10Mbps速率,这样EMC总归影响就少了吧,但是还是没用,而且发现自动协商出来的都是半双工的,固定也改成半双工,但是还是没效果。
网上也看到有说复位的,故直接手动对nRST引脚复位激活,不过出现了更诡异的现象,LAN4720正常工作,引脚复位,未软复位之后,网口两个灯直接不亮了,不插入网线有时两个都亮,而且不管有没有插入网线读取到的状态始终是link_up状态,难道还是焊接的问题?因为上面的情况,重新吹的时候补了锡膏进去,会不会是底部GND的锡太多,导致有引脚虚焊?
毕竟这个芯片的封装,已经有点讲究焊接技术了!!!
所以又重新吹了一遍,因为LAN4720A底部GND焊盘上正好有VIA 所以有多余的锡溢出了,然后看着似乎正常多了。
重新测试了一下,PC能识别了,网口灯也是在闪烁了,简直有点不敢相信呀!
真的是焊接导致的这种乱七八糟的问题。不过还是ping不通呀,这就郁闷了,来回折腾吹了三遍了。而且板子的橙灯就缓慢的闪了两下,然后发现在NRST 引脚复位 还有 ETH_Init初始化芯片的时候自己板子上的黄\绿两个灯会同时灭掉2次,难道是复位问题?
然后尝试下两个断点在复位和ETHinit处,整个又是单步走了一遍也没看出点什么,习惯性的ping 了一下居然ping通了??
WTFK?直接重新上电,ping 一下还是没ping同这就奇怪了呀?然后在看了下datasheet ,
nRST 引脚复位要满足最小时间,软复位完成要500ms内,想着就是试下吧,因为在软复位之后就是ETH_init初始化芯片了,所以加个延时进去吧?
ETH_DeInit();ETH_SoftwareReset();_eth_delay_(50);while (ETH_GetSoftwareResetStatus() == SET);_eth_delay_(LAN8742A_RESET_DELAY);
然后下载,测试,居然真的过了!!不用断点也可以了!
有了成功ping通之后,板子加入TCPServer,然后顺利通过测试。
静态IP成功测试完成之后,就是DHCP了,来一击:死亡之ping测试一下,也顺利测试通过。
然后热插拔试了一下,也是可以,不过应为是无操作系统的裸机,包响应都是在主循环中进行,所以每一次包处理都需要4、5 ms时间,而且主控也有点发热现象。
虽然功能测试都成功了,不过很不稳定,
在线一个小时之后居然会掉线?直接又ping不通了。目前就到这,毕竟本身就是测试板,电路上也是去掉了一些bead从简处理。可能也是不稳定的原因吧。待后续挖掘吧!
如果觉得《stm32f429+LAN4720A+lwip 问题记录及解决》对你有帮助,请点赞、收藏,并留下你的观点哦!