STM32F407 + LAN8720A + lwIP + FreeRTOS = No hay tramas Ethernet recibidas

9

Estoy tratando de mostrar una PCB que usa un STM32F407 y LAN8720A Ethernet PHY, y parece que no puedo recibir ninguna trama de Ethernet, aunque no tengo problemas para transmitirlas.

Configuración de hardware

Esquema de Ethernet PHY Tengo un cristal de 25 MHz en el STM32F4, impulsando un pin de salida de reloj de 25 MHz en el LAN8720A, que está en modo REF_CLK_OUT, y conduce un reloj de 50 MHz de regreso al STM32F4 como parte de la interfaz RMII.

El jack / magnetics son una parte genérica. Aquí está la hoja de datos: ingrese la descripción de la imagen aquí

Software

Estoy usando la última actualización de STM32CubeMX para generar un System Workbench para el proyecto STM32 que contiene FreeRTOS, lwIP, más los controladores periféricos ETH. Realmente no he tocado ninguno de los códigos generados, por lo que la pila lwIP se inicializa dentro de una pila FreeRTOS.

Los experimentos

Con el lwIP de mi placa configurado para una IP estática 10.0.0.2 y un dongle de USB a ethernet en mi computadora configurado para una IP estática 10.0.0.1, conecto los dos dispositivos directamente con un cable Ethernet, y mi placa intenta conectarse a un servicio en el puerto 80 de la computadora. Capturo la interacción entre mi placa y la computadora usando Wireshark (que se ejecuta en la computadora y enlazada al convertidor de USB a Ethernet).

Debido al problema de que no hay marcos recibidos, nunca Captura de Wireshark superamos estas cosas ARP: Como puede ver, Stmicroe (mi placa) puede enviar paquetes ARP, escuchados por mi computadora, pero nunca parece escuchar la respuesta de mi computadora , ya que sigue lanzando paquetes ARP.

Ambos dispositivos están configurados con una máscara 255.255.255.0, y ambos están configurados con una dirección de puerta de enlace de 10.0.0.1 (la computadora). Escuché que las tablas ARP se arruinaron y que las computadoras ignoraron los paquetes ARP, pero no puedo imaginar que la placa ignore los paquetes ARP específicamente dirigidos a ella por mi computadora, en respuesta a las solicitudes que la placa hizo en primer lugar.

Entonces, me sumerjo en el archivo ethernetif.c de lwIP y noto que HAL_ETH_GetReceivedFrame_IT(&heth)está devolviendo un error. Esa función devuelve un error porque (heth->RxDesc->Status & ETH_DMARXDESC_OWN)== 0, en lugar de 1. Interpreto que significa que los búferes de DMA están actualmente armados para el periférico MAC y aún no han recibido nada.

Además, he verificado que nunca se llama al HAL_ETH_IRQHandler.

¿Un problema con el PHY?

En este punto, sospechaba que mi PHY tenía la culpa.

Para investigar más, conecté mi Saleae Logic Pro 16 a todas las señales relevantes y noté que hay mucho tráfico tanto en las líneas TX0 / TX1 como en las líneas RX0 / RX1. Aquí hay una captura de algo de tráfico RX con el reloj de entrada de 25 MHz:

Captura del paquete recibido.

RX_ERR está bajo todo el tiempo, a menos que intente capturar la salida de reloj de 50 MHz (lo que obviamente es un desafío con un dispositivo como el Saleae): en ese caso, RX_ERR se borra ocasionalmente para algunos paquetes (lo que en realidad es una buena señal - el pin parece estar funcionando).

Próximos pasos

He intentado habilitar manualmente las interrupciones ETH llamando HAL_NVIC_EnableIRQ(ETH_IRQn);después de que tcpip_init()se llama en la MX_LWIP_Init()tarea, y eso no parece solucionar el problema. No estoy completamente seguro de que se suponga que se llame a la rutina de interrupción de Ethernet ; eso es lo desafiante con la presentación de un nuevo diseño; Estoy luchando por determinar cuál sería el comportamiento adecuado del sistema, por lo que puedo determinar cómo difiere mi configuración.

Si bien he usado las cosas STM32 / STM32CubeMX / FreeRTOS antes, nunca he usado el periférico Ethernet de STM32, y mi única experiencia con estas cosas es en sistemas Linux embebidos personalizados, que siempre parecían funcionar de manera inmediata. ¡Este es un territorio nuevo para mí!

Estoy seguro de que hay una estúpida casilla de verificación en alguna parte o una Ethernet_EnableReceive()función mágica a la que me olvido de llamar, pero realmente no puedo encontrar ninguna documentación que sugiera la necesidad de habilitar explícitamente esas cosas, y las publicaciones que estoy viendo en Internet se deben a que no están relacionadas cuestiones.

