Buscando MCU con 9 bits de datos UART

2

Necesito desarrollar una placa controladora para algunos periféricos que se comunican a 9600 baudios con 1 bit de inicio, 9 bits de datos, sin paridad y un bit de parada.

No estoy seguro de estar preparado para codificar un controlador de puerto serie o incluso para modificar un controlador de 8 bits de datos existente para manejar 9, por lo que, ¿alguien sabe de una MCU que viene, lista para usar, con un controlador de puerto serie? ¿Cuál puede manejar 9 bits de datos?

Prefiero mucho la compatibilidad con tarjetas SD, y Ethernet / Wifi estaría bien (no me importa mucho BlueTooth o USB, siempre que no aumenten significativamente el precio).

Necesita poder ejecutarse 24/7 en un dispositivo integrado.

Prefiero algo con FreeRTOS o similar y un IDE de buen desarrollo que incluye funciones de depuración.

¿Estoy pidiendo demasiado o existe tal bestia?

    
pregunta Mawg

5 respuestas

7

La serie ATmega tiene un UART de 9 bits

La serie de microcontroladores ATmega ( hoja de datos ) tiene la capacidad de usar 9 bits de datos sin jugando con el bit de paridad. Esta funcionalidad se describe en el diagrama de tiempo:

Tengaencuentaquelosbitsestánnumeradosenlafigurade0a8,queesuntotalde9bits.Eltítuloserefiereaestanumeración,noindicaquepuedausar0-8bitsdedatos.Elnúmeromínimodebitsenuncarácteres5,yelmáximoes9,no0-8.

PuedeestablecerelanchodelaseccióndedatosmediantelosbitsUCSZ.Laconfiguraciónsedescribeenlatabla19-7,quesemuestraacontinuación:

Para configurar esto en C usando AVR Libc , deberías ejecutar el código:

#include <avr/io.h>  // _BV() macro, register definitions

// Set the Uart Character SiZe to 9 bits as described in table 19-7
UCSR1B |= _BV(UCSZ12 );
UCSR1C |= _BV(UCSZ11) | _BV(UCSZ10 );

Tenga en cuenta que probablemente querrá especificar los otros bits en estos registros mientras esté en ello.

Muchos otros procesadores también tienen esto

Es casi seguro que hay otros procesadores que admiten este conjunto de características. Los procesadores ATtiny de Atmel tienen el mismo USART que el ATmega, y son compatibles con el código, sus procesadores AVR32 tienen el mismo soporte de 9 bits, pero con una interfaz de programación diferente, los procesadores dsPIC lo admiten, pero sin un bit de paridad adecuado (vea la página 243 de esta hoja de datos ; establezca los bits 1 y 2, PDSEL del registro UxMODE) ... la lista continua. El primer procesador que verifiqué y que no era compatible con él era una pieza Stellaris Cortex-M3, que admite 5-8 bits de datos, pero no 8 bits.

Pero debes usar tus otras restricciones para restringir las opciones primero.

Al final, sin embargo, primero debes hacer tu selección de procesador basada en otros factores. Usted escribió:

  

Prefiero mucho la compatibilidad con tarjetas SD, y Ethernet / Wifi estaría bien (no me importa mucho BlueTooth o USB, siempre que no aumenten significativamente el precio).

La mayoría de las personas accederán a la tarjeta SD en modo SPI, y casi todo tiene un puerto SPI o dos. Ethernet / WiFi es una especificación demasiado genérica y un requisito mucho más difícil de cumplir. ¿Desea un MAC integrado con una interfaz MII? ¿PHY integrado? ¿Preferiría hacer todas las cosas de TCP / IP en el chip, o descargar prácticamente todo a algo como WIZnet W5100 o Lantronix XPort . También puede usar componentes como el Microchip ENC28J60 para mover el MAC y el PHY a un chip externo, Se accede a través de SPI. Sus otros requisitos son mucho más exigentes que un UART de 9 bits.

De hecho, probablemente podría usar un ATTY $ 1.50 como SPI '/ I2C < - > convertidor de UART de 9 bits si quisiera. Eso sería mucho menos costoso que elegir un procesador subóptimo para sus otros requisitos.

    
respondido por el Kevin Vermeer
5

