Controlador Ethernet descubierto en el ESP8266

El venerable ESP8266 ha sacudido el mundo del Internet de las cosas. Originalmente un poco más que un curioso puente de WiFi a serie de 3 dólares, poco a poco, se fue conociendo el verdadero poder del ESP, totalmente programable, con un tesoro de periféricos que parecía que la lista de cosas que el ESP no podía hacer fue corto. En esa lista, al menos hasta hoy estaba Ethernet.

No, a pesar del título engañoso, el ESP no tiene MAC ni PHY, pero lo que sí tiene es un increíble conmutador de grabación con capacidad para DMA de 80 MHz que se puede usar para comunicar Ethernet 10BASE-T a través de un nuevo proyecto. eshernet. Únase a mí después del descanso para ver una demostración en video y un análisis profundo de cómo es posible.

¿Por qué ESP8266 necesita Ethernet?

El ESP8266 tiene todo tipo de comunicaciones y periféricos, pero una interfaz que quería era Ethernet. Quería de alguna manera hacer cosas extrañas con la red inalámbrica de ESP que cortarían su conexión con el AP anfitrión porque admite varios modos de malla. Comencé y traté de ver dónde terminaría. En cada paso, no sabía en absoluto si esto realmente funcionaría. No pude encontrar a nadie que use la interfaz I2S en dúplex. Nadie sabía qué tan rápido podía ir. Nadie sabía si manejaría datos. ¿Cómo sería la presentación? ¿Era posible enviar / recibir tramas de 1,5 kB? ¡Durante unos meses, las respuestas a todas estas preguntas salieron mucho mejor de lo que esperaba!

DESCARGO DE RESPONSABILIDAD: Este proyecto no cumple explícitamente con el estándar IEEE 802.3. No funcionará tan bien como los dispositivos diseñados correctamente. No se confunda. Esta es una artimaña festiva, no una solución de ingeniería legítima.

¿Sin MAC? ¿Sin PHY? Gracias.

Una versión anterior de uRad Monitor usa una placa ENC28J60 que se ve a la izquierda

10BASE-T utiliza señalización diferencial, NLP para anunciar la presencia de enlaces, prefacios, codificación Manchester para los bits, CRC32 para FCS, varios controles de protocolo y ráfagas de datos de hasta diez megabits. No es de extrañar que los ingenieros utilicen hardware especial. Algunos de los controladores Ethernet más conocidos utilizados por los aficionados son el ENC28J60 o su hermano mayor 100BASE-T, el ENC424J600, pero una cosa es segura: a excepción de algunos novedad proyectos, como simple en ATMega168 o duplex ATTiny85, la gente usa hardware Ethernet especialmente construido.

El bus I2S de ESP alberga una variedad de proyectos que incluyen un reproductor MP3, un controlador WS2812, un controlador CNC y un transmisor Color NTSC. Al ejecutar el bus I2S en el ESP8266 a 40 MHz, podemos capturar todo lo que sucede por cable y cambiarlo a palabras de 32 bits. En los programas, podemos ver lo que se recibió, una palabra de 32 bits cada uno; descifrar los paquetes a medida que avanzan. Entre el motor DMA conectado al bus I2S, y el núcleo Xtensa de 32 bits de 160 MHz, varias de las capas de decodificación se pueden realizar de forma inmediata y según programas.

Sigue existiendo el pequeño problema de la compatibilidad eléctrica. Aunque el ESP lata Para enviar y recibir tramas con una resistencia y dos capacitores, lo mejor es usar un controlador de línea real, como el ISL3177 de $ 1.50, porque es mucho más sensible, potente, tiene mejor protección y limita la velocidad. La tasa de error varía de ~ 5-10% a <0,1%. Todavía viola el estándar IEEE802.3, y no es tan malo.

Tramas de Ethernet