Si alguien tiene alguna idea, ¡me encantaría recibir ayuda!

Anexo: Deshacerse de FreeRTOS

Solo para eliminar cosas, eliminé el componente del proyecto FreeRTOS, volviendo a un proyecto básico. En mi bucle principal, llamo MX_LWIP_Process(). Este método debería eliminar la necesidad de interrupciones, pero no soluciona el problema; Todavía no puedo recibir marcos. Esto me hace pensar que hay algo en el código ETH HAL generado por STM32CubeMX.

Solución

En caso de que alguien se tope con esta pregunta en el futuro, el problema resultó ser voltear los pines RXD0 y RXD1. Es por eso que pude ver el tráfico en mi analizador lógico, pero mi MCU no lo decodificó.

Como alguien señaló, los imanes que utilicé son asimétricos y no deben usarse para auto-MDI-X. No he tenido ningún problema. Anticipo que está sucediendo una de dos cosas: - los imanes no funcionan realmente en la otra orientación, pero debido a que todo lo que tengo usa auto-MDI-X, mi placa esencialmente permanece fija en la configuración que funciona, mientras que el otro dispositivo está encendido el cable orienta sus señales para que coincidan. - el magnetismo proporciona una integridad de señal adecuada debido a las cortas ejecuciones de Ethernet, pero un análisis a largo plazo mostraría tasas más altas de caída de paquetes o problemas durante las ejecuciones más largas.

Honestamente, no está claro para mí por qué importaría en qué lado del transformador 1: 1 están instalados los filtros de línea, por lo que, fuera de las aplicaciones PoE, no estoy seguro de por qué sería importante un diseño simétrico frente a asimétrico.

Jay Carlson
fuente
¿Dónde está instalado Wireshark?
Anónimo el
La computadora a la que la placa intentaba conectarse. Editaré la pregunta para agregar claridad a esto.
Jay Carlson el
FWIW, recomendaría usar la pila FreeRTOS. (Me doy cuenta de que esto no funciona con su consulta específica). No puedo hacer nada hasta esta noche, pero si ayudó, estoy bastante seguro de que tengo un proyecto para ese procesador en el que obtuve pings con la pila FreeRTOS. Sin embargo, no sé qué PHY estaba en el tablero. De todos modos, avíseme si desea el proyecto, puedo ponerlo en el sitio interactivo de FreeRTOS.
DiBosco
Eso sería súper útil. Soy totalmente agnóstico con respecto a la pila que estoy usando. Solo necesito algo que pueda poner en funcionamiento rápidamente.
Jay Carlson el
1
Traté de cambiar el imán por algo simétrico, y eso no solucionó el problema. ¡Sin embargo! Estaba mirando mi esquema esquemático y me di cuenta de que tenía RXD0 y RXD1 intercambiados. Doh! Es por eso que vi que los datos RX se escupían del PHY, pero nada recibido por el MAC. Podría volver a soldar mis viejos imanes en el tablero (solo para no tener algo colgando de la mesa), y siento que el protocolo auto-MDI-X debería resolverlo, ¿verdad? El LED "enlace" solo debería iluminarse cuando se establezca un enlace RX / TX válido, ¿verdad? Siempre estaba iluminado, incluso con los viejos imanes asimétricos.
Jay Carlson el

Respuestas:

0

Usted tiene wireshark instalado en la PC y, como usted dice, usa un adaptador USB a LAN. No estoy seguro de en qué punto físico Wireshark captura los paquetes en su configuración y, por lo tanto, es una buena pregunta si los paquetes salientes aparecen realmente en la red física . Le recomiendo que conecte otra PC con interfaz de red y vea si estas PC pueden comunicarse entre sí comparando la salida de Wiresharks en ellas.

Su salida de Wirehark no muestra ningún problema, la PC anuncia tres veces que está en la red local y que tiene la dirección IP 10.0.0.1 (si recibiera respuesta a cualquiera de estas 3 solicitudes ARP, el sistema operativo aparecería con un conflicto de dirección IP).

Entonces, su tablero pregunta constantemente ¿Quién tiene 10.0.0.1? Dile a 10.0.0.2 y PC con respuestas 10.0.0.1 está en ... . La pregunta es por qué sucede en bucle:

  1. la placa no recibe físicamente el paquete de respuesta enviado por la PC;
  2. la placa espera algo más, o el paquete recibido está dañado y descarta el paquete.

