调试cube生成的f107+lan8720代码

news/2024/11/24 6:53:05/

之前用的w5500,无奈芯片越来越贵了,正好手头上有100来颗lan8720a,直接将方案改了吧。

以前在深圳工作时公司的网关正好用的这个方案,直接抄吧。

硬件设计网口无晶振,由mcu的mco脚输出,50Mhz模式,其他都是通用连接方式

接下来入正题:由于以前用的标准库,现在试一试hal库。打开cubemx,一顿骚操作后配置完成,生成代码。

第一个问题,调试口,官方默认如果不设置就关闭swd和jtag,造成无法2次下载程序,需要将system core->sys->debug改成对应模式,我用的serial wire,即swd。

接下来可以正常调试了,功能上仅仅使能了dhcp,但代码跑起来完全失败。

第二个问题,地址设置,需要将eth->parameter settings->general:ethernet configuration->phy address改成对应的值,我这边是0.

好了,再试,依然不行,接下来我用示波器看了一下mco脚,也确实有50mhz

第三个问题,代码都是采用的默认参数,有些参数偏小,修改的部分有默认任务栈空间调大,操作系统堆空间加大,当然这个可能和结果无关,过程得记录下来

还是不行,无奈将之前标准库代码拿来试一下,完全没问题。

对比代码,加入了几个打印信息,确定芯片id能否识别。由于cubemx并没有生成其id寄存器偏移地址,所以这里直接写死

    uint32_t id_0,id_1;HAL_ETH_ReadPHYRegister(&heth,2,&id_0);HAL_ETH_ReadPHYRegister(&heth,3,&id_1);printf("PHY_ID = %X\n", (id_0<<16) | (id_1)); 

其中寄存器地址2和3分别对应文档以下说明

 最后id读出来了,完全没问题。

于是第四个问题,又从lwip内部着手,但是我查了半天也没看到cubemx怎么将lwip的debug功能开启,只能开启全局的,各功能模块根本没有,于是找到lwipopts.h文件,添加以下内容

#define DHCP_DEBUG            0xf7
#define UDP_DEBUG            0xf7
#define NETIF_DEBUG            0xf7

这里千万别让第4位为1,即0x08,因为这个位是是否阻塞功能的,看下面代码段

好了,继续看结果吧,总的来说就是dhcp一直在广播,没收到回复而超时。

那就只能对比以前的代码了。最终发现

最后关键问题。生成的代码在自动协商速率完成后读取的是寄存器1的结果,然后我看网上有的说是31,我看手册上也确实有说31可以读到

这里我就断点调试查看了一下读出来的值,结果是0x04(00000100),即速度那儿是001 ,对应的是10m 半双工,这就不对了。

反过来我看之前的代码,读取的是地址1,确实也有速度指示

 于是,我就改成以前的方式再试,果不其然,成功了。

文件stm32f1xx_hal_eth.c

函数HAL_ETH_Init

在auto-negotiation完成后

    /* Read the result of the auto-negotiation */if ((HAL_ETH_ReadPHYRegister(heth, PHY_BSR, &phyreg)) != HAL_OK){/* In case of write timeout */err = ETH_ERROR;/* Config MAC and DMA */ETH_MACDMAConfig(heth, err);/* Set the ETH peripheral state to READY */heth->State = HAL_ETH_STATE_READY;/* Return HAL_ERROR */return HAL_ERROR;}//上面是原生成代码//HAL_ETH_ReadPHYRegister(&heth, PHY_BSR, &regvalue);if((phyreg & PHY_100M_T4) != (uint32_t)RESET){/* Set Ethernet duplex mode to FullDuplex following the autonegotiation */(heth->Init).DuplexMode = ETH_MODE_FULLDUPLEX;(heth->Init).Speed = ETH_SPEED_100M;}else if((phyreg & PHY_100M_Duplex) != (uint32_t)RESET){/* Set Ethernet duplex mode to FullDuplex following the autonegotiation */(heth->Init).DuplexMode = ETH_MODE_FULLDUPLEX;(heth->Init).Speed = ETH_SPEED_100M;}else if((phyreg & PHY_100M_Half) != (uint32_t)RESET){/* Set Ethernet duplex mode to FullDuplex following the autonegotiation */(heth->Init).DuplexMode = ETH_MODE_HALFDUPLEX;(heth->Init).Speed = ETH_SPEED_100M;}else if((phyreg & PHY_10M_Duplex) != (uint32_t)RESET){/* Set Ethernet duplex mode to FullDuplex following the autonegotiation */(heth->Init).DuplexMode = ETH_MODE_FULLDUPLEX;(heth->Init).Speed = ETH_SPEED_10M;}else if((phyreg & PHY_10M_Half) != (uint32_t)RESET){/* Set Ethernet duplex mode to FullDuplex following the autonegotiation */(heth->Init).DuplexMode = ETH_MODE_HALFDUPLEX;(heth->Init).Speed = ETH_SPEED_10M;}#if 0        //原生成代码/* Configure the MAC with the Duplex Mode fixed by the auto-negotiation process */if ((phyreg & PHY_DUPLEX_STATUS) != (uint32_t)RESET){/* Set Ethernet duplex mode to Full-duplex following the auto-negotiation */(heth->Init).DuplexMode = ETH_MODE_FULLDUPLEX;}else{/* Set Ethernet duplex mode to Half-duplex following the auto-negotiation */(heth->Init).DuplexMode = ETH_MODE_HALFDUPLEX;}/* Configure the MAC with the speed fixed by the auto-negotiation process */if ((phyreg & PHY_SPEED_STATUS) == PHY_SPEED_STATUS){/* Set Ethernet speed to 10M following the auto-negotiation */(heth->Init).Speed = ETH_SPEED_10M;}else{/* Set Ethernet speed to 100M following the auto-negotiation */(heth->Init).Speed = ETH_SPEED_100M;}#endif