Las tramas de Ethernet son las que contienen paquetes. Los marcos existen para transportar paquetes sobre la capa física oscura y peligrosa. Contienen un preámbulo, las direcciones MAC del receptor y del remitente y el paquete real. El paquete contiene contenido como TCP, UDP, etc. También contiene FCS al final para asegurarse de que el paquete no tenga fugas durante el vuelo.

Estos fotogramas no solo los envía la cámara como corriente serial. 10BASE-T Ethernet transmite señales diferenciales a través de cables de cobre, con aislamiento magnético. La combinación de estas cosas significa que no podemos enviar demasiados 1s-0s seguidos sin destruir los imanes.

Aunque se utilizan muchas técnicas como 4B5B (en 100BASE-T Ethernet) o EFM (en CD) para solucionar esto en otras tecnologías de comunicación, 10BASE-T ha optado por la codificación Manchester.

La codificación Manchester describe todos los 1 y 0 en las transiciones hacia arriba o hacia abajo. El bit "1" está representado por una transición de bajo a alto, mientras que 0 está representado por una transición de alto a bajo. Estas transiciones deben sincronizarse cuidadosamente, de lo contrario habría un desastre de confusión. Si se comprueban las transiciones incorrectas, es fácil mirar hacia atrás y perder datos.

Como ingeniero de software, originalmente encontré crítico por qué alguien usaría un esquema de codificación tan sensible. La respuesta está en el hardware. Es posible utilizar PLL para sincronizar el flujo en el preámbulo. Una vez bloqueado, encuentra el final del preámbulo y recibe un flujo claro de datos. Para nosotros, sin embargo, tendremos que hacer la decodificación en programas y con este enfoque será obvio que Manchester es menos que conveniente.

El sistema

El objetivo es enviar y recibir tramas Ethernet. Hay algunos pasos a seguir para hacer esto. Si bien el motor I2S-DMA nos proporciona valores sin procesar de 32 bits de los bits en el cable, aún necesitamos encontrar las tramas, descifrar las tramas, verificar el FCS y entregar las tramas al usuario. Si tuviéramos que transferir la decodificación de Manchester al hilo principal, ¡tomaría la asombrosa cantidad de 6208 bytes para un paquete almacenado en búfer! Necesitamos hacer la decodificación dentro de la interrupción I2S.

Una vez que ha pasado al hilo principal, puede verificar FCS y todo lo demás necesario en la capa de usuario. El FCS es fundamental en esta aplicación porque muchas cosas pueden hacer que nuestro paquete se corrompa. Los sistemas normales solo tienen que contentarse con el ruido eléctrico, mientras que nosotros tenemos que preocuparnos por las interrupciones que son demasiado largas, los desbordamientos del búfer y cualquier otra cosa que pueda dañar nuestro empaque.

Si la capa de usuario desea responder o enviar paquetes, puede enmarcar el mensaje, sobrescribir el CRC, codificar el paquete y devolverlo a la interrupción, que recogerá y entregará el paquete en la próxima ocasión disponible.

La decodificación

Así que ahora el ESP captura constantemente este flujo de 1 y 0. Una vez que ingresa una nueva porción de datos, se llama a una interrupción y nuestro código puede comenzar a buscar un paquete en los datos. Para verificar si un paquete está presente, simplemente tiene que buscar en el flujo palabras de 32 bits que no sean todos 1 o 0. Después de encontrar 3 cuadros seguidos con algo sucediendo, nuestra confianza de que tenemos un paquete es alta. .

La decodificación de Manchester es un poco más difícil que el software. Debido a que tenemos una señal digitalizada, no siempre encaja perfectamente con la señal. Para empeorar las cosas, si probamos exactamente a 40 MHz y existe la misma probabilidad de que la señal sea alta o baja, puede haber casos ambiguos. Para resolver esto, necesitamos agregar un sesgo para que veamos más de 0 que 1. Hay mucho que interpreta cada bit. Detección larga y corta, búsqueda de estados erróneos, búsqueda de fin de preámbulo, interpretación de estados de bits. Esto fue complicado, por lo que se creó una GUI HTML5. Está disponible en Internet aquí, lo que le permite jugar con un paquete de muestra, convertir bits, etc. Cuando se ejecuta en el ESP, se puede utilizar para capturar paquetes problemáticos y examinar los bits sin procesar.

