Comunicación simple de bajo costo entre dos microcontroladores

2

¿Qué compensaciones y opciones de conexión hay en la comunicación bidireccional a bajo costo entre solo dos microcontroladores?

En este caso:

  • Relación maestro / esclavo, flujo de datos bidireccional
  • Distancia debajo de una pulgada
  • El esclavo se conecta al maestro (por lo que la protección ESD en las conexiones es una necesidad).
  • El micro esclavo es bastante tonto, pero se necesitan datos de velocidad media para bloquear la E / S desde una tarjeta SD. Aparte de la tarjeta SD, hay un poco de E / S de baja velocidad en la unidad esclava donde la velocidad no es un problema.
  • Barato barato barato.
  • El recuento de pines está restringido.
  • Prefiere una sobrecarga mínima de protocolo.

Las opciones obvias incluyen SPI, CAN, USB, TTL Level Serial. I2C y 1-Wire son probablemente demasiado lentos. Debido al problema de la cantidad de pines, la modulación de la fuente de alimentación para los datos sería ideal, si hubiera un conjunto de chips de nivel de consumidor que lo hiciera, guardar dos pines sobre los métodos en serie.     

pregunta Bryce

6 respuestas

13

Dadas tus opciones disponibles, parece que tienes tienes algunos pines disponibles:

  • SPI es dúplex completo y requiere 1 reloj + 1 datos en cada dirección + 1 selección de chip opcional = 3 pines
  • CAN es semidúplex y requiere 2 datos para comunicaciones bidireccionales = 2 pines
  • El USB es half-duplex y requiere 2 datos para comunicaciones bidireccionales = 2 pines
  • TTL Serial es lo que quieras, pero la mayoría de la gente usa un UART para ello, requiere 1 datos en cada dirección = 2 pines dúplex completo o 1 pin con algunos trucos
  • UART es dúplex completo y requiere 1 datos por cada dirección = 2 pines o 1 pin con algún truco
  • I2C es semidúplex y requiere 1 reloj + 1 datos = 2 pines

Por lo tanto, parece que el consenso es de 2 pines si desea comunicación bidireccional, o posiblemente 3 para SPI. Dado el mismo número de pines, apostaría por el UART si hubiera uno disponible en ambos chips. Suponiendo que se trata de una conexión 1: 1, solo puede intercambiar datos sin tener en cuenta el tiempo ni las colisiones, y el hardware es realmente sencillo.

En cuanto a la sobrecarga de la pila, hay muchos protocolos diferentes que pueden operar desde un UART, pero probablemente sea mejor en este caso definir el suyo. Desde la perspectiva de las comunicaciones, solo estás expulsando bytes y recibiéndolos en el otro extremo. El hardware se sincronizará automáticamente con cada byte, pero aún debe saber qué byte es qué. Tendrás ese problema independientemente de la opción que elijas.

Si eres listo con un UART (y estoy a punto de darte la respuesta), puedes conectar los dos pines TX junto con dos resistencias en serie, luego tienes un comparador en cada extremo que impulsa el pin RX basado en el TX local y la toma central de los dos resistores. Esto permite full-duplex en un cable. Vea a continuación un esquema.

Para ESD, agregue una resistencia en serie dentro de ambos casos para cada pin y coloque algunos diodos de sujeción en el lado exterior de la resistencia. Hay diodos especialmente diseñados para esto.

simular este circuito : esquema creado usando CircuitLab

  • Las resistencias "bajas" son para proteger los diodos ESD. Las hojas de datos pueden o no afirmar que son innecesarias, pero las usaría de todos modos. Hazlos lo suficientemente grandes para hacer su trabajo; tienen que parecer un corto en comparación con las resistencias "altas".
  • Las resistencias "altas" mezclan las dos señales de TX en el cable común.
  • Los resistores de 10k y 5k deben tomar la señal de TX de rango de suministro completo y proporcionar el umbral apropiado para los comparadores.
  • Si los dos dispositivos se alimentan de manera independiente, probablemente no debería tener la "Conexión opcional", dejándole con 2 cables en lugar de 3. No veo cómo puede comunicarse con menos pines que esto, a menos que vas de forma inalámbrica.

Así es como funciona:

  • Si ambos TX son altos, la línea común será alta y ambos comparadores darán un alto.
  • Si ambos TX son bajos, la línea común será baja y ambos comparadores darán un resultado bajo.
  • Si un TX es alto y el otro bajo, la línea común será de rango medio y cada comparador tendrá un umbral diferente basado en su TX local. Por lo tanto, el que tenga un TX alto tendrá un umbral más alto que el común de rango medio y tendrá una salida baja, y el que tenga un TX bajo tendrá un umbral más bajo que el común de rango medio y tendrá una salida alta.

Por lo tanto, en todos los casos, la salida del comparador de recepción es igual al TX de envío.

Si no le gusta la complejidad del hardware dentro de la caja, puede usar un pin discreto para cada dirección y mantener solo las resistencias "alta" y "baja" y los diodos ESD, una copia por separado para cada pin.

    
respondido por el AaronD
5

Nunca he usado CAN bus, así que no puedo comentar sobre eso. Lo que deja SPI, I2C, TTL serial y USB.

