Comunicaciones en serie a través de un cable de 3 m, compartidas con USB

Estoy diseñando un sistema que necesita hacer comunicaciones en serie a través de un cable USB estándar, así como un USB normal (pero no al mismo tiempo). En otras palabras, cuando se conecta a una PC, aparecerá como un dispositivo USB y cuando se conecta a un sistema integrado, utilizará un protocolo de comunicaciones en serie más simple. El lado USB solo tiene velocidad completa (12 Mb/seg), y las comunicaciones en serie solo necesitan ser de 100 Kb/seg, aunque 1 Mb/seg estaría bien.

El dispositivo independiente utilizará un microcontrolador para las comunicaciones. Tanto el dispositivo como el sistema integrado estarán basados ​​en un microcontrolador, muy probablemente Atmel XMEGA. Una opción sería instalar un dispositivo compatible con USB OTG/host, pero quiero evitar esta complejidad, costo y opciones limitadas de microcontroladores.

Los micros XMEGA tienen periféricos UART y SPI en los mismos pines que USB D+/D-. También podría enrutar I2C desde otros dos pines hacia ellos, y no creo que perjudique la calidad de la señal. Dado que el cable USB solo tiene dos líneas, si usara SPI, sería unidireccional, lo que podría manejar. Sin embargo, I2C bidireccional o 3.3V RS232 estaría bien.

¿Alguien ha probado algo como esto? Estoy un poco preocupado por la capacitancia de un cable USB de 3 m que causa problemas. Ninguno de estos protocolos en serie es diferencial, pero debe hacer frente a los bordes de señal deficientes. Puede obtener controladores de línea para I2C/SPI/TTL-RS232, pero los que he visto parecen interferir con USB cuando no están en uso. Pensándolo bien, I2C sin un controlador de línea podría ser problemático debido a la necesidad de resistencias pull-up.


Después de investigar un poco, me inclino por 3.3V RS232. Podría usar SPI, pero los protocolos síncronos pueden tener problemas con un cable de 3 m a altas velocidades. Si el receptor genera el reloj, habrá algún retraso antes de que el remitente lo vea y llegue la respuesta. Si el remitente genera el reloj, no habrá problema con la demora (ya que los datos se retrasarán en la misma cantidad), pero complica un poco las comunicaciones bidireccionales. La otra desventaja de SPI es la falta de bits de inicio/parada, pero generalmente no es un problema porque puede usar una línea de habilitación para iniciar la comunicación en un punto conocido, pero no tengo suficientes líneas para uno.

Por otra parte, ser cronometrado puede valer la pena el esfuerzo adicional en el lado del protocolo para que sea más robusto con la degradación de la señal. Las resistencias de terminación deberían ayudar a lidiar con los reflejos.

En cualquier caso, debería ser posible una velocidad razonablemente alta. La Sony Playstation usa SPI a 3.3v con un reloj de 500KHz y funciona bien con cables largos. El N64 usa una sola línea de datos aysnc (sin reloj) a alrededor de 333 KHz, nuevamente con cables largos.

Respuestas (2)

Mi consejo es usar un UART y RS485.

Si intenta utilizar cualquier protocolo de señalización no diferencial en un cable tan largo, obtendrá un BER terrible a velocidades de datos útiles. Asíncrono semidúplex diferencial es el camino a seguir.

Sus preocupaciones acerca de compartir el bus con USB son válidas, pero los controladores RS485 pueden (generalmente) ponerse en un modo de alta impedancia que podría estar dispuesto a coexistir con USB.

Buen punto. Significaría agregar un chip de controlador adicional, ya que pocos micros tienen un periférico 485 incorporado, pero podría valer la pena. ¿Realmente crees que es probable que vea errores significativos en más de 3 m? Por ejemplo, la consola de juegos Playstation usa SPI sobre dicho cableado a una velocidad de reloj de alrededor de 100 KHz. Me parece recordar que el N64 también usa seriales no diferenciales a tasas similares. Editar: en realidad, la Playstation usa 500 KHz, señalización de 3.3v, y con cables de extensión puede hacer fácilmente más de 3 m: store.curiousinventor.com/guides/PS2
FTDI hace un cable TTL asíncrono USB, creo que 1,2 m; el adaptador serie USB está en el extremo del enchufe USB, por lo que intenta enviar TTL asíncrono sobre el cable de 1,2 m. A velocidades de datos superiores a 38,4 kbps, tiene una tasa de error muy notable. Los protocolos sincronizados siempre son más confiables que los asíncronos a la misma tasa de bits, por lo que no me sorprende ver 100 kbps con PS y/o N64, pero no creo que sea una opción óptima.
¿Tiene alguna referencia para el tema FTDI? Tenga en cuenta que el N64 usa solo una línea de datos, no tiene reloj y funciona a alrededor de 333 KHz. Creo que el problema de FTDI podría deberse a un cableado deficiente, pero al menos el USB está protegido.
Mi referencia es mi propia experiencia y la de un colega. No es un cableado deficiente, el cable parece ser un cable blindado de calidad razonablemente buena (aunque podría ser la capacitancia del cable). Es porque la señalización no es diferencial, ni siquiera de alto voltaje como RS232. El USB está protegido y es diferencial, por lo que es muy confiable.
De acuerdo, parece que debe haber tenido otros problemas en ese momento, porque hay muchos ejemplos que contradicen su experiencia. Esperaba alguna información sobre ese tipo de cosas.

Esto se ha hecho en muchas aplicaciones, lo que necesita es un mux que enruta los pines de señal a los pines usb del microcontrolador o a los pines de la interfaz serial.

De esta manera, las señales siempre terminan donde deben ir, y los dos buses no pueden interferir entre sí.

En cuanto al protocolo serie, lo mejor es ir con un bus diferencial (USB es diferencial...)

Es posible conseguir serie TTL a pocos metros, ¡pero depende mucho de la velocidad y el cableado!

Como dije, este micro en particular tiene un bus UART y SPI en los mismos pines que el USB, por lo que solo se trata de deshabilitar un periférico y permitir que el otro cambie.