¿Cuál es el protocolo general para enviar información de un sistema a otro? Por ejemplo, supongamos que tenemos 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 tengo claro cuándo 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? ¿Básicamente está analizando bytes de datos que estoy haciendo en el microcontrolador receptor?
SPI e I2C son algo similares, ya que en realidad 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 la gente parece querer tratar como un sistema de comunicación, que de hecho es un bus de conexión de periféricos.
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 confuso todo el tiempo. Cosas como PCI e ISA son indiscutiblemente buses; Podría decirse que I2C, SPI, USB son buses; mientras que RS232, RS485 y ethernet son definitivamente interfaces de comunicación. Pero luego hay cosas como el bus CAN y 1553, que definitivamente se trata de mover datos, pero de una manera muy complicada.
No hay una única forma de enviar datos, hay muchas formas diferentes de comunicarse dependiendo de 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 a 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 mayor distancia se utilizan señales diferenciales, 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, el enrutamiento en una red y muchas otras cosas. Por ejemplo, el protocolo de Internet es una pila bastante compleja de varias capas, generalmente sobre el protocolo Ethernet.
Se puede usar un UART serial simple (una línea Tx y una 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 lo que respecta 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 existe un protocolo estándar que cubra todo y que se adapte a todos los tipos de comunicaciones. I2C tiene estándares de señalización (que definen el direccionamiento, las paradas, los inicios, etc.), pero el protocolo de lo que realmente se comunica depende únicamente del desarrollador.
PMBus , por ejemplo, es un protocolo de comunicación de fuente de alimentación que utiliza I2C como medio físico.
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 responsable. Un asunto relacionado 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 el hardware que se supone que controla el micro, en realidad no es bueno para la comunicación entre dos microcontroladores. Cuando dos procesadores con hardware I2C lo utilizan para comunicarse, el software puede tardar todo el tiempo que quiera (dentro de unas limitaciones muy generosas) en hacer frente a lo que está pasando. 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 remitente se ralentizaría lo suficiente como para que el receptor se mantuviera al día. La única forma en que generalmente puede suceder con SPI es si uno tiene un cable separado para el protocolo de enlace.
I2C es realmente un protocolo maravilloso. Las mayores limitaciones que le impiden ser el protocolo más perfecto imaginable son
Personalmente, me gustaría ver que los proveedores de controladores admitan una variante de SPI de tres hilos que incluya protocolo de enlace. Sin embargo, no conozco ningún controlador que lo haga.
Realmente no hay un protocolo "general", lo que termine usando depende en gran medida de la aplicación. Para que podamos darle una mejor respuesta, necesitamos entender un poco mejor sus requisitos. 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 microcontroladores 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, debería 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 como CAN (multimaestro).
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, debe haber mucha documentación sobre cómo usar estos periféricos para mover bytes.
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 brindan un flujo 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 encargado del hardware decide eliminar 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 lee una secuencia de bytes del hardware, y todo el protocolo de nivel superior sigue 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 inventando protocolos completamente nuevos, personalizados e incompatibles mezclando y combinando (2) uno de los muchos tipos de estructuras de encabezado con (3a) uno de los muchos tipos de serialización de datos con (3b) uno de los muchos tipos de escapando 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 un poco más complicados para encapsular datos en un paquete incluyen:
Hay una larga lista de protocolos en
Puede disfrutar leyendo "Protocol Design Folklore" de Radia Perlman, que describe cómo el diseño de protocolos puede fallar.
Ningún 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) (consulte el modelo OSI, 2 ..4 capas inferiores). Las posibles capas físicas son, por ejemplo:
Puede usar una línea para transportar datos e información del reloj, o dividirla 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 formas de codificar datos y reloj en una línea. RS232 usa tradicionalmente NRZ, hay codificación Machester, y los varios formatos que usa en discos duros con nombres curiosos línea 2.7 RLL.
Para resumir: hay miles de formas de comunicarse entre sistemas. Y ni siquiera he mencionado los conectores o aspectos de nivel superior como la detección y recuperación de errores, la codificación de datos, la compresión y el cifrado...
estrella azul
O_O
Kortuk
solojeff
darrón
Casey