La serie TTL generalmente tiene una velocidad de 115.200 baudios, pero muchos microcontroladores pueden ejecutarlo a 1 Mb / s o más. Tendrás que revisar las hojas de datos de tu microcontrolador y ver si puedes ejecutarlo tan rápido. Obviamente ambos extremos deben coincidir. La ventaja de la serie TTL es que solo requiere dos cables.

I2C originalmente estaba limitado a 100 Kb / s, luego a 400 Kb / s. El último estándar es 1 Mb / s. Pero es posible que su microcontrolador pueda ser más alto que eso. De nuevo, revisa tus hojas de datos. Al igual que la serie TTL, I2C solo requiere dos cables.

SPI es una raza completamente diferente. Teóricamente, puede funcionar hasta 50 Mb / s más o menos. He ejecutado una con una tarjeta SD en un producto comercial a 25 Mb / s sin ningún problema. El inconveniente es que la interfaz SPI requiere cuatro cables. En realidad, con solo un esclavo en el bus, no necesita la línea de selección de chip a menos que lo requiera la interfaz de hardware. Si solo está enviando datos al esclavo, también podría deshacerse de la línea MISO, si el microcontrolador le permite reasignarlo como un pin GPIO. En el caso de que tengas dos cables, como los otros.

La sobrecarga de firmware para los tres primeros es mínima; La serie TTL es probablemente la más simple. I2C y SPI son casi iguales.

Puede olvidarse de USB, aunque potencialmente es el más rápido si ejecuta USB 2.0. (USB 1.1 es solo de 12 Mb / s, por lo que ni siquiera se compara favorablemente con SPI en cuanto a velocidad). El primer problema con USB es que necesita implementar un host en un lado y un esclavo en el otro. Esto requiere microcontroladores que tengan las interfaces, y las interfaces de host USB generalmente solo se encuentran en chips de alta calidad, luego se requiere el firmware. Varios kb de firmware. Una buena noticia es que generalmente puede obtener una biblioteca del fabricante. La mala noticia es que aún te llevará semanas para que funcione.

Tendrá que proporcionar su única protección ESD en las interfaces. Hay muchos chips baratos que realizan esta función, como la TPD4E1B06 para 61ȼ en Digi-Key .

    
respondido por el tcrosley
1

¿Has considerado UART? Para la comunicación unidireccional, solo se necesita un cable. Si va a enviar grandes porciones de datos, puede ser inteligente y hacer que el cable único se alterne entre TX y RX de acuerdo con algunas reglas inventadas. Puede crear su propio protocolo para manejar la corrección de errores, la contención del bus, etc. Lo bueno es que incluso las MCU más baratas tendrán un UART incorporado (no se puede decir lo mismo de USB o CAN).

Si observa, probablemente pueda encontrar esquemas de modulación de la fuente de alimentación, pero sus datos probablemente serán mucho más lentos.

    
respondido por el Zulu
0

Según su declaración "Debido a que la cantidad de pines modulando la fuente de alimentación para los datos sería ideal, si hubiera un conjunto de chips de nivel de consumidor que lo hiciera, guardando dos pines sobre los métodos en serie", suena como 1-cable las comunicaciones, sin embargo, proporcionan datos de baja velocidad y usted no indica cuál podría ser su requisito de velocidad ser.

    
respondido por el Kvegaoro
0

No veo mucho sentido en un sistema maestro / esclavo con solo dos µC que ambos están programados por ti mismo.

El pinout más pequeño que puedes obtener es probablemente UART (2pins). Ya que estás programando ambos µC, puedes elegir una velocidad arbitraria. Un AVR µC podría ejecutar UART a 1Mbps, y suponiendo que elija 1 bit de parada, sin paridad y 9 bits de datos, puede obtener un 82% de utilización de ancho de banda.

Siempre puedes usar un protocolo personalizado similar a 1-Wire (pero mucho más rápido). Sin embargo, este es un enfoque bastante tonto ya que consumiría toda su capacidad de procesamiento para mantener el protocolo.

    
respondido por el user68591
0

TLDR: no es particularmente barato pero se ajusta de manera confiable en algunos casos de uso.

Mirando fuera de la caja, podría haber algunas otras soluciones aquí, como seguir el chip que encontré últimamente. Por supuesto, todo depende de lo que quieras hacer. Algo así como UART viene a la mente si tiene ambos MCU en la misma placa o incluso planea protegerlos contra ESD manualmente si están separados.

Maestro y Solución El dispositivo para IO-Link Aplicaciones

L6360   Master
L6362A  Device

¿Cuándo consideraría una solución como esta:

  1. Los chips de la frontera están totalmente protegidos, lo que sería importante si tiene cada MCU en una placa separada y se ocupa de los pines expuestos, por ejemplo. terminal de tornillo.
    • polaridad inversa
    • Sobrecarga con función de corte
    • Sobretemperatura
    • Subtensión y sobretensión
    • Cable abierto GND y VCC
  2. Interoperabilidad. Si alguien más va a diseñar el otro lado, todo lo que necesita saber es canalizar los datos a través de IO-Link.
  3. regulador integrado Vcc(in) 7~30v, Vdd(out) 3.3/5v

Me sonó interesante, así que pensé que lo pondría allí.

    
respondido por el Mehrad

Lea otras preguntas en las etiquetas