硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1446|回复: 13
收起左侧

[以太网] 奇怪问题-STM32H743网卡初始化错误

[复制链接]

1

主题

11

回帖

14

积分

新手上路

积分
14
发表于 2023-1-5 17:01:02 | 显示全部楼层 |阅读模式
本帖最后由 qq302011 于 2023-1-5 17:22 编辑

我在使用STM32H743VGT6的时候,使用stm32cubemx生成网络的工程;调试时候直接死在了ethernetif.c文件中的static void low_level_init(struct netif *netif)函数------>Error_Handler();
[C] 纯文本查看 复制代码
  if (hal_eth_init_status == HAL_OK)
  {
  /* Get link state */
  ethernet_link_check_state(netif);
  }
  else
  {
    Error_Handler();
  }


通过查找发现调用hal_eth_init_status = HAL_ETH_Init(&heth);这条语句的时候,返回错误;
于是进一步进入到HAL_ETH_Init函数中调试; 发现死在了这里
[C] 纯文本查看 复制代码
  /* Wait for software reset */
  while (READ_BIT(heth->Instance->DMAMR, ETH_DMAMR_SWR) > 0U)
  {
    if (((HAL_GetTick() - tickstart) > ETH_SWRESET_TIMEOUT))
    {
      /* Set Error Code */
      heth->ErrorCode = HAL_ETH_ERROR_TIMEOUT;
      /* Set State as Error */
      heth->gState = HAL_ETH_STATE_ERROR;
      /* Return Error */
      return HAL_ERROR;
    }
  }

在这个地方发生了 return HAL_ERROR;
请问这种情况如何处理哈?

我测试目前是可以读PHY芯片里面的寄存器的。这个在LAN8742_Init有所体现,我读地址为2的寄存器为0x001c,我是用的phy芯片是rtl8201f,通过查看芯片资料,该地址的值正好是0x001c,硬汉哥能否指导下哈? 这个软复位是复位的什么地方? 请问我该如何查找问题哈?


回复

使用道具 举报

2

主题

17

回帖

23

积分

新手上路

积分
23
发表于 2023-1-5 20:41:55 | 显示全部楼层
看起来是写了DMA复位寄存器然后等待DMA软复位,一直没复位成功。我之前在RK3568上遇到过类似问题,原因是RGMII的时钟源设置不正确,RK3568的RGMII时钟源可以来自芯片内部或者是PHY芯片。H7应该也是类似,示波器看看H7的ETH_REF_CLK引脚上有没有50M时钟,这个引脚正常应该接到PHY芯片的时钟输出引脚,如果没有尝试找找RMII的时钟能否切换到内部时钟源,或者通过MCO功能输出一个50M时钟给ETH_REF_CLK
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2023-1-6 00:25:53 | 显示全部楼层
8742和8740基本是一样的
1、一个是楼上坛友说的问题。
2、然后就是关键的硬件复位和软件复位问题,非常重要,可以这样测试
(1)上电后,等待1-2s再访问试试是否正常,如果不正常,进一步排查PHY复位
(2)如果你是专门的硬件引脚控制的复位,你可以设置复位后,等待1-2s再读ID,然后进一步后续操作。如果你的硬件复位和H743用的一个复位,你可以上电后等待1-2s发软件复位命令,再访问试试。
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2023-1-6 10:06:15 | 显示全部楼层
eric2013 发表于 2023-1-6 00:25
8742和8740基本是一样的
1、一个是楼上坛友说的问题。
2、然后就是关键的硬件复位和软件复位问题,非常重 ...

我这个硬件读ID是没有问题的哈,能够正确的读phy芯片里面的寄存器值;但是好像在初始化MCU内部的以太网模块的时候有问题,在这个cubemx产生的代码里面,是先初始化mcu的以太网模块,后初始化phy芯片 rtl8201f,因此错误现象是 :读phy芯片ID正确,但是HAL_ETH_Init初始化失败;
回复

使用道具 举报

2

主题

63

回帖

69

积分

初级会员

积分
69
发表于 2023-1-6 10:19:17 | 显示全部楼层
zone 发表于 2023-1-5 20:41
看起来是写了DMA复位寄存器然后等待DMA软复位,一直没复位成功。我之前在RK3568上遇到过类似问题,原因是R ...