其中几个宏定义如下

#define PHY_100M_Duplex            (0x4000)
#define PHY_100M_Half            (0x2000)
#define PHY_10M_Duplex            (0x1000)
#define PHY_10M_Half            (0x0800)
#define PHY_100M_T4                (0x8000)

另外修改的地方不止这一个,还有一个地方在连接状态更新那儿,这个我就不细说了

回过头来思考,其实寄存器31也可以,但为啥就是不对呢,值得注意的是这个是special修饰了的,难到是要进入某个模式吗,这个我现在反正没搞懂

另外可以考虑修改以下定义,以免动原生库文件

根据代码分析应该不难,这里也不再研究 


http://www.ppmy.cn/news/145573.html

相关文章

GD32F450以太网(2-1):PHY芯片LAN8720A介绍

PHY芯片LAN8720A 文章目录 PHY芯片LAN8720A1. MCU网口输出设计现状2. LAN8720A2.1 LAN8720A简介2.2 LAN8720A使用连接简图2.3 LAN8720A内部图2.4 LAN8720A和MCU连接图 3. LAN8720A内部寄存器[^1]3.1 BCR寄存器3.2 BSR寄存器3.3 PHY特殊功能寄存器 声明 1. MCU网口输出设计现状 …

【uboot】imx6ull uboot移植LAN8720A网卡驱动

文章目录 相关文章1. 前言2. IMX6ULL Ethernet LAN8720A硬件连接3. 支持LAN8720A修改步骤4. 验证测试问题1&#xff1a;如何确定LAN8720A网卡PHYAD地址&#xff1f;问题2&#xff1a;如何确定device tree中对reset gpio的定义&#xff1f;问题3&#xff1a;LAN8720A网卡nINTSEL…

【Ethernet】以太网卡LAN8720A分析和使用

文章目录 1. LAN8720A简介2. PHYAD[0]: PHY地址配置3. MODE[2:0]: Mode配置4. nINTSEL: nINT/REFCLKO配置5. REGOFF: 配置内部1.2V电压源6.SMI&#xff08;MDC/MDIO&#xff09;总线接口介绍6.1 MDIO接口6.2 MDIO数据传输协议 7. 相关寄存器描述8. 参考资料 1. LAN8720A简介 L…

LAN8720A不能正常通讯的问题

笔记 公司有块MCU板(STM32407VGT6 LAN8720A/AI), 板子是好的, 以前一直在用, 固件工程也是归档的, 软件也是正常的. 公司同事去年焊接了20个MCU板, 出货了3块板子, 剩下的板子就丢在那. 这几天, 要用这个板子, 找到上次焊接的MCU板子, 插到到主板上, 程序烧录进入后, 网线插…

RTL8720DN SDK 环境搭建

一、硬件准备 这里可以选择安信可的BW16模块和开发板 资料&#xff1a;https://docs.ai-thinker.com/rtl87xx 注意一下&#xff0c;我这里用的是旧板&#xff0c;这里的串口&#xff0c;接的是另外的IO&#xff0c;不是下载口&#xff0c;重新开发固件&#xff0c;需要外接一下…

STM32F407 + LAN8720A + LWIP 实现TCP服务器

STM32F407 LAN8720A LWIP 实现TCP客户端 环境说明&#xff1a; 开发板&#xff1a;某宝买的&#xff0c;STM32F407IGSTM32CUBEMX5.6HAL Lib Version 1.25 &#xff08;一&#xff09;配置时钟 &#xff08;二&#xff09;配置调试串口 &#xff08;三&#xff09;配置以太网…

STM32H7+LAN8720A之ETH与LWIP配置问题(End)

开篇介绍 由于项目中需要使用到STM32H7系列的芯片&#xff0c;且该系列无法移植ST的标准库&#xff0c;只能使用ST的HAL库&#xff0c;通过STM32Cube生成HAL库的基本代码。在项目开发中需要使用到STM32板载的ETH口&#xff0c;在简化的四层模型中充当着数据链路层的角色&#…

【上电即上华为云】华为云openCPU智联模组_wifi_8720_MQTT

原贴地址&#xff1a;https://bbs.huaweicloud.com/blogs/233458 【摘要】 华为云openCPU智联模组_wifi_8720_MQTT&#xff1a;上电即上华为云 华为云openCPU智联模组_wifi_8720_MQTT&#xff1a;上电即上华为云 一、wifi 8720基础SDK、patch 基础SDK 9351_00018082-sdk-ameb…