multiplexación UART

2

Me gustaría conectar el puerto serie del hardware de mi microcontrolador principal a dos (o más) dispositivos al mismo tiempo. Mi entendimiento es que UART en mis microcontroladores se basa en un TTL de 5 V bajo activo.

(Sé que lo que estoy explicando aquí puede lograrse técnicamente mediante el uso de mejores protocolos como SPI y I 2 C, pero mi proyecto requiere que solo se implemente utilizando UART.)

Aquí hay un gráfico pseudo-esquemático de lo que estoy tratando de lograr:

simular este circuito : esquema creado usando CircuitLab

Tenga en cuenta que:

  1. No no quiero utilizar una segunda interfaz UART en el maestro, o cualquiera de los esclavos.

  2. Solo un esclavo a la vez transmitirá o enviará los datos de la línea al maestro. (por ejemplo, si el esclavo 1 está transmitiendo datos, el esclavo 2 y 3 deberían permanecer inactivos).

  3. Cualquier cosa que el maestro transmita puede y debe ser recibida por todos los esclavos.

  4. Cada esclavo debe ser enchufable en caliente, lo que significa que se pueden quitar o insertar en cualquier momento.

  5. Los cables RX y TX al maestro son paralelos entre cada esclavo, por lo que no hay conexión en cadena.

Por lo tanto, mis preguntas son las siguientes:

  1. Suponiendo que se considera la impedancia correcta, no debería necesitar un circuito adicional para transmitir datos desde la línea TX del maestro a ninguna de las líneas RX del esclavo simultaneamente. ¿Es correcto?

  2. Entiendo que sin las resistencias limitantes actuales entre la línea TX de los esclavos y la línea RX del maestro, si alguno de los dispositivos comienza a transmitir datos, la línea Entre los dispositivos habrá cortocircuito y me arriesgo a dañarlos. ¿Es correcto?

  3. Suponiendo que los elementos 1 y 2 son correctos:

    a) ¿Debería ser suficiente usar solo algunas resistencias limitadoras actuales?

    b) ¿Puedo usar puertas lógicas de la serie 74 en lugar de resistencias?

  4. Entre las opciones a y b arriba, ¿qué ruta debo elegir?

  5. Para una conexión confiable de 115200 baudios , ¿será suficiente la frecuencia de conmutación de un 74HC08 AND compuerta para ser incorporada?

EDITAR: Soy muy consciente de otros protocolos adecuados como SPI y I 2 C. Hay una razón por la que estoy usando UART, y es porque el gestor de arranque optiboot que mi maestro usa se comunica a través de UART, aunque sea UART s obvias limitaciones.

Además, aunque el encadenamiento en margarita es ciertamente un enfoque inteligente, al infringir la regla 4, también rompe la funcionalidad del cargador de arranque Arduino.

Los dispositivos también podrían ser chips USB a serie, y no sería factible usar SPI a USB o I2C a USB en este proyecto.

Por lo tanto, te agradecería si pudieras concentrarte en las 6 preguntas enumeradas aquí y compartir tu conocimiento de UART. :)

    
pregunta DRS David Soft

6 respuestas

3
  1. Para tres dispositivos no, para más, verifique la hoja de datos con respecto a la capacitancia de entrada.
  2. No es muy peligroso, pero ciertamente no funcionará
  3. a) No b) sí. Con pocos esclavos, sería mejor con cableado Y (se necesitan medias conexiones) si sus esclavos no están en el mismo tablero.
  4. Obviamente, el que trabaja, b
  5. Editado para dar algunos detalles

2 y 3a, incluso si ignora la recomendación de "no conectar dos salidas juntas" todos están de acuerdo, el resultado de dos unos y un cero nunca será cero para las salidas de cmos con características casi simétricas.

3b Usted tiene un cable de cada esclavo a una entrada N (configuración en forma de estrella) o en cada esclavo tiene un AND desde su salida y la cadena y usa la salida Y para la siguiente entrada de la cadena de esclavos.

simular este circuito : esquema creado usando CircuitLab

Obviamente, la configuración de la cadena no es de conexión en caliente.