Por lo tanto, como siguiente paso de solución de problemas, tome otra PC con interfaz Ethernet "normal", instale Wireshark en ella, configure su red de la misma manera que lo hizo con la placa e intente telnet 10.0.0.1 80ver que aparece en Wiresharks en ambas máquinas. De esta manera, se aseguraría de que la PC con su adaptador USB a Ethernet funcione correctamente.

Sus próximos pasos dependerán de las cosas que vea en estos Wiresharks.

Actualizar:

Estoy recibiendo paquetes, de lo contrario, los pines RXD0 / D1 no mostrarían actividad, ¿correcto?

Incorrecto. Desea pensar que su placa recibe paquetes. Verá que hay algún cambio en el nivel de las señales de entrada PHY, pero no necesariamente representan paquetes válidos. El hecho de que RX_ERR no se active no me convence de inmediato de que PHY funciona correctamente en los eventos entrantes, o que la información que llega forma los paquetes adecuados.

De todos modos, depende de ti, mi teoría de resolución de problemas es simple: debe asegurarse en un nivel superior dónde encuentra el problema y luego profundizar en la parte respectiva del diseño. Excavar en todas las partes y sospechar que todo es inútil. Sería una gran suerte si encuentra problemas para difundir el enfoque; ya está intentando simplificar el software, si no tiene éxito probablemente comenzará a reemplazar los chips.

No creo que mi paso de solución de problemas sea tan complicado como para garantizar que otra PC pueda comunicarse con la PC con un dongle y demostrar que estoy equivocado o correcto, y así asegurarme de que estás investigando correctamente PHY, MAC y software de la placa sospechosa trabajando en ellos.

Anónimo
fuente
Si bien agradezco que se haya tomado el tiempo de escribir esto, está bastante claro que mi PHY está recibiendo paquetes de mi PC, pero mi tablero no los recibe. De lo contrario, no vería los datos Rx en las líneas RMII, ¿verdad? No creo que esta sea una pregunta simple de redes de alto nivel.
Jay Carlson el
@ JayCarlson Aún debe demostrar que las señales eléctricas en el extremo del cable de su placa representan paquetes adecuados que pueden capturarse y no descartarse. ¿Por qué profundizar en la tecnología sin probar cosas tan simples?
Anónimo el
¿Es su teoría que mi computadora no está enviando los paquetes que debería enviar (y que Wireshark dice que está enviando)? ¿Cuáles son los paquetes que recibe mi placa? La placa está conectada directamente a mi computadora. Esta no es una configuración de red complicada, y cualquier paquete recibido por el PHY en mi placa tiene que originarse en mi computadora, ¿verdad? Estoy recibiendo paquetes, de lo contrario los pines RXD0 / D1 no mostrarían actividad, ¿correcto? Su hipótesis es que algo está descartando paquetes, ¿verdad? ¿Que es? El PHY El bit RX_ERR nunca se establece. ¿El MAC de la MCU? el ISR de recepción nunca se dispara.
Jay Carlson el
Actualicé la respuesta. No seas dudoso y preconcebido. Las cosas complejas pueden parecer más simples de lo que piensas. Solo actúa y recopila información.
Anónimo el
1
Muy bien, conecté mi computadora a otra usando el mismo cable y adaptador USB a ethernet. Ejecuté una instancia de Wireshark en ambas computadoras, y muestran datos idénticos, algunas conversaciones ARP, y luego una conexión exitosa a un servicio netcat que se ejecuta en el puerto 80. Lo probé en ambos sentidos. Intenté conectarme a ese servicio desde mi placa integrada y, como dije, nunca recibo mensajes ARP. Si trato de conectarme a la placa desde mi computadora, no pasa la etapa ARP, ya que la placa nunca responde a las solicitudes ARP de mi computadora. Realmente no creo que esté escuchando paquetes.
Jay Carlson el
0

Lamento resucitar este tema. No podría pasar sin mencionar mi experiencia.

He usado este HR911105A (RJ45 con imán) con uno de mis proyectos.

HR911105A: ingrese la descripción de la imagen aquí De un vistazo, una cosa me llamó la atención, que era la conexión entre LAN8720 y RJ45 según su esquema.

Desde que veo que la conexión parece cruzada. Aunque los sistemas conectados utilizan principalmente MDI-X y, por lo tanto, detectan pares de recepción / transmisión, sería bueno darle una conexión menos confusa como esta:

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

Pin #4 and Pin #5(por lo tanto, las resistencias pull-up 49.9R) serían buenas si se conectan 3V3_ANen su esquema mientras que el otro lado debe estar acoplado al GND a través de un condensador (0.1uF o 0.022uF).

Sener
fuente