Comunicación entre 2 microcontroladores diferentes

5

Mi Arduino funciona a una velocidad de reloj de 16MHz; Otro microcontrolador funciona a una velocidad de reloj de 13MHz. Si envío una salida digital directamente desde un pin de salida del primero al pin de entrada del último, habrá una pérdida de datos y la transmisión se corromperá.

Pregunta 1: ¿Cómo puedo hacer que las MCU transmitan correctamente los datos sin daños? ¿Necesito sincronizarlos de alguna manera, o debo usar otro dispositivo en el medio como una especie de búfer (o tal vez para enviar datos a una tasa más baja)?

Pregunta 2: Si puedo enviar datos a una tasa menor desde MCU # 1 a MCU # 2, ¿habrá una diferencia de fase que podría resultar en la corrupción de los datos?

    
pregunta Anton Stafeyev

2 respuestas

5

Los puntos que hagas son absolutamente válidos. Lo que te faltan son algunos detalles que puedes obtener al leer más sobre los protocolos de comunicación. Éstos son algunos de ellos.

  1. La velocidad de comunicación siempre debe elegirse entre la velocidad máxima requerida , no la que se puede lograr.

El motivo de esto es que, con algunas excepciones (transceptores, buffers, etc.), los datos transferidos deben obtenerse o procesarse de alguna manera. La entrada desde la interfaz humana ciertamente funciona en una dimensión de tiempo completamente diferente. Y si su controlador tarda varios segundos en procesar 1 MB de datos, sería inútil transferirlos a una velocidad de 16 Mbps.

  1. Debido a que la relación señal-ruido disminuye con la distancia, el ancho de banda máximo alcanzable también disminuye.

Hay un término "producto de distancia de ancho de banda" que se usa a menudo en la comunicación. Esta es otra razón por la que las conexiones directas de MCU a MCU rara vez utilizan esas altas velocidades de datos.

  1. En las MCU modernas, las velocidades de comunicación a menudo son independientes de los relojes de la CPU.

Por ejemplo, las MCU de Xmega tienen relojes periféricos que funcionan con 2 o incluso 4 veces la velocidad de la CPU. Además, los controladores con interfaces USB a menudo tienen sus propios osciladores.

  1. Ahora se admiten varios protocolos de comunicación en hardware .

Los protocolos síncronos como SPI (o I2C en el lado esclavo) tienen sus señales de reloj provenientes de las diferentes MCU. Por lo tanto, el hardware puede usar ese reloj para transferir datos a / desde el búfer y solo involucra al procesador al final de un mensaje. Las MCU más avanzadas con soporte DMA pueden incluso mover los datos entre diferentes periféricos o memoria sin involucrar a la CPU en absoluto.

Los protocolos asíncronos como UART o CAN requieren relojes sincronizados. Comienzan a cronometrar en el bit de inicio y luego muestrean las entradas una vez aproximadamente en el punto medio del reloj (UART) o hasta tres veces en aproximadamente el 75% del pulso de reloj (CAN). Obviamente, la integridad de los datos depende de la precisión del reloj. Mientras que los controladores CAN pueden ajustar sus relojes usando información de cambio de fase, los UART más simples no pueden.

Una práctica común para lograr una mejor sincronización de UART es usar cristales con frecuencias fácilmente divisibles a las velocidades en baudios en serie comunes. Por ejemplo, en lugar de ejecutar los controladores Xmega mencionados anteriormente en su máximo de 32 MHz, a menudo se pueden ver con 14.7456 cristales, que funcionan a 29.5 MHz.

Independientemente del protocolo, la combinación de almacenamiento en búfer de hardware y transferencias DMA hace que el ancho de banda de transferencia sea bastante independiente de los relojes de la CPU.

  1. Finalmente, cuando la velocidad de comunicación aumenta, es más común ver chips de controladores separados en lugar de una conexión directa a MCU.

No solo eso, sino que normalmente puede ver una conexión de bus paralelo entre MCU y transceptores de alta velocidad como la pantalla LAN o LVDS. Esto se debe a que el rendimiento del bus de comunicación es más rápido de lo que se puede pasar en un solo pin de MCU en serie.

Has mencionado Ethernet en uno de tus comentarios. Debería darse cuenta de que con velocidades de 1 Gbps Ethernet no MCU de 16 MHz tiene una posibilidad de procesar esa avalancha de tráfico. Para esas velocidades, deberías buscar hardware mucho más capaz, como el que se usa en RPi, por ejemplo.

Por cierto, este último punto es solo otra forma del punto # 1, es decir, si no puede reducir la velocidad de datos a algo que su MCU puede manejar, lógicamente se deduce que necesita un procesador más rápido para manejar el flujo de datos.

    
respondido por el Maple
6

Tienes bastante razón en tu análisis del problema, y por supuesto está resuelto.

La solución es un protocolo en serie de su elección. Por lo general, un microcontrolador tendrá uno o más de los protocolos comunes de comunicación inter-IC:

UART es "sin reloj" por lo que cada lado debe decidir la velocidad del reloj. La velocidad es lo suficientemente baja como para que cada receptor pueda encontrar los bits correctos y resuelva el problema de "fase" insertando bits adicionales que siempre serán bajos o altos adyacentes a un bit de la polaridad opuesta.

SPI e I2C tienen un reloj además de los datos. El receptor solo actuará sobre los datos cuando el reloj cambie. Normalmente el hardware se encarga de todo. I2C tiene un límite de velocidad de reloj estandarizado, mientras que SPI no tiene dicho límite.

Entre estos, SPI es posiblemente el más fácil de implementar en hardware discreto. Básicamente, no es más que un registro de cambios , y puede interactuar directamente con una cantidad de chips lógicos comunes y baratos. Tampoco hay un límite de velocidad inferior, y la fluctuación de fase no es un problema, ya que se maneja únicamente por el reloj, por lo que es fácil de implementar en software en un procesador lento.

    
respondido por el pipe

Lea otras preguntas en las etiquetas