STM32F407 + LAN8720A + lwIP + FreeRTOS = 未收到以太网帧

电器工程 stm32 自由人 局域网8720 微信
2022-01-27 16:52:14

我正在尝试使用 STM32F407 和 LAN8720A 以太网 PHY 的 PCB,但我似乎无法接收任何以太网帧——即使我在传输帧时没有问题。

硬件设置

以太网 PHY 示意图 我在 STM32F4 上有一个 25 MHz 晶振,将 25 MHz 时钟输出引脚驱动到处于 REF_CLK_OUT 模式的 LAN8720A 中,并将 50 MHz 时钟驱动回 STM32F4 作为 RMII 接口的一部分。

千斤顶/磁性元件是通用部件。这是数据表: 在此处输入图像描述

软件

我正在使用最新更新的 STM32CubeMX 为包含 FreeRTOS、lwIP 以及 ETH 外设驱动程序的 STM32 项目生成系统工作台。我还没有真正接触过任何生成的代码——所以 lwIP 堆栈在 FreeRTOS 堆栈中被初始化。

实验

将我的开发板的 lwIP 配置为 10.0.0.2 静态 IP,并将我计算机上的 USB 转以太网加密狗配置为 10.0.0.1 静态 IP,我使用以太网电缆直接连接这两个设备,我的开发板尝试连接到计算机端口 80 上的服务。我使用 Wireshark(在计算机上运行,​​并绑定到 USB 转以太网转换器)捕获我的开发板和计算机之间的交互。

由于没有接收到帧的问题,我们永远无法解决这个 ARP 问题: Wireshark 捕获 如您所见,Stmicroe(我的主板)可以发送 ARP 数据包——我的计算机可以听到——但它似乎从来没有听到我计算机的响应,因为它不断地发出 ARP 数据包。

两台设备都配置了 255.255.255.0 掩码,并且都配置了网关地址 10.0.0.1(计算机)。我听说 ARP 表被搞砸了,计算机忽略了 ARP 数据包,但我无法想象主板会忽略我的计算机专门发送给它的 ARP 数据包——以响应主板最初提出的请求。

因此,我深入研究 lwIP 的 ethernetif.c 文件并注意到它HAL_ETH_GetReceivedFrame_IT(&heth)返回了一个错误。该函数返回一个错误,因为(heth->RxDesc->Status & ETH_DMARXDESC_OWN)== 0,而不是 1。我解释这意味着 DMA 缓冲区当前已为 MAC 外围设备准备好,并且尚未收到任何内容。

此外,我已经验证 HAL_ETH_IRQHandler 永远不会被调用。

PHY有问题吗?

在这一点上,我怀疑我的 PHY 本身是罪魁祸首。

为了进一步调查,我将 Saleae Logic Pro 16 连接到所有相关信号,并注意到 TX0/TX1 以及 RX0/RX1 线路上都有大量流量。这是使用 25 MHz 输入时钟捕获的一些 RX 流量:

捕获收到的数据包

RX_ERR 一直很低,除非我尝试捕获 50 MHz 时钟输出(这对于像 Saleae 这样的设备来说显然具有挑战性):在这种情况下,RX_ERR 偶尔会在几个数据包中高亮(这实际上是一个好兆头) — 引脚似乎正在运行)。

下一步

我已经尝试通过在任务中调用HAL_NVIC_EnableIRQ(ETH_IRQn);after来手动启用 ETH 中断,但这似乎并不能解决问题。我不完全确定以太网中断程序是否应该被调用——这是提出一个全新设计的挑战;我正在努力确定系统的正确行为,因此我可以确定我的设置有何不同。tcpip_init()MX_LWIP_Init()

虽然我之前使用过 STM32/STM32CubeMX/FreeRTOS 的东西,但我从未使用过 STM32 的以太网外设,而且我对这些东西的唯一经验是在定制的嵌入式 Linux 系统上,它似乎总是开箱即用。这对我来说是新的领域!

我确定某处有一个愚蠢的复选框或Ethernet_EnableReceive()我忘记调用的神奇功能,但我真的找不到任何建议需要明确启用这些东西的文档,而且我在互联网上看到的帖子都是由于无关问题。

如果有人有任何想法,我很乐意提供帮助!

附录:摆脱 FreeRTOS