Algunas búsquedas en la web indican que las siguientes familias pueden tener una capacidad de hardware de 9 bits: ATMEGA, dsPIC, 8051, STM32 y, por supuesto, muchas otras, pero también hay muchas 7 / Los periféricos UART solo de 8 bits también.

Al costo de una mayor sobrecarga del controlador, se puede hacer que un UART de 8 bits con compatibilidad de paridad transmita caracteres de 9 bits determinando la paridad del valor de 8 bits que se va a transmitir y luego configurando el modo UART en par o paridad impar según se requiera para lograr el valor deseado del noveno bit. Al recibir, se lee el indicador de error de paridad y el noveno bit se determina a partir de eso y la paridad calculada del valor de 8 bits.

Un software UART puede, por supuesto, implementar un ancho de caracteres arbitrario.

    
respondido por el Chris Stratton
4

He observado que los UART ofrecen niveles variados de soporte para "datos de nueve bits"; a veces uno tiene que leer las hojas de datos con cuidado para ver cómo funcionarán las cosas.

  1. Algunos UART se pueden configurar para transmitir y recibir ocho bits de datos más un bit adicional, y tienen buffers completos de transmisión y recepción de 9 bits. Por lo tanto, es posible enviar y recibir datos de 9 bits de forma fluida y confiable.
  2. Algunos UART se pueden configurar para transmitir y recibir datos de 9 bits, pero no tienen un búfer de transmisión fuera del desplazador, y solo un búfer de recepción de un solo byte. Estos UART requieren cuidado de niños con cada byte de datos de 9 bits, pero pueden enviarlos y recibirlos con la misma fiabilidad que los datos de 8 bits.
  3. Algunos UART pueden configurarse para transmitir y recibir ocho bits de datos junto con un noveno bit que se puede configurar para marcar o espaciar, y pueden informar el estado del noveno bit en el último byte recibido, pero deben inspeccionar el Estado del noveno bit de cada byte recibido antes de que se reciba el siguiente byte. Sin embargo, siempre que puedan inspeccionar los datos entrantes de manera oportuna, las comunicaciones pueden ser confiables. Si, después de procesar un byte, la interrupción de recepción observa que otro byte ya está pendiente, el noveno bit del byte que se acaba de procesar debe considerarse poco confiable.
  4. Algunos UART pueden ser como los anteriores, pero establecen el estado de la parte de un byte recibido antes de que el propio byte se considere disponible; No estoy seguro de si alguno realmente funciona de esta manera, pero se debe tener en cuenta que no evitaría una transmisión y recepción confiables con interrupciones que siempre se manejaron de manera oportuna, pero que podrían no notificar de manera confiable cuando las interrupciones tardías causaron la pérdida de datos.
  5. Algunos UART se pueden configurar para transmitir y recibir ocho bits junto con un noveno bit configurable, pero por varias razones no se pueden hacer de forma confiable y asincrónica utilizando cualquier estructura de interrupción razonable. Por ejemplo, una parte podría usar los mismos bits de control de configuración para establecer la paridad de salida y la paridad de entrada "esperada", y podría registrar si la paridad del último byte recibido fue "correcta" o "incorrecta". Si se recibe un byte mientras se cambia la configuración de paridad, puede ser imposible saber si la designación "correcta" o "incorrecta" fue relativa a la configuración antigua o nueva.

De alguna manera, parece que el uso de datos de nueve bits debería ser simple. Lástima que rara vez es.

    
respondido por el supercat
3

En la mayoría de los casos, se puede emular UART de 9 bits con 8 bits de datos y un bit de paridad establecido explícitamente. Consulte este hilo para un poco de discusión.

    
respondido por el Igor Skochinsky
1

Hubo una solicitud ayer mismo en la lista de correo de Arduino-Developers para agregar soporte a la biblioteca Serial para permitir a los usuarios especificar bits de datos, bits de parada y paridad. El Mega328 UART (en el que se basa el hardware de Arduino) puede configurarse para 9 bits de datos, por lo que si se adopta esta solicitud de parche / función, podría ser bastante fácil de configurar y codificar. El software no está implementado hoy, pero ciertamente es plausible.

    
respondido por el vicatcu

Lea otras preguntas en las etiquetas