Microcontrolador con más de un puerto serie

3

Tengo un microcontrolador de ATMEL AT89S52 , que solo tiene un puerto serie. Sin embargo, en mi aplicación, el microcontrolador debe conectarse a un lector RFID y también a una tarjeta WiFi a través del puerto serie. Dado que solo tengo un puerto serie y el lector RFID y WIFI necesitan estar allí simultáneamente, no puedo continuar. ¿Hay alguna posibilidad de emular puertos serie usando software? Si es así, ¿cómo?

¿O puede alguien sugerirme una mejor manera de lograr este objetivo (excepto comprar otro controlador con varios puertos serie)?

    
pregunta gpuguy

6 respuestas

3

Sí, puedes implementar un UART en el software. Aquí hay uno en el ensamblaje 8051, que debería funcionar para su microcontrolador. Esta técnica se llama bit banging .

Suponiendo que "serial" quiere decir RS-232 ¹, y suponiendo que está hablando con algo que en realidad quiere RS-232 y no "TTL serial" , aún necesitará un desplazador de nivel RS-232 externo como un MAX232 .

El problema con el software UART es que RS-232 no tiene una línea de reloj separada². Como tal, la comunicación confiable depende de la precisión de tiempo de los dispositivos en ambos extremos de la conexión. Por lo tanto, no desea probar y proporcionar un software UART si el reloj de sus instrucciones no es exacto, como ocurre con muchos osciladores RC internos. El AT89S52 que está utilizando no tiene la opción de un oscilador interno, pero aún necesita asegurarse de que su oscilador externo tenga una precisión del 1% del valor nominal de un UART de software para lograr una comunicación confiable.

Además de eso, para que el tiempo de ciclo de la instrucción central del procesador se divida uniformemente en el tiempo de bit de RS-232, debe seleccionar las frecuencias impares del oscilador. 11.0592 MHz es popular para esto. Otra opción es 14.7456 MHz, como se explica aquí .

La frecuencia de reloj afecta a los bucles de retardo codificados que necesita en un enfoque de bit banging. Eso es lo que el bit DJNZ R0,$ está en el código de ensamblaje al que te señalé: es un bucle de retardo puro, que no hace más que disminuir un contador para reducir el tiempo. En la parte superior del archivo, ve la constante BITTIM , que codifica esta implementación en particular para que su sincronización funcione cuando se usa un reloj de CPU de 11.0592 MHz. Si cambia la frecuencia del reloj, también tiene que cambiar esta constante. Luego, debe probarlo nuevamente con cuidado para asegurarse de que el tiempo sea lo suficientemente bueno. A veces es necesario agregar NOP o instrucciones similares para compensar el tiempo de espera con enfoques de bit banging como este.

Cuanto más baja sea la velocidad de sus datos en serie, más holgura podrá evitar. Por lo tanto, si solo necesita 1,200 bps, es posible que pueda salirse con un oscilador RC interno o una velocidad de reloj de instrucción μC "normal", particularmente si no está transmitiendo o recibiendo continuamente. A la inversa, mi experiencia es que si necesita ejecutar más rápido que 9,600 bps o más, realmente necesita un UART de hardware.

Footnotes

  1. Hay muchas formas diferentes de comunicación en serie . Cuando se usa de forma genérica, el término más a menudo significa RS-232 , pero se basa en las etiquetas definidas aquí en Electronics.SE, I²C , < a href="http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus"> SPI , CAN , y RS-485 son bastante comunes.

    • RS-485 : Creo que todo lo anterior se aplica también a RS-485, así como a su pariente cercano RS-422 .

    • I²C and SPI : incluyen una línea de reloj síncrona, por lo que la mayoría de lo que he escrito anteriormente no se aplica a estos métodos de comunicación. Sin embargo, también es posible implementarlos en software mediante bit banging.

    • CAN bus : no es posible implementar en software, debido a la necesidad de CSMA / BA .

    Todavía hay otras formas de comunicación en serie que son simplemente demasiado rápidas para implementar en el software para un μC típico, como USB , Ethernet , PCI Express y SATA . Puede implementarlas en los FPGA, pero esa es una pregunta aparte.

  2. Bueno, no con DB-9 RS-232, ni ninguna de las variantes comunes de conteo de pin inferior. La versión original de RS-232 basada en DB-25 hizo a un lado un par de pines para los relojes de emisor y receptor (15 y 17), pero en mis décadas de experiencia con RS-232, nunca he usado un dispositivo que realmente dependa de su presencia.

respondido por el Warren Young
3

Hay estándares de interfaz serie multipunto, por ejemplo, RS-485. Podría investigar si todas estas partes pueden configurarse para admitir tal estándar, y si puede organizar un protocolo adecuado para evitar que todos hablen a la vez. O puede usar puertas o interruptores externos (por ejemplo, 74HC4052) para enrutar sus señales en serie a un dispositivo u otro, controlado por un pin de puerto desde el procesador.

Esto no funciona si tanto el lector RFID como WiFi necesitan poder interrumpir la CPU en momentos aleatorios, aunque podría agregar otras conexiones para permitir eso.

    
respondido por el Brian Drummond
2

Los controladores XMega pueden admitir hasta 8 puertos UART:

  

Los dispositivos XMEGA A ofrecen las siguientes características: en el sistema   flash programable con capacidades de lectura mientras se escribe; interno   EEPROM y SRAM; controlador DMA de cuatro canales; evento de ocho canales   sistema y controlador programable de interrupción multinivel; hasta 78   líneas de E / S de propósito general; Contador en tiempo real (RTC) de 16 o 32 bits; arriba   a ocho temporizadores / contadores flexibles de 16 bits con captura, comparación y   Modos PWM; hasta ocho USARTs ...    fuente

    
respondido por el chwi
1

Puede usar un puerto serie para uno de los periféricos y para el otro puede implementar un software UART. Intenta buscar en Google y encontrarás tu segundo puerto.

    
respondido por el Navdepp
0

Use un demux con otros pines digitales del microcontrolador que puede obtener tantos UARTS que necesite, siempre que No necesita demasiada velocidad en las comunicaciones, ya que mantendrá 1 a la vez.

    
respondido por el user17739
0

Mire más arriba en la línea de Atmel: algunos de sus series SAM3 tienen múltiples puertos (ahora estoy usando el SAM3S4B para algo, y tiene 2 USART, que pueden hacer casi cualquier protocolo serial imaginable, y 1 o dos UARTS simples, que se limitan a aplicaciones seriales normales, 8-n-1, pero funcionan bien dentro de esos límites.

    
respondido por el Michael Kohne

Lea otras preguntas en las etiquetas