2
STM32F407 + LAN8720A + lwIP + FreeRTOS =未收到以太网帧
我正在尝试使用STM32F407和LAN8720A以太网PHY的PCB,尽管接收帧没有问题,但我似乎无法接收到任何以太网帧。 硬件设定 我在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到以太网转换器)捕获了主板和计算机之间的交互。 由于没有收到帧的问题,我们永远也不会 错过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没有对它进行解码。 …