¿Cómo maneja 16550 UART las velocidades en baudios no enteros? [cerrado]

-2

El UART 16550 calcula la velocidad en baudios utilizando la fórmula 115200 dividida por el número de 16 bits obtenido al concatinar los registros de DL alto y bajo. Hay varios divisores conocidos que te dan velocidades de transmisión bien conocidas y son fáciles de calcular. Una velocidad en baudios de 9600 es solo 115200/12. 57600 es 115200/2, 300 baudios es 115200/384, etc ... 115200 tiene 90 divisores enteros.

Mi pregunta, que no creo / pienso / se contesta en la hoja de datos, es que sucede cuando ingresa un valor para el divisor que no sale a un entero como, por ejemplo, 7. 115200/7 = 16457.142 ....

Puedo ver cualquiera de los siguientes resultados potenciales:

  • El chip intenta operar a la velocidad en baudios especificada, incluidas las temporizaciones fraccionarias
  • El divisor se considera inválido, el cambio se ignora y el chip continúa transmitiendo a la velocidad anterior (¿quizás se esté generando un error?)
  • La velocidad en baudios se redondea al número entero más cercano (es decir, '7' daría como resultado una velocidad en baudios de 16457)
  • La velocidad en baudios se redondea al divisor entero más cercano de 115200 (uno de los 90, por lo que '7' daría como resultado 14400 baudios)
  • Algo más que no he pensado. Sé, por ejemplo, que algunas hojas de datos advierten sobre la escritura de '0' en estos registros, ya que 115200/0 no está definido.

Iba a probar esto en una Raspberry Pi 3, solo para descubrir que los UART no existen en los 16550 reales. Intentaré probar hardware real tan pronto como pueda echar mano, pero puede que sea un tiempo y mi pequeño proyecto se detenga hasta que sepa la respuesta. ¿Alguna idea?

    
pregunta clemej

1 respuesta

3

Puede depender de qué chip 16550 tengas (aunque espero que sean todos iguales):

La hoja de datos de TI dice esto en la sección 8.5.1

El UART contiene un generador de baudios programable que puede tomar cualquier entrada de reloj desde DC a 24 MHz y dividirlo por cualquier divisor de 2 a 216–1 . La frecuencia de salida del generador de baudios es 16 × el Baud [divisor # = (entrada de frecuencia) ÷ (velocidad de baudios × 16)]. Dos pestillos de 8 bits almacenan el divisor en un formato binario de 16 bits. Estos cierres de divisor deben cargarse durante la inicialización para garantizar el funcionamiento correcto del generador de baudios. Al cargar cualquiera de los cierres de divisor, se carga inmediatamente un contador de baudios de 16 bits. La Tabla 4 proporciona divisores decimales para usar con frecuencias de cristal de 1.8432 MHz, 3.072 MHz y 18.432 MHz, respectivamente. Para velocidades de transmisión de 38400 e inferiores, el error obtenido es mínimo. La precisión de la velocidad en baudios deseada depende de la frecuencia de cristal elegida. No se recomienda usar un divisor de cero.

Por lo tanto, puedes usar cualquier divisor que quieras con el reloj que quieras. Por supuesto, las velocidades en baudios no estándar tendrían que coincidir en cada extremo.

    
respondido por el Jack Creasey

Lea otras preguntas en las etiquetas