¿Comunicación entre microcontroladores - I2C, SPI, UART?

4

Básicamente tengo dos microcontroladores que necesito para comunicarme.

Ambos controladores envían y reciben datos.

Idea básica que tengo:

  1. I2C, SPI - Lo que creo que NO podemos usar estos protocolos en este caso. Porque ambos son protocolos basados en el esclavo maestro. Entonces, si un controlador está configurado como maestro y otro como esclavo, en ese caso si el uC esclavo quiere transmitir datos, entonces no puede iniciar la transmisión y tampoco está permitido generar el reloj.

  2. UART: supongo que esto debería funcionar ya que es asíncrono. Así que nadie está obligado a ser esclavo o amo.

Mi pregunta es, si las suposiciones anteriores son correctas? Si no , por favor corríjame.

    
pregunta Virendra Kumar

3 respuestas

4

Sus suposiciones son correctas, sí. SPI y I2C son normalmente protocolos maestro / esclavo, aunque hay formas de "doblarlos" para poder trabajar de cualquier manera.

Pero por simplicidad, sí, UART es probablemente la más fácil y la más sensata.

    
respondido por el Majenko
4

Si esto es para su propia configuración, entonces lo único que importa es la consistencia. Tú controlas todo, así que depende de ti. Puede utilizar un protocolo estándar, o crear uno propio, o modificar uno para satisfacer sus necesidades . Si ya tiene un bus como I2C o SPI en uso, también puede continuar usándolo.

Dicho esto, si bien I2C y SPI son protocolos maestro-esclavo, esto puede solucionarse fácilmente mediante el uso de un pin de interrupción / señal. Si el esclavo quiere hablar con el maestro, alterna el pin de interrupción y el maestro inicia una sesión I2C / SPI. O el sondeo.

En cuanto a generar el reloj, a menos que tenga una necesidad específica de que ambos microcontroladores hagan eso, ¿para qué molestarse? ¿Necesitas correr uno a una velocidad diferente? Elija una velocidad de reloj antes de tiempo y apéguese a ella en su implementación.

    
respondido por el Passerby
1

A los dispositivos en un bus I²C no se les asignan roles predeterminados de maestro y esclavo: un dispositivo es un maestro si actualmente está controlando una transacción con un esclavo, o está tratando activamente de hacerlo. Un dispositivo es un esclavo si tiene una dirección de esclavo y se está comunicando con un maestro o está escuchando a maestros. Otros dispositivos en el bus están simplemente inactivos.

I²C admite múltiples maestros y múltiples esclavos. Si tiene varios dispositivos que necesitan poder enviar o recibir datos a voluntad, asigne una dirección de esclavo a cada uno de ellos y programe que asuman el rol de maestro cuando necesitan transmitir o solicitar datos.

Si hay varios maestros presentes, los maestros se turnan: antes de iniciar una transacción, los maestros esperan a que finalice la transacción actual, si existe. Si varios maestros comienzan una transacción al mismo tiempo, el primero en advertir que el bus no se encuentra en el estado que desea retroceder (esto se conoce como arbitraje).

En resumen, lo que quieres ciertamente no es imposible con I²C. Sin embargo, implementar I²C es un poco molesto y es probable que sea excesivo para solo dos microcontroladores que intentan comunicarse entre sí. Elegiría UART en su caso, gracias a su naturaleza simple y flexible.

    
respondido por el jms

Lea otras preguntas en las etiquetas