我正在尝试使用 STM32F407 和 LAN8720A 以太网 PHY 的 PCB,但我似乎无法接收任何以太网帧——即使我在传输帧时没有问题。
硬件设置
我在 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 问题: 如您所见,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 应用之外,我不确定为什么对称与非对称设计很重要。