只是为了消除一些东西,我删除了 FreeRTOS 项目组件,回到了裸机项目。在我的主循环中,我调用MX_LWIP_Process(). 这种方法应该消除中断的需要,但它不能解决问题;我仍然无法接收帧。这让我觉得 STM32CubeMX 生成的 ETH HAL 代码中有些东西。

解决方案

以防万一有人在未来偶然发现这个问题,问题原来是翻转的 RXD0 和 RXD1 引脚。这就是为什么我能够在我的逻辑分析仪上看到流量,但它没有被我的 MCU 解码。

正如有人指出的那样,我使用的磁性是不对称的,不应该用于 auto-MDI-X。我没有任何问题。我预计会发生以下两种情况之一: - 磁性元件实际上不会在另一个方向上工作,但是因为我所拥有的一切都使用自动 MDI-X,所以我的电路板基本上保持在正常工作的配置中,而另一个设备在电缆定向其信号以匹配。- 考虑到以太网运行时间较短,磁性元件可提供合适的信号完整性,但长期分析会显示更高的丢包率或较长时间运行的问题。

老实说,我不清楚为什么在 1:1 变压器的哪一侧安装线路滤波器很重要,所以在 PoE 应用之外,我不确定为什么对称与非对称设计很重要。

2个回答

很抱歉复活这个话题。我不能不提我的经历。

我在我的一个项目中使用了这个 HR911105A(带磁铁的 RJ45)。

HR911105A: 在此处输入图像描述 乍一看,我注意到了一件事,那就是 LAN8720 和 RJ45 之间的连接,根据您的原理图。

因为我看到连接看起来是交叉的。尽管连接的系统大多使用 MDI-X 并因此检测接收/发送对,但最好给它一个不那么混乱的连接,如下所示:

LAN -> RJ45
=====================
TXP -> TD+ (Pin #1)
TXN -> TD- (Pin #2)
RXP -> RD+ (Pin #3)
RXN -> RD- (Pin #6)

Pin #4 and Pin #5(所以 49.9R 上拉电阻)如果连接到3V3_AN您的原理图中会很好,而另一侧应通过电容器(0.1uF 或 0.022uF)耦合到 GND。

您在 PC 上安装了wireshark,并且正如您所说,您使用的是 USB-to-LAN 适配器。我不确定 Wireshark 在您的设置中的哪个物理点捕获数据包,因此出站数据包是否真的出现在物理网络上是一个很好的问题。我建议您将另一台带有网络接口的 PC 连接起来,看看这些 PC 是否可以相互通信,比较它们上 Wiresharks 的输出。

您的 wireshark 输出没有显示任何问题,PC 三次宣布它在本地网络上并且 IP 地址为 10.0.0.1(如果它会收到对这 3 个 ARP 请求中的任何一个的回复,那么操作系统会弹出 IP 地址冲突)。

然后,您的董事会不断询问谁拥有 10.0.0.1?告诉 10.0.0.2和 PC 回复10.0.0.1 在 ...问题是为什么它会在循环中发生:

  1. 板子物理上没有收到PC发来的响应包;
  2. board 期待别的东西,或者收到的数据包已损坏,它会丢弃数据包。

因此,作为下一个故障排除步骤,请使用另一台具有“正常”以太网接口的 PC,在其上安装 Wireshark,以与板相同的方式配置其网络,并尝试telnet 10.0.0.1 80查看两台机器上的 Wiresharks 中弹出的信息。这样您就可以确保带有 USB 转以太网适配器的 PC 正常工作。

您的下一步将取决于您在这些 Wiresharks 中看到的内容。

更新:

我正在接收数据包,否则 RXD0/D1 引脚不会显示任何活动,对吗?

不正确。你想认为你的董事会收到了数据包。您会看到 PHY 输入信号的电平发生了一些变化,但它们不一定代表有效的数据包。RX_ERR 不切换的事实并不能立即让我相信 PHY 在传入事件上正常工作,或者到达的信息构成了正确的数据包。

无论如何,这取决于你,我的故障排除理论很简单——你必须在更高的层次上确保你在哪里遇到问题,然后深入研究设计的各个部分。深入研究所有部分并怀疑一切都是无用的。如果您发现分散焦点的问题会很幸运;您已经在尝试简化软件,如果不成功,您很可能会开始更换芯片。

我认为我的故障排除步骤并不复杂,无法确保另一台 PC 可以通过加密狗与 PC 通信并证明我的错误或正确,从而确保您正确地深入挖掘怀疑板的 PHY、MAC 和软件正在运行他们。