¿Cuál es el protocolo general para enviar información de un sistema a otro? Por ejemplo, supongamos que tenemos cierta información recopilada del microcontrolador durante un período de tiempo que queremos enviar a otro microcontrolador. He oído hablar de las interfaces SPI e I2C, pero no estoy claro cuando usa un método sobre otro y cómo lo implementa. ¿Existen otros métodos además de SPI e I2C que sean comunes? ¿El proceso de implementación es similar para diferentes microcontroladores? ¿Está básicamente analizando bytes de datos que estoy haciendo en el microcontrolador receptor?
18
Respuestas:
SPI e I2C son algo similares, ya que realmente se usan más para conectar dispositivos periféricos a un controlador o CPU que para transferir datos entre sistemas. USB es otra interfaz que las personas parecen querer tratar como un sistema de comunicación, que de hecho es un bus de conexión periférico.
La comunicación entre sistemas no es exactamente como conectar un dispositivo a un bus. La conexión de bus permite que el procesador golpee directamente los registros en un dispositivo, mientras que una interfaz de comunicación le permite enviar / recibir flujos de datos. Un dispositivo conectado en un bus generalmente necesita un controlador de dispositivo, mientras que con las comunicaciones, realmente no importa lo que esté conectado en el otro extremo, en lo que respecta a la computadora host.
Por supuesto, esto se está convirtiendo en un límite más peligroso todo el tiempo. Cosas como PCI e ISA son indiscutiblemente autobuses; I2C, SPI, USB son posiblemente buses; mientras que RS232, RS485 y ethernet son definitivamente interfaces de comunicaciones. Pero luego hay cosas como el bus CAN y 1553, que definitivamente se trata de mover datos, pero de una manera muy complicada.
fuente
No hay una única forma de enviar datos, hay muchas formas diferentes de comunicarse según la distancia, la velocidad de datos, el entorno, la aplicación ...
La capa más baja es la capa física , que en realidad mueve los bits.
SPI e I²C son para distancias cortas dentro de un dispositivo, donde no hay mucho ruido que pueda perturbar la transmisión.
Para una comunicación no demasiado rápida en distancias de hasta algunas decenas de metros, la comunicación en serie a través de RS-232 es una buena opción.
Si hay más ruido o se usan señales diferenciales de mayor distancia, por ejemplo en RS-485. Para una transmisión de datos más rápida, existe Ethernet, que se está volviendo cada vez más popular.
Luego también hay varios estándares inalámbricos.
Además de la capa física, hay más capas que organizan cómo se envían los datos, para detectar y corregir errores en la transmisión, enrutamiento en una red y muchas otras cosas. Por ejemplo, el protocolo de Internet es una pila bastante compleja de varias capas, generalmente por encima del protocolo Ethernet.
fuente
Se puede usar un UART serial simple (una línea Tx y una línea Rx sin reloj discreto) y se puede adaptar fácilmente para cruzar entre diferentes potenciales (incluso circuitos primarios y secundarios) con optoaisladores o aisladores magnéticos .
En cuanto a los protocolos, cualquier cosa con bytes de comando definidos y algún tipo de esquema de suma de verificación funcionará bien. Realmente no hay un protocolo estándar de cobertura que se adapte a todos los tipos de comunicaciones. I2C tiene estándares de señalización (definición de direccionamiento, paradas, inicios, etc.), pero el protocolo de lo que realmente se está comunicando depende exclusivamente del desarrollador.
PMBus , por ejemplo, es un protocolo de comunicación de fuente de alimentación que utiliza I2C como medio físico.
fuente
Realmente no hay un protocolo "general", lo que terminas usando depende en gran medida de la aplicación. Para que podamos darle una mejor respuesta, necesitamos entender sus requisitos un poco mejor. Usted menciona que le gustaría tener microcontroladores separados que se comuniquen entre sí como subsistemas.
Algunas preguntas sobre esta aplicación:
Si respondió NO a la pregunta 1:
Si solo hay 2 micrcocontroladores en este proyecto, definitivamente puede usar UART entre ellos. Si ambos necesitan iniciar la comunicación, use el control de flujo, de lo contrario, debería ser trivial enviar datos en una dirección. En su mayor parte, debe ser "lo suficientemente rápido" dado que selecciona una de las velocidades de transmisión más altas. I2C y SPI generalmente solo son buenos para la arquitectura maestro / esclavo.
Si respondió SÍ (más de 2 controladores) a la pregunta 1:
Entonces, ahora necesita algo más escalable donde pueda colocar dispositivos direccionables en un bus común. La respuesta a estas preguntas de seguimiento lo ayudará a decidir entre I2C y SPI (maestro-esclavo) o algo así como CAN (multi-maestro).
Lo más probable es que su microcontrolador tenga un periférico UART, los otros (especialmente CAN) solo pueden estar disponibles en chips de gama más alta. En cualquier caso, debería haber mucha documentación sobre cómo usar estos periféricos para mover bytes.
fuente
Como señaló @Jon, un problema al seleccionar una interfaz de comunicaciones es si una entidad siempre será responsable de iniciar las comunicaciones o si más de una entidad puede ser tan responsable. Una cuestión relacionada es si una entidad siempre estará lista para recibir comunicaciones no solicitadas. SPI se usa con frecuencia en aplicaciones donde un lado siempre estará listo para recibir comunicación. Algo así como un registro de desplazamiento 74HC595, por ejemplo, nunca está "ocupado". Si bien SPI es bueno para la comunicación entre un microcontrolador y un hardware que el micro debe controlar, en realidad no es bueno para la comunicación entre dos microcontroladores. Cuando dos procesadores con hardware I2C lo usan para comunicarse, el software puede tardar todo el tiempo que quiera (dentro de limitaciones muy generosas) para lidiar con lo que está sucediendo, sin causar pérdida de datos. Si un procesador tomara 100 microsegundos para procesar cada byte entrante, eso limitaría severamente el rendimiento, pero el emisor reduciría la velocidad lo suficiente como para que el receptor pueda mantener el ritmo. La única forma en que generalmente puede suceder con SPI es si uno tiene un cable separado para el apretón de manos.
I2C es realmente un protocolo maravilloso. Las mayores limitaciones que impiden que sea el protocolo más perfecto imaginable son
Personalmente, me gustaría ver que los vendedores de controladores admitan una variante de tres hilos de SPI que incluye el apretón de manos. Sin embargo, no conozco ningún controlador que lo haga.
fuente
Sin ningún orden en particular, las instancias de capa física más populares para 2 CPU en la misma caja parecen ser:
Estas instancias de capa física (así como otras instancias de capa física para 2 CPU en cajas separadas) generalmente proporcionan una secuencia de bytes al software que implementa los niveles más altos del sistema de comunicación.
Los programadores inteligentes escriben el software de tal manera que cuando el tipo de hardware decide arrancar una instancia de capa física y reemplazarla con una instancia de capa física completamente diferente, solo necesitan reescribir algunas funciones para alimentar su flujo de bytes de salida al hardware y leer de nuevo una secuencia de bytes del hardware, y todo el protocolo de nivel superior continúa funcionando sin cambios.
El protocolo para enviar información de una CPU a otra CPU casi siempre implica interpretar el flujo de bytes como una serie de paquetes:
Algunas personas parecen disfrutar creando protocolos totalmente nuevos, personalizados e incompatibles al mezclar (2) uno de los muchos tipos de estructura de encabezado con (3a) uno de los muchos tipos de datos de serialización con (3b) uno de los muchos tipos de escapar de esos datos serializados con (4) uno de los muchos tipos de tráiler.
Algunos de los protocolos más simples para encapsular datos en un paquete incluyen:
Los protocolos ligeramente más complicados para encapsular datos en un paquete incluyen:
Hay una larga lista de protocolos en
Puede disfrutar leyendo "Folklore de diseño de protocolo" de Radia Perlman, que describe cómo puede fallar el diseño de protocolo.
fuente
No hay un protocolo 'general' único. La elección puede (por ejemplo) depender de:
En muchos casos, debe distinguir la capa física (niveles de señal) de la capa de enlace de datos (+/- la forma en que se codifican los datos) (verifique el modelo OSI, capas inferiores de 2 ..4). Las posibles capas físicas son, por ejemplo:
Puede usar una línea para transportar datos e información del reloj, o dividir esto en varias líneas. Este último solía ser popular, pero hoy en día la mayoría de los protocolos nuevos / rápidos tienden a usar una línea (o un par de líneas que actúan como una sola).
Hay muchas maneras de codificar datos y reloj en una línea. RS232 usa tradicionalmente NRZ, hay codificación de Machester y los diversos usos de formato en discos duros con curiosos nombres de la línea 2.7 RLL.
En resumen: hay miles de millones de formas de comunicación entre sistemas. Y ni siquiera he mencionado conectores o aspectos de nivel superior como detección y recuperación de errores, codificación de datos, compresión y encriptación ...
fuente