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


9

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

硬件设定

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

插孔/磁铁是通用部分。这是数据表: 在此处输入图片说明

软件

我正在使用最新的STM32CubeMX为STM32项目生成系统工作台,其中包含FreeRTOS,lwIP和ETH外围设备驱动程序。我还没有真正接触过任何生成的代码,因此lwIP堆栈在FreeRTOS堆栈内进行了初始化。

实验

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

由于没有收到帧的问题,我们永远也不会Wireshark捕获 错过ARP的东西: 如您所见,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流量的捕获:

捕获收到的数据包

除非我试图捕获50 MHz的时钟输出,否则RX_ERR始终处于低电平状态(这对Saleae这样的设备来说显然是具有挑战性的):在这种情况下,RX_ERR偶尔会被高电平地擦除几个数据包(这实际上是一个好兆头) —插针似乎在起作用)。

下一步

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

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

我确定某个地方有一个愚蠢的复选框或Ethernet_EnableReceive()我忘记调用的神奇函数,但是我真的找不到任何建议显式启用该功能的文档,而我在互联网上看到的帖子都是由于不相关问题。

如果有人有任何想法,我希望获得帮助!

附录:摆脱FreeRTOS

为了消除问题,我删除了FreeRTOS项目组件,回到了裸机项目。在主循环中,我致电MX_LWIP_Process()。这种方法应该消除对中断的需求,但是不能解决问题。我仍然无法接收帧。这使我认为STM32CubeMX生成的ETH HAL代码中有某些内容。

以防万一将来有人偶然发现这个问题,该问题原来是由RXD0和RXD1引脚引起的。这就是为什么我可以在逻辑分析仪上看到流量的原因,但是我的MCU没有对它进行解码。

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

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


Wireshark安装在哪里?
匿名

开发板尝试连接的计算机。我将编辑问题以使其更加清楚。
杰·卡尔森

FWIW,我建议使用FreeRTOS堆栈。(我知道这不会对您的特定查询有所帮助。)直到今天晚上我什么也不能做,但是如果有帮助,我很确定我有一个针对该处理器的项目,可以将FreeRTOS堆栈进行ping操作。我不知道我启动并运行了板上的哪个PHY。无论如何,让我知道您是否需要该项目,我可以将其放在FreeRTOS交互式站点上。
DiBosco

那会很有帮助。我完全不了解所使用的堆栈-我只需要一些可以快速启动并运行的东西即可。
杰·卡尔森

1
我试图用对称的东西交换磁性,但这并不能解决问题。然而!我当时正盯着原理图,意识到我已经交换了RXD0和RXD1。h!这就是为什么我看到RX数据从PHY吐出,但MAC却什么也没收到。我可能会将旧的磁性材料重新焊接在板上(只是为了确保桌上没有晃来晃去的东西),而且我觉得自动MDI-X协议应该弄清楚了,对吗?仅当建立有效的RX / TX链接时,“链接” LED才会点亮,对吗?即使使用旧的不对称磁性,也始终会被照亮。
杰·卡尔森

Answers:


0

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

您的Wireshark输出未显示任何问题,PC宣告它三次处于本地网络并且IP地址为10.0.0.1(如果它将收到对这3个ARP请求中任何一个的答复,则OS会弹出IP地址冲突)。

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

  1. 单板没有收到PC发送的响应报文;
  2. 板希望有其他东西,或者接收到的数据包已损坏,它将丢弃该数据包。

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

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

更新:

我正在接收数据包,否则RXD0 / D1引脚将没有任何活动,对吗?

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

无论如何,取决于你,我的 故障排除理论很简单-您必须在更高级别确保遇到问题的地方,然后深入研究设计的各个部分。挖掘所有部分并怀疑一切都没有用。如果您发现问题扩大了焦点,那将是非常幸运的事情。您已经在尝试简化软件,如果不能成功,您很可能会开始更换芯片。

我认为我的故障排除步骤并不十分复杂,无法确保另一台PC可以通过加密狗与PC通讯并证明我是对还是错,从而确保您正确地研究了主板的PHY,MAC和软件是否正常工作。他们。


我很感谢您抽出宝贵的时间来编写此文件,但很明显,我的PHY正在从我的PC接收数据包,但我的主板没有收到这些数据包。否则,我将不会在RMII行上看到Rx数据,对吗?我认为这不是一个简单的高级网络问题。
杰·卡尔森

@JayCarlson您仍需证明主板电缆端的电信号代表可以被捕获且不能丢弃的适当数据包。为什么在不证明如此简单的事情的情况下深入技术?
匿名

您是否认为我的计算机实际上没有发送应该发送的数据包(而Wireshark表示正在发送)?那么,我的电路板会收到哪些数据包?该开发板直接连接到我的计算机。这不是复杂的网络设置,并且板上的PHY接收到的任何数据包都必须来自我的计算机,对吗?我正在接收数据包,否则RXD0 / D1引脚将没有任何活动,对吗?您的假设是某些东西正在丢弃数据包,对吗?什么是?PHY?RX_ERR位从不设置。MCU的MAC?接收ISR从不触发。
杰·卡尔森

我更新了答案。不要怀疑和先入为主。复杂的事情似乎比您想象的要简单。只是行动并收集信息。
匿名

1
好了,我使用相同的电缆和USB到以太网适配器将计算机连接到另一台计算机。我在两台计算机上都运行Wireshark的实例,它们显示相同的数据---一些ARP聊天,然后成功连接到端口80上运行的netcat服务。我已经对这两种方法进行了测试。我已经尝试从嵌入式板卡连接到该服务,并且正如我所说,永远不会越过ARP消息。如果我尝试从计算机连接到开发板,则它不会超出ARP阶段,因为开发板从不回复我的计算机的ARP请求。我真的不认为它在听数据包。
杰·卡尔森

0

很抱歉要复活该主题。我不能不说自己的经历。

我在其中一个项目中使用了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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.