Cómo obtener más de una interfaz uart


30

Ok, tengo una interfaz uart (TXD GPIO 14, RXD GPIO 15). Quiero al menos una interfaz uart más.

Soluciones posibles:

  • Golpeteo de bits: utilice dos GPIO de repuesto no relacionados. Entiendo que el tiempo es un problema en un Linux estándar. ¿Sería confiable con una velocidad de transmisión muy baja?

  • Cambio: RPI decide cuándo hablar con qué dispositivo. Utilizando, por ejemplo, CD4066BC .

  • spi a 2 x puente uart: no se encontró una pieza adecuada (disponibilidad, precio, paquete dil)

  • usb a uart: caro

¿Hay otras opciones? Me inclino a cambiar, si se puede hacer. ¿Qué me aconsejarías?


Respuestas:


10

Un USB UART, como FTDI, no es realmente costoso. Parece que todas las demás opciones le costarán más en partes y tiempo que los ~ $ 13 que podría costarle, y no son confiables o lentas. Simplemente elija la opción rápida y sin problemas, como:

http://www.dfrobot.com/index.php?route=product/product&product_id=147#.UOamLG-sh8E

Sparkfun también vende uno. De hecho, tal vez puedas sacar uno de algún dispositivo USB viejo o comprar uno en una tienda de basura que no sabe lo que hace.

Me metí con un adaptador SPI a UART para un proyecto Arduino, no había una biblioteca existente, así que escribí la mía. Al final funcionó bien, pero si hubiera podido caer en una parte de $ 15 lo habría hecho. De hecho, dado el tiempo que me costó, debería haber conseguido un mega con 4 puertos seriales.

Alternativamente, si desea muchos puertos en serie, puede mirar en serie RS485, que es similar a 232 (aunque no compatible), que admite multipunto, es decir, varias interfaces en una línea.


1
Esta también es una opción fácil desde el punto de vista del software. FTDI tiene soporte para controladores Linux listo para usar. Todas las demás opciones requerirán un trabajo minucioso del conductor.
Ber

El cp2102 es mi chip usb uart favorito. ¡Una búsqueda rápida en Amazon los revela por $ 6.99 (editar en realidad $ 1.50) con un cable incluido! No se puede superar eso!
portforwardpodcast

6

Si decide omitir la adición de hardware adicional y simplemente seguir la ruta de bit bitging, esto no es tan difícil como algunos lo imaginan.

En primer lugar, su hilo de comunicación debe ir en tiempo real:

#include<sched.h>

struct sched_param param;               
param.sched_priority = sched_get_priority_max(SCHED_FIFO);
if( sched_setscheduler( 0, SCHED_FIFO, &param ) == -1 )
{
        perror("sched_setscheduler");
        return -1;
}

De ahora en adelante, su subproceso no se adelantará durante 950 ms de cada segundo * , a menos que devuelva el control voluntariamente (a través sched_yield()o usleep()) de manera oportuna, lo que no lo dejará nunca. Con una CPU de 850MHz, su bucle de bits se ejecutará inactivo la mayor parte del tiempo, incluso a las velocidades más rápidas.

Ahora, desafortunadamente, el requisito de devolver el control de vez en cuando significa que mientras su hilo está dormido, lo que sea que envíe su "parte opuesta", se perdería para siempre. Pero para ese propósito, podría usar el control de transmisión. Asigne un poco más de GPIO para la línea CTS que extraiga antes de ceder y retroceda al restaurar el control:

  bcm2835_gpio_write(CTS_PIN, LOW);
  usleep(10);
  bcm2835_gpio_write(CTS_PIN, HIGH);

o (en mi humilde opinión preferiblemente) use el control de transmisión XON / XOFF: envíe el carácter XOFF a través de RS232 antes de dormir, XON después de reanudar la operación. Los códigos ASCII predeterminados para estos son '\x13'para XOFF / "detener el envío" y '\x11'para XON / "reanudar el envío".

Por supuesto, su dispositivo remoto debe obedecerlos. Si no es así, se perderán algunos datos.


4

Encontré lo que estaba buscando: un esclavo I2C / SPI para el puente UART / IrDA / GPIO.

Vienen en versión simple y doble (por lo tanto, 1 o 2 UART adicionales). Ellos (NXP) también (para el otro lado en caso de ser necesario) tienen maestro I2C / SPI para puentes UART / IrDA / GPIO.

Puede encontrar más información sobre estos chips aquí y la contraparte maestra .

Maxim también tiene chips que hacen exactamente lo mismo.


Buena información, pero los enlaces NXP dan HTTP 403 aquí.
Tom

