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?