Con cable Y, tienes dos opciones dependiendo de las capacidades del esclavo.

Si tiene salidas abiertas de drenaje / colector para TX, entonces puede conectarlas y agregar una resistencia de pull-up global.

Si no, entonces un diodo en cada esclavo actuará como cableado y de la siguiente manera:

simular este circuito

También tiene una tercera opción, simplemente para poner la salida de Tx del esclavo en HiZ después de responder a un mensaje, aún se necesita una resistencia de recuperación.

    
respondido por el Dorian
5

¿Estás casado con UART? SPI manejaría esto mejor, creo. La selección de esclavos le daría la multiplexación y usted podría priorizar un esclavo más que el otro en función de lo que el maestro esté haciendo o esperando de los esclavos. La velocidad debe ser al menos tan rápida si no más rápida que la UART. Este ejemplo se acerca a la idea.

    
respondido por el Brett K Smith
2

Tienes que asegurarte de que no se transmitan al mismo tiempo. Por ejemplo, por el maestro encuestando a los esclavos.

Use diodos para conectar varios TXD juntos, levante R en el maestro. Solo puede usar el firmware si lo desea y puede girar la TXD para ingresar cuando no se transmite también, pero los diodos son más fáciles.

Todos los RXD solo se pueden conectar.

    
respondido por el Henry Crun
2

Para la línea que es manejada por el maestro y recibida por los esclavos, no se requiere nada particularmente sofisticado si la carga capacitiva no es un problema.

Para la línea que es accionada por esclavos, sugeriría que si la carga capacitiva no fuera un problema, conecte la línea de transmisión de cada esclavo al bus a través de una resistencia en serie, y luego configure el pin de TX de cada estado para que flote cuando está inactivo. Haga que la resistencia sea tan baja como sea posible sin permitir que fluya un nivel de corriente inaceptable o perjudicial en caso de conflicto de bus.

Si la resistencia en serie requerida para prevenir daños, combinada con la capacitancia parásita, limitaría las velocidades a ser inaceptablemente lentas, entonces sugeriría usar un enfoque basado en la corriente donde los esclavos originan la corriente si quieren transmitir. Algo como:

simular este circuito : esquema creado usando CircuitLab

La mitad izquierda es el transmisor, y la mitad derecha es el receptor. Tenga en cuenta que si se omite el diodo Schottky (o si se sustituye un diodo no Schottky), el circuito del receptor no funcionará tan bien, ya que Q2 se saturará y tardará un tiempo en salir. Agregar el diodo Schottky evitará que el Q2 se encienda completamente, lo que permitirá que se apague más rápido.

    
respondido por el supercat
1

Como sugerencia práctica, eche un vistazo a I2C: usa la misma cantidad de cables que un UART, tiene una tasa de datos similar e implementa la funcionalidad de bus que necesita, además tendrá bibliotecas de software ya escritas para usted.

Otro protocolo que es aún más similar a lo que estás tratando de hacer es LIN, que es básicamente un bus basado en UART con un voltaje de señal más alto. Si tiene 12V disponibles, simplemente puede conectar los transceptores LIN en su diagrama entre cada nodo y el bus, y funcionará. Sin embargo, tendrías que escribir tu propio software.

Editar: también puedes implementar pseudo-LIN con tus propios niveles de voltaje, por ejemplo. 5V. Por ejemplo:

simular este circuito : esquema creado usando CircuitLab

    
respondido por el Dmitry Grigoryev
1

Si desea mantener un puerto UART, puede simplemente encadenarlos (la salida de un UART va a la entrada de otro). Con este enfoque, no necesita ningún hardware adicional, pero necesita agregar código para reenviar la comunicación de un Arduino al siguiente.

EDITAR Me faltó el requisito de intercambio en caliente, por lo que esto no podía funcionar. Pero si puede garantizar que no se intercambiará en medio de la comunicación o si puede tolerar la pérdida de algunos paquetes, entonces puede ubicarse en un lugar corto donde coloque uno de la interfaz UART de Arduino y, después del intercambio, eliminará el funcionamiento normal.

    
respondido por el Rokta

Lea otras preguntas en las etiquetas