我上次也是卡在软复位的位置,也是50Mhz的时钟有问题,有了时钟就复位成功了
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2023-1-6 10:38:43 | 显示全部楼层
heluo1985 发表于 2023-1-6 10:19
我上次也是卡在软复位的位置,也是50Mhz的时钟有问题,有了时钟就复位成功了

我测试了下eth_ref_clk确实没有时钟,老兄您这边是怎么产生的clk时钟哈?
回复

使用道具 举报

2

主题

63

回帖

69

积分

初级会员

积分
69
发表于 2023-1-6 11:33:00 | 显示全部楼层
qq302011 发表于 2023-1-6 10:38
我测试了下eth_ref_clk确实没有时钟,老兄您这边是怎么产生的clk时钟哈?

我用的LAN8720,LAN8720外接25M有源晶振,进入PHY之后,产生50M时钟给到eth_ref_clk
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2023-1-6 14:54:27 | 显示全部楼层
heluo1985 发表于 2023-1-6 11:33
我用的LAN8720,LAN8720外接25M有源晶振,进入PHY之后,产生50M时钟给到eth_ref_clk

谢谢这个问题解决了,我的配置电阻上拉导致没有输出时钟,时钟加上后,初始化成功了,现在又出现了ping的时候出现了:无法访问目标主机,请问这种情况该怎么判断是啥问题哈?
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2023-1-6 14:56:14 | 显示全部楼层
eric2013 发表于 2023-1-6 00:25
8742和8740基本是一样的
1、一个是楼上坛友说的问题。
2、然后就是关键的硬件复位和软件复位问题,非常重 ...

通过修改配置电阻之后,REF_CLK正确,可以初始化成功了,现在又出现了ping的时候出现了:无法访问目标主机,请问这种情况该怎么判断是啥问题哈?
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2023-1-6 14:57:04 | 显示全部楼层
zone 发表于 2023-1-5 20:41
看起来是写了DMA复位寄存器然后等待DMA软复位,一直没复位成功。我之前在RK3568上遇到过类似问题,原因是R ...

大佬能否再指导指导哈? 下一步能否给个大方向?
通过修改配置电阻之后,REF_CLK正确,可以初始化成功了,现在又出现了ping的时候出现了:无法访问目标主机,请问这种情况该怎么判断是啥问题哈?
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2023-1-6 15:25:06 | 显示全部楼层
eric2013 发表于 2023-1-6 00:25
8742和8740基本是一样的
1、一个是楼上坛友说的问题。
2、然后就是关键的硬件复位和软件复位问题,非常重 ...

我又做了一些测试,大佬请指导下哈,如下图,我在RTL8201F_GetLinkState函数中,我通过读BSR寄存器,此时的数值是0X7869,,再继续读,编程了0X786D,也就是第三位发生了变化,对应第二位是1,连接状态说明是有效的,1: Valid link established

BSR寄存器说明图

BSR寄存器说明图

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2023-1-7 00:29:55 | 显示全部楼层
qq302011 发表于 2023-1-6 14:57
大佬能否再指导指导哈? 下一步能否给个大方向?
通过修改配置电阻之后,REF_CLK正确,可以初始化成功了 ...

是用的H7系列吧,用的H7系列注意MPU/Cache问题就行了。

Cache配置有问题容易导致ping不通。这个你下载STM32CubeH7软件包后,里面自带了一批LWIP的例子,可以对比。
回复

使用道具 举报

2

主题

17

回帖

23

积分

新手上路

积分
23
发表于 2023-1-7 12:06:17 | 显示全部楼层
qq302011 发表于 2023-1-6 14:57
大佬能否再指导指导哈? 下一步能否给个大方向?
通过修改配置电阻之后,REF_CLK正确,可以初始化成功了 ...

多半是cache的问题。关了Dcache再ping。再不行用wireshark抓包看看有没有回复的内容,或者在接收发送时打印一下看看正不正确。
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2023-1-9 13:32:13 | 显示全部楼层
zone 发表于 2023-1-7 12:06
多半是cache的问题。关了Dcache再ping。再不行用wireshark抓包看看有没有回复的内容,或者在接收发送时打 ...

汇报一下,目前可以ping了,直接使用例程,修改了一下对应配置,通过cube为啥不对也没搞明白,先这样了,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 15:11 , Processed in 0.284920 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表