STM32 F7xx + LAN8720+LWIP1.4.1调试坑点记录

最近项目组要用STM32F765开发一个UDP通信的项目

PHY用的是LAN8720

协议栈LWIP1.4.1

HAL库版本为1.15.0

网口用的是HR911105A

电路图和这个博主一样STM32F407VGT6+LAN8720 调试笔记

 

硬件问题

由于一些原因,刚刚打板子回来以后发现有短路的问题,修修补补,然后芯片有虚焊的问题,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(&ETH_Handler) == HAL_OK)
        {
            res = 0;   //成功
        }
        else
        {
            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 */
  {
    /* Set Ethernet duplex mode to Full-duplex */
    (heth->Init).DuplexMode = ETH_MODE_FULLDUPLEX;
    
    /* Set Ethernet speed to 100M */
    (heth->Init).Speed = ETH_SPEED_100M;
  }
  
  /* Ethernet MAC default initialization **************************************/
  macinit.Watchdog = ETH_WATCHDOG_ENABLE;
  macinit.Jabber = ETH_JABBER_ENABLE;
  macinit.InterFrameGap = ETH_INTERFRAMEGAP_96BIT;
  macinit.CarrierSense = ETH_CARRIERSENCE_ENABLE;
  macinit.ReceiveOwn = ETH_RECEIVEOWN_ENABLE;
  macinit.LoopbackMode = ETH_LOOPBACKMODE_DISABLE;
  if(heth->Init.ChecksumMode == ETH_CHECKSUM_BY_HARDWARE)
  {
    macinit.ChecksumOffload = ETH_CHECKSUMOFFLAOD_ENABLE;
  }
  else
  {
    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库的套路了

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用STM32CubeMX、LAN8720LwIP和FreeRTOS实现网络通信,需要注意以下几点。 首先,STM32CubeMX是一个图形化配置工具,用于为STM32微控制器生成初始化的代码框架。我们可以通过选择所需的外设(如以太网控制器)和配置参数来生成代码。 其次,LAN8720是一个用于实现以太网通信的PHY(物理层)芯片,负责将数据从媒介访问控制层(MAC层)转换为物理传输信号。 接下来,LwIP(Lightweight IP)是一个轻量级的网络协议栈,用于实现TCP/IP协议。我们需要将LwIP集成到项目中,并配置好网络参数,如IP地址、子网掩码和网关。 最后,FreeRTOS是一个流行的实时操作系统,用于管理任务调度和资源管理。我们可以将网络通信任务添加到FreeRTOS的任务列表中,并通过队列和信号量等机制进行任务间通信和同步。 总体实现步骤如下: 1. 使用STM32CubeMX选择并配置以太网控制器和PHY,并生成初始化代码。 2. 配置LwIP的网络参数,如IP地址、子网掩码和网关。 3. 将LwIP集成到项目中,包括源代码和相应的头文件。 4. 添加网络通信任务到FreeRTOS的任务列表中。 5. 在网络任务中,使用LwIP提供的API进行网络初始化、连接设置以及数据收发等操作。 6. 通过使用队列或信号量等机制,实现不同任务间的数据共享和同步。 7. 在主函数中初始化FreeRTOS,并启动任务调度器。 通过以上步骤,我们可以利用STM32CubeMX、LAN8720LwIP和FreeRTOS实现网络通信功能。这样我们就可以在STM32微控制器上实现网络连接、数据传输等网络应用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值