IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> stm32f429+LAN4720A+lwip 问题记录及解决 -> 正文阅读

[嵌入式]stm32f429+LAN4720A+lwip 问题记录及解决

之前搞了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

http://t.zoukankan.com/huanjun-p-11928051.html
https://www.cnblogs.com/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从简处理。可能也是不稳定的原因吧。待后续挖掘吧!

?

?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:39:38  更:2022-07-17 16:43:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:41:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码