Aquí está la hoja de datos relevante: nxp.com/documents/data_sheet/SC16IS752_SC16IS762.pdf ?
Tom

3

Los puentes USB a UART son baratos y fácilmente disponibles, pero tienen características de temporización realmente pésimas. Newark vende una placa "Embedded Pi" que tiene un procesador ARM STM32F en el que puede escribir código simple. Ese chip tiene tres UART y creo que pueden ir bastante rápido; si usara uno para comunicarse con Raspberry Pi, dejaría dos disponibles para otros fines. Descargo de responsabilidad: he comprado una de estas placas, pero todavía he utilizado la Raspberry Pi para manejar las necesidades de E / S directamente.

Si desea muchos UART más lentos, el STM32F en la placa Embedded Pi probablemente podría manejar un número justo, especialmente si está dispuesto a escribir algo de lenguaje ensamblador Arm. Si hay dos grupos de 16 pines de E / S disponibles en una sola placa, es posible tener 16 UART de software simultáneos trabajando todos a la vez a una velocidad de transmisión bastante buena (tenga una interrupción periódica a 3x o 5x la velocidad de transmisión que almacena Valores bloqueados de 16 bits desde el puerto de recepción a un búfer, y genera valores precalculados de 16 bits desde un búfer al puerto de transmisión; si hace esto, el tiempo promedio de servicio para los UART de software no es demasiado grande, no importará si hay un golpe ocasional en el peor de los casos (por ejemplo, los dieciséis puertos que reciben un byte simultáneamente).

Este enfoque en realidad puede funcionar de manera notablemente eficiente para recibir, ya que el código de "caso común" ni siquiera tiene que mirar los UART individuales. Suponga que está muestreando datos a 5x, y los últimos 47 bytes del búfer se duplican inmediatamente antes. Suponiendo que los datos se escriben en el búfer en orden ascendente, puede verificar si algún byte se ha recibido completamente en cualquiera de los 16 canales simplemente diciendo:

bytes_ready = (armed_flag & data[rxptr] & ~data[rxptr-47] & ~data[rxptr-46] & ~data[rxptr-45] & ~data[rx_ptr-44]);

Si bytes_readyes cero, no se han recibido datos. De lo contrario, si, por ejemplo, se establece el bit 2 de bytes_ready, eso significa que se puede encontrar un byte de datos recibido en el bit 2 de datos [rx_ptr-40], datos [rx_ptr-35], datos [rx_ptr-30], etc. Una vez que uno toma los datos, borre el bit 2 de arm_flag y haga arreglos para que se restablezca después de aproximadamente 44 muestras.

Este enfoque requerirá un poco de trabajo en aquellas muestras en las que se recibe un byte de datos (y potencialmente mucho trabajo si los 16 canales tienen un byte de datos que llegan de una vez), pero en la mayoría de las muestras la cantidad de trabajo será muy leve. Si uno tuviera 64 pines de E / S, uno podría manejar hasta 32 UART usando este enfoque sin agregar ningún trabajo adicional al caso "común".


1

Un microcontrolador como un Picaxe podría tomar datos en serie en un pin y generar datos en serie en un pin determinado de manera adecuada. Esto efectivamente le daría más salidas en serie si estuviera preparado para tener que decirle al Picaxe en qué pin debe emitir. También podría hacer lo mismo, pero a la inversa, por lo que podría recibir datos en serie de múltiples dispositivos y enviarlos a la Raspberry Pi. Otra opción podría ser hacer que los dispositivos conectados requieran un calificador . Esto significa que el dispositivo 1 tendría que recibir los datos 'd1', por ejemplo, antes de escuchar más datos en la línea serie. El dispositivo 2 podría tener 'd2' como calificador. Esto significaría que para saludar al Dispositivo 1, solo tendría que enviar 'd1hello' en la línea UART.

Los picaxis son bastante baratos, puede obtenerlos en http://www.techsupplies.co.uk/ y vienen en numerosos tamaños con diferentes números de alfileres, etc.


1

Si la comunicación con los diversos dispositivos esclavos UART no necesita realizarse en paralelo, puede compartir el único puerto UART disponible entre ellos. Puede usar transistores para habilitar solo las conexiones RxD / TxD al dispositivo con el que desea hablar actualmente. Estos transistores pueden ser controlados por otros pines Raspberry Pi GPIO.




0

Estoy usando SC16IS752 IC, que es un convertidor SPI a 2xUART. Funciona bien con Raspbian Stretch.

Es un poco más caro que el chip FTDI, pero hay dos uarts y no tengo que usar un precioso puerto USB.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.