STM32F7xx+LAN8720+LWIP1.4.1调试坑点记录

更新时间:2023-06-20 08:52:42 阅读: 评论:0

STM32F7xx+LAN8720+LWIP1.4.1调试坑点记录
最近项⽬组要⽤STM32F765开发⼀个UDP通信的项⽬
PHY⽤的是LAN8720
免费背单词软件
协议栈LWIP1.4.1
HAL库版本为1.15.0
⽹⼝⽤的是HR911105A
英文关键字
电路图和这个博主⼀样
硬件问题
由于⼀些原因,刚刚打板⼦回来以后发现有短路的问题,修修补补,然后芯⽚有虚焊的问题,HAL库中⽹卡初始化反反复复过不了,通过重新补焊,热风枪吹芯⽚的⽅式,后来问题得到修复,这个芯⽚很难⼿焊,很⼩,引脚也露出的很少,底部有焊盘接地,这个接地接不好容易导致各种其奇奇怪怪的问题,需要特别注意,检查LAN8720有没有50MHz时钟输出,对应的25MHz晶振有没有稳定起振
19-9-10更新
LAN8720硬件检查点
去留学加拿大第14脚正常应该有很稳定的50MHz时钟输出
第6脚应该有稳定的1.2V左右的输出
25M外部晶振的频率是否稳定
英语培训机构排行焊盘稳定可靠的接地
软件问题
2019-9-10更新
这个芯⽚如果不插⽹线的情况下,如果MAC层开了⾃动协商功能
MAC层初始化过不了,可能要⼿动切换到不⽤⾃动协商的模式
我觉得有两种⽅法:
1. 初始化不通过以后,通过某种⽅式提⽰插⽹线
2. 初始化不过以后,关掉⾃动协商,再次初始化
PHY芯⽚能够过初始化了,UDP也能够发送了,然后接收⼀直都收不到UDP包
反反复复的查硬件,⽰波器抓波形,查LWIP配置,UDP发送接收处理,LWIP调试信息输出,弄了很多天
结果,发现⼀个很奇怪的问题,协议栈只收得到ARP和UDP⼴播包
于是乎,想到是不是数据包在MAC层被STM32过滤掉了
结果,我发现居然真的是这样的。
⽬前的HAL库(1.15.0)+CubeMX预留给⽤户配置⽹卡提供的参数太少了
就这些可以配置的,其他的更底层的(譬如MAC层相关参数)好像只能⾃⼰去熟悉固件库了
ETH_Handler.Instance = ETH;
ETH_Handler.Init.AutoNegotiation = ETH_AUTONEGOTIATION_DISABLE;                          //使能⾃协商模式
ETH_Handler.Init.Speed = ETH_SPEED_10M;                          //速度100M,如果开启了⾃协商模式,此配置就⽆效
ETH_Handler.Init.DuplexMode = ETH_MODE_FULLDUPLEX;                          //全双⼯模式,如果开启了⾃协商模式,此配置就⽆效
ETH_Handler.Init.PhyAddress = phy_addr;                          //LAN8720_PHY_ADDRESS;//LAN8720地址
ETH_Handler.Init.MACAddr = macaddress;            //MAC地址
ETH_Handler.Init.RxMode = ETH_RXINTERRUPT_MODE;  //中断接收模式
ETH_Handler.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE;  //硬件帧校验
ETH_Handler.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;  //RMII接⼝
if (HAL_ETH_Init(Ð_Handler) == HAL_OK)
{
res = 0;  //成功
}
el
{
res = 1;  //失败
}
固件库⾥ETH源⽂件,注意看这个函数,这个函数是静态的,如果是⽤CubeMX那种模式写的代码,初始化MAC层的时候这个函数会被调⽤,默认MAC层是有过滤功能的,但是我不想⽤这个过滤功能,它默认是开了过滤的。说明CubeMX还有需要改进的地⽅吧,MAC层⼀些设置应该给⽤户来配置吧,把这个⼀改我就可以正常收UDP数据包了,还是怀念以前标准库那种编程⽅式吧,看来想⽤CubeMX节约时间还是要谨慎
static void ETH_MACDMAConfig(ETH_HandleTypeDef *heth, uint32_t err)
{
ETH_MACInitTypeDef macinit;
ETH_DMAInitTypeDef dmainit;
uint32_t tmpreg = 0;
if (err != ETH_SUCCESS) /* Auto-negotiation failed */
{o ring
/* Set Ethernet duplex mode to Full-duplex */
(heth->Init).DuplexMode = ETH_MODE_FULLDUPLEX;
/* Set Ethernet speed to 100M */
(heth->Init).Speed = ETH_SPEED_100M;
}
onestepatatime/
* Ethernet MAC default initialization **************************************/
macinit.Watchdog = ETH_WATCHDOG_ENABLE;
avxmacinit.Jabber = ETH_JABBER_ENABLE;
macinit.InterFrameGap = ETH_INTERFRAMEGAP_96BIT;
圣诞快乐的英语怎么读macinit.CarrierSen = ETH_CARRIERSENCE_ENABLE;sabotage
macinit.ReceiveOwn = ETH_RECEIVEOWN_ENABLE;
macinit.LoopbackMode = ETH_LOOPBACKMODE_DISABLE;
if(heth->Init.ChecksumMode == ETH_CHECKSUM_BY_HARDWARE)
{
macinit.ChecksumOffload = ETH_CHECKSUMOFFLAOD_ENABLE;
}
el
{
macinit.ChecksumOffload = ETH_CHECKSUMOFFLAOD_DISABLE;
}
macinit.RetryTransmission = ETH_RETRYTRANSMISSION_DISABLE;
macinit.AutomaticPadCRCStrip = ETH_AUTOMATICPADCRCSTRIP_DISABLE;
macinit.BackOffLimit = ETH_BACKOFFLIMIT_10;
macinit.DeferralCheck = ETH_DEFFERRALCHECK_DISABLE;
macinit.ReceiveAll = ETH_RECEIVEALL_ENABLE;///需要把改成接收所有包!!
//以下省略
}
白雨这个⽚上MAC⽀持配的参数还是⽐较少的,MAC层的配置基本上只能⾃⼰去熟悉HAL库的套路了

本文发布于:2023-06-20 08:52:42,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/151306.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:问题   模式   配置   接收
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图