Debido a que los bits llegan a 40 MHz, esto nos da 4 ciclos de reloj de procesador (@ 160 MHz) por bit, como máximo para averiguar qué hacer con nuestra corriente de entrada. El algoritmo ingenuo es de 140 líneas de código y procesa un bit a la vez, y después de una gran optimización tarda unas 10 veces más en ejecutarse en el conmutador.

Para lograr la velocidad necesaria para ejecutar la interrupción, usamos una tabla. Para cada combinación posible de estados de entrada y bits de entrada, calculamos los estados de salida. Tenemos que preocuparnos por la polaridad, si la última pieza antes de roer fue 1 o 0, el mismo número de bits seguidos, verificar pares cortos desiguales y 4 bits de datos nuevos. También tenemos 10 bits de datos de salida. Esto funciona en una tabla de 1024 × 2 bytes.

Los resultados son asombrosos. Yendo un poco más allá y usando una tabla en lugar de código, obtuvimos el aumento de rendimiento 10 veces mayor que necesitábamos, ¡y un pequeño cambio!

La capa "usuario"

Dado que todavía no es posible utilizar la pila TCP / IP con el ESP, necesitábamos utilizar la nuestra. Desde que formé esta pila Ethernet a partir del controlador ENC424J600, fue muy fácil llevar la pila avrcraft IP + ARP + UDP + TCP a este proyecto. Para facilitar las cosas, el servidor HTTP utilizado en este proyecto también se tomó prestado de allí. Por lo tanto, transferir incluso el servidor web a nuestra pila TCP / IP fue trivial.

Codificación

Ethernet no es muy interesante si solo puede obtenerlo. También se requiere la entrega de paquetes. La pila de IP podrá construir una trama con las direcciones MAC y la carga útil, pero tendremos que agregar el preámbulo y FCS, luego Manchester encripta los datos. La codificación de la señal de Manchester podría ser dolorosa si se emitiera un bit a la vez, ¡pero también podemos aprovechar una tabla aquí! La codificación de datos por cable se puede realizar por bit mediante la función siguiente.

static const uint16_t ManchesterTable[16] __attribute__ ((aligned (16))) = {
    0b1100110011001100, 0b0011110011001100, 0b1100001111001100, 0b0011001111001100,
    0b1100110000111100, 0b0011110000111100, 0b1100001100111100, 0b0011001100111100,
    0b1100110011000011, 0b0011110011000011, 0b1100001111000011, 0b0011001111000011,
    0b1100110000110011, 0b0011110000110011, 0b1100001100110011, 0b0011001100110011,
};

void PushManch( unsigned char k ) {
     *(sDMA++) = ( ManchesterTable[ (k)>>4 ] )|( ManchesterTable[ (k)&0x0f ]<<16 );
}

En serio. Las tablas son impresionantes.

La transmisión plantea problemas de hardware

El motor I2S del ESP no puede recibir paquetes a menos que el transmisor también esté funcionando. Esto significa que incluso si solo transmitimos ceros, todavía tenemos que alimentar los descriptores válidos del motor DMA. Los descriptores enlazan con "siguiente", que se emite después del enlace. No hay forma de cambiar el DMA activo cuando se inició. Además, si detiene el subsistema DMA en el lado TX, el bus I2S se bloqueará incluso brevemente.

No hay forma de emitir solo un paquete aquí y allá. Para empeorar las cosas, las llamadas de interrupción pueden fallar, por lo que no pueden confiar en las cadenas de intercambio de inmediato. Todos los estados deben ser estables. Tenemos varios descriptores que solo envían ceros ([0] tra [3]) y una opción para vincular uno o más descriptores de datos. Para enviar solo un paquete, debemos cambiar entre hacer ping [0] y [1] enviar el paquete, hacer ping entre [2] y [3].

Lo que esto significa es:

  • Normal, [0] debe apuntar a [1] y [1] Alabama [0].
  • Enviando un paquete, [1] puntos a [Packet], [Packet] puntos a [3]
    • El sistema seguirá rebotando entre [3] y [2] Hasta que ...
  • Lo vacías enganchando [1] Alabama [0] y [3] Alabama [0]
  • Entonces el sistema volverá a inactivo entre [0] y [1].
  • ¡Eso es! ¡Ahora podemos recibir y enviar paquetes a través de 10BASE-T Ethernet!

    Desde aqui

    Todavía hay muchas mejoras potenciales, mucho mantenimiento, mejora de algoritmos, gran espacio para el desarrollo y la integración con las pilas TCP / IP existentes (o nuevas) y mucho más. ¿Quizás esto podría incluso ser portado a ARM sin Ethernet? Sin embargo, nada de esto es crítico. Con Ethernet desbloqueado, libera la interfaz WiFi para hacer todo tipo de cosas inusuales. Ahora es posible verificar paquetes de todas las fuentes, inyectar paquetes. Los grupos de ESP en modo de malla podrían conectarse a Ethernet. Los ESP en modo pueden comunicar sus hallazgos o incluso inyectar paquetes de forma remota. Pero estoy deseando ver los proyectos que creará y que ni siquiera pudo ¡imagina!

    • Vikas dice:

      ¿Es esta otra de las complejas bromas de April Fools?

      • RichardS dice:

        Conociendo CNLOHR, no.

        • Doug dice:

          Entonces las cosas pueden venir del que menos esperas. No estoy familiarizado en absoluto con CNLOHR y el tema de Ethernet. ¿La WTF? Es hora de llamar a BS BS momento para mí, estaba usando el cable para curar el problema del ruido de HF con radiación para que otros lo manejen, mientras que el comentario en video dice que un cierto valor de límite también funcionará.

      • G42 dice:

        Dado que algunas publicaciones no antes del 1 de abril tienen ATTiny85 usando ethernet, no veo ninguna razón por la que este chip más poderoso no pueda hacerlo. Difícil de llamar a este. O ya funciona y la fecha de publicación apesta, o es una broma hasta la semana que viene cuando alguien lo implementará.

        • hboy007 dice:

          https://la-tecnologia.com/2014/08/29/bit-banging-ethernet-on-an-attiny85/

          todavía hay una gran brecha entre la generación de la señal y la implementación de la pila completa. Aunque es un gran truco. Prefiero los chips W5x00 entre otras cosas 😉

          • cnlohr dice:

            Simplemente no había suficiente espacio para TCP, ¡pero UDP lo manejó bien!

      • James Purcell dice:

        Nadie ha visto nada sobre esp8266.com

    • RichardS dice:

      Lo hiciste de nuevo CNLOHR, buen trabajo ... tenemos que empezar un hilo en esp8266.com para eso, es muy interesante, y seguro que a muchos usuarios les gustaría aprovechar el bus I2S que estás desenredando ...

      • cnlohr dice:

        Busqué un poco a alguien que hablara de eso y no encontré ninguno: - /. Para ser justos, eso sucedió hace 3 meses antes de que comenzara a tomar este problema en serio. Espero no haberme pisado. REALMENTE necesito volver a los foros de esp8266.com, porque ustedes son el plexo central de todo el conocimiento de ESP. Me resulta muy difícil ser social cuando estoy trabajando en un proyecto.

      • PuceBabuino dice:

        Ricardo,

        Cicero prometió publicar su código ENC28J60 tan pronto como arreglara algunos errores y lo limpiara. No tan "desnudo" como el "truco de fiesta" de CNLohr (¡Ah, codificación de Manchester, eso me trae de vuelta, chico!) Y con la difícil conexión entre los dos siendo que el póster original de esp8266.com siguió el nombre de "April1".

        http://www.esp8266.com/viewtopic.php?f=13&t=1184&start=24#p41229

        • cnlohr dice:

          ¡Aah! Bueno, ¡tuve la impresión de que alguien más estaba trabajando en bare metal también! Ya no me siento mal. PD: Las empresas que crearon tableros realmente necesitan más explosiones 424j600. Son mucho mejores. Está mucho más simplificado en el 424, incluso cosas como sumas de comprobación de cuasi-carga, etc. Hace escribir pilas de TCP.

    • therafman dice:

      Veo que se hizo un gran esfuerzo en la publicación de estos Aprilers ... estaban listos de antemano 🙂

      • Cellgalvano dice:

        Es cnlohr, es una locura, pero es verdad: D

    • Bogdan dice:

      Me gusta la referencia del chip FTDI de truco de circo :))

    • j. chupar dice:

      ver 1:06 banner ...

    • Jordixucla dice:

      ver 1:06 texto 🙂

      • Mike Szczys dice:

        April Fools es sólo un título "Controlador Ethernet descubierto en ...", no hay controlador Ethernet basado en hardware, pero cnlohr implementó 10Base-T utilizando el periférico de hardware i2s en este chip. Es un truco vil y ciertamente no es una broma.

        • Jordi x. dice:

          Bastante impresionante en ese caso

    • Harold dice:

      Es un momento muy desafortunado para publicar si realmente ...

      • James Purcell dice:

        * Suspiro * Eso es tan cierto.

        • cnlohr dice:

          No se preocupe, habrá más publicaciones sobre esto. No sé sobre editoriales ni nada, ¡pero me sorprendería que Ethernet no conduzca a proyectos más asombrosos!

          • James Purcell dice:

            Estoy seguro de que es el comienzo de una nueva fase en la electrónica.

    • OLD_HACK dice:

      Bien, ahora conecte un transceptor de fibra óptica SFP para ganar.
      😉

    • Tucson Tom dice:

      Ja, ja, casi me enamoro de esto también.

    • Nathan McCorkle dice:

      ¿Podemos reducir lo que se necesitaría para ser 802.3? ¿Es solo la sincronización de cuadros PLL, o algo más / más?

    • atom3 dice:

      ¿Qué sigue, Oculus Rift en el esp8266?

      • cnlohr dice:

        No.

      • onebiozz dice:

        No, una interfaz PCIe completa para alimentar una tarjeta gráfica y jugar un poco

        • rasz_pl dice:

          podrías hacer totalmente ISA

          • rj dice:

            No hay suficientes pines ... pero me pregunto / temo que podrías expulsar a LPC.

            • rasz_pl dice:

              Pensé en registros de turno

    • Marco dice:

      mojosa ..

    • Greenaum dice:

      Es muy impresionante, pero en realidad no es un controlador Ethernet "descubierto", está "implementado" o "pirateado" con mucho trabajo. No es lo que el título tiende a esperar.

      • cnlohr dice:

        Ese era el aspecto "April Fools" del cartel.

    • Ada Smith dice:

      ¡Guau! ¡es CNLohr de nuevo! tenemos que localizar a este hombre y darle un premio.

    • Tomás dice:

      Esto fue completamente una broma de April Fools en el sentido de que resultó NO ser una broma de April Fools. Me quito el sombrero, señor.

    • Leche completamente fresca dice:

      Día de los Inocentes ..

    • Sven dice:

      "Quizás esto incluso podría ser portado a ARM sin Ethernet"

      Hm. Me viene a la mente Pi Zero.

      • G42 dice:

        Sospecho que una persona con mucho talento podría hacer eso, pero el gran obstáculo serán los tiempos. En un micro dedicado podemos cronometrar las cosas de acuerdo con las instrucciones, pero con pi, con Linux ejecutándose, no podemos estar tan seguros de los tiempos. Sé que es factible porque las señales de control de prospectos WS2812 funcionan con su sincronización ajustada, pero ¿qué más será un problema?

        • rasz_pl dice:

          si solo un peso tuviera 20MHz I2S 🙂

          • TheBigOrangePi dice:

            Hay una implementación de Ethernet de 10 Mbps sobre SPI para Pi: https://github.com/BertoldVdb/SPI10M

    • AntonYmer dice:

      El 1 de abril podría ser divertido ... 1 de abril. Entonces tienes que marcarlos como bromas o al menos intentaré buscar información más confiable en otro lugar.

      • cnlohr dice:

        Es cierto que publicar eso el 1 de abril fue un error. El título debe ser claro: “ESP8266 ahora es compatible con Ethernet 10BASE-T” y debe publicarse en algún momento. Mi idea era divertirme con él y hacer que el título fuera engañoso y pedirle a la gente que pensara que es una broma, pero salirse con la suya dándose cuenta de que es serio.

    • Ben Nguyen dice:

      Pregunta de novato, pero ¿no se permite el uso de una pila tcp / ip de microchip con sus chips ethernet (enc28j60, enc424j600)? ¿Está la pila abierta para llevarla a cualquier otro hardware? ¿Eso fue hecho aquí?

      • cnlohr dice:

        No consideraría usar esa pila. Yo uso la pila AVRcraft, es una pila IP / ARP / UDP / TCP mucho más ligera.

    • Vadim Boyadzhi dice:

      ¡Hola!
      Necesito un puente Ethernet Wi-Fi. Creé un receptor RETRADIO con una interfaz Ethernet. Quiero escucharlo vía Wifi. ¿Tu dispositivo podrá hacer eso? Proporcione el firmware (hexadecimal). Muchas gracias
      PD. Por supuesto, sería lógico rehacer el receptor, pero no puedo.

      • cnlohr dice:

        No, no uses esto para eso. Puede usar OpenWRT para hacer lo que quiera.

    • alemayehu dice:

      Hola a todos,
      ¿Alguien puede tener una solución para obtener una dirección maca de la estación (clientes) con el microcontrolador esp8266, logré obtener el paquete de datos en modo sniffer (diverso) revocando wifi_promiscuous_rx_cb, en mi caso lo que me impresionó fue obtener la dirección mac
      Y cuando utilicé el vector struct sniffer-buf para extraer la dirección mac, causó un error excepcional, gracias por cualquier ayuda,
      Gracias

      • cnlohr dice:

        "¿Ha surgido un error excepcional" ??? En que programa Si expone los bytes proporcionados por promiscuous_rx_callback, como los datos sin procesar, la dirección mac debe estar encriptada allí.

    • Marco dice:

      ¿Algún reemplazo más barato para ISL3177?

    • andrejkvasnica dice:

      Estoy pensando en volver a colocar 2 ESP8266 en la placa, cada uno generando su propio wifi hablando a través de los diferentes canales, lo que hace un repetidor wifi real.
      Lo único es que la interfaz serial de 115200 bits es muy lenta para el uso real de wifi.
      Así que encontré este truco que parece prometedor. ¿Qué hay de no implementar una ethernet completa, sino solo los búferes de entrada y salida de espejo en los ESP8266?

      • cnlohr dice:

        Puede adquirir la tarifa a 2 Mbaudios. No sé si los quince son lo suficientemente grandes como para hacerlo sin perder ningún byte, pero recomiendo encarecidamente que lo pruebes.

    • CaqKa dice:

      ¿De verdad, o tonto de abril?

      • cnlohr dice:

        La broma era que no era una broma. No hay un controlador de Ethernet en el ESP, pero eso no lo detiene hable Ethernet!

Pedro Molina
Pedro Molina

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *