Me acabo de dar cuenta de que la familia 8051 usa 11.0592 MHz y sus múltiples para generar velocidades de transmisión estándar. Pero hay SoC que usan 15 MHz. ¿Cómo hacen esto entonces?
Me acabo de dar cuenta de que la familia 8051 usa 11.0592 MHz y sus múltiples para generar velocidades de transmisión estándar. Pero hay SoC que usan 15 MHz. ¿Cómo hacen esto entonces?
Respuestas:
Al UART no le importa mientras sea razonablemente exacto.
Entonces, su UART será demasiado rápido por un factor de . Se convierte en un problema en1+1, cuando el cambio de tiempo en 11 bits es más de medio bit.
Aquí está la descripción de las características de 'letra grande' de un MCU ARM de gama relativamente alta.
Hay una serie de PLL y divisores con escaladores previos y posteriores que son capaces de crear casi cualquier frecuencia que pueda necesitar como una relación de enteros. El PLL multiplica su frecuencia de entrada por algún número entero, y un divisor puede dividirse por algún número ( no necesariamente potencias de 2 en cada caso).
Las frecuencias internas relativamente altas (alrededor de medio GHz en este caso) no son un problema (como lo serían si estuvieran fuera del chip): se consume relativamente poca energía.
Los días de división solo por potencias de 2 terminaron hace bastante tiempo, y ahora que los PLL se aplican comúnmente, no tenemos que preocuparnos tanto por la frecuencia exacta del cristal. Por otro lado, podemos necesitar muchas frecuencias de reloj diferentes para múltiples relojes de bus internos, USB, Ethernet, UART, etc.
Si desea obtener más información sobre cómo funcionan, puede estudiar algunos de los chips de síntesis de reloj dedicados que son relativamente simples (aunque aún lo suficientemente complejos como para que algunos fabricantes suministren software para calcular las constantes de configuración).
Esto se puede lograr usando un modulador .
Consulte, por ejemplo, la guía del usuario MSP430x1xx . En la página 260 dice:
El generador de velocidad en baudios USART es capaz de producir velocidades en baudios estándar a partir de frecuencias de fuente no estándar. El generador de velocidad en baudios usa un preescalador / divisor y un modulador como se muestra en la Figura 13−7. Esta combinación admite divisores fraccionarios para la generación de velocidad de transmisión.
(tenga en cuenta el área gris)
El factor de división N es a menudo un valor no entero del cual la porción entera puede ser realizada por el preescalador / divisor. La segunda etapa del generador de velocidad en baudios, el modulador, se utiliza para cumplir con la parte fraccionaria lo más cerca posible.
[...]
El BITCLK se puede ajustar de bit a bit con el modulador para cumplir con los requisitos de temporización cuando se necesita un divisor no entero. El tiempo de cada bit se expande en un ciclo de reloj BRCLK si el bit modulador mi está configurado. Cada vez que se recibe o transmite un bit, el siguiente bit en el registro de control de modulación determina el tiempo para ese bit. Un bit de modulación establecido aumenta el factor de división en uno, mientras que un bit de modulación borrado mantiene el factor de división dado por UxBR
[...]
La forma en que funciona es que tiene un reloj de muestra interno. Digamos que puedes probar cada 100ns. Sabes dónde está el medio de cada bit. Por lo tanto, elige un punto de muestreo que sea el más cercano al medio. Esto le dará un error de 50ns como máximo.
Lo que sucede es que recibes el bit de inicio. Luego determina dónde está la mitad del bit, ese es su punto de referencia. Entonces sabrá cuánto tiempo necesita esperar para probar el siguiente bit. Entonces, carga un contador y, cuando se reinicia, muestra. Ahora, estará apagado como máximo 1 ciclo de reloj de su reloj interno rápido, pero eso es nano segundos en la mayoría de los casos. Además, sabes cuánto estás fuera. Para el siguiente bit, carga su contador con un valor diferente, de modo que esté lo más cerca posible del medio, y así sucesivamente.
En los sistemas reales hay muchas otras cosas que también suceden. Por ejemplo, no tomas una muestra, puedes tomar un par y procesarlas, etc. De hecho, es un ADC de 1 bit, con todas las implicaciones como el ruido de cuantización. Pero deberías tener la idea general.
Los SoCs modernos usan el llamado PLL para generar (casi) cualquier reloj que pueda ser necesario para las interfaces. En términos simplificados, el circuito PLL emplea un VCO de alta frecuencia (oscilador controlado por voltaje), luego usa divisores de frecuencia difital tanto en VCO como en reloj de entrada, y genera una retroalimentación de voltaje basada en la relación de frecuencia. Esta retroalimentación controla el VCO, de modo que todo el bucle está bloqueado a la frecuencia deseada.
Suponiendo un byte de 8 bits precedido por un único bit de inicio y seguido de un solo bit de parada y suponiendo un muestreo perfecto por parte del receptor, eso significa que después de períodos de 9,5 bits, el reloj debe estar apagado en menos de medio período.
Eso significa que la diferencia de reloj tolerable máxima entre el transmisor y el receptor es de aproximadamente el 5%. Sin embargo, puede haber un error en ambos extremos del enlace y la sincronización de los receptores puede no ser perfecta. En la práctica, por lo tanto, generalmente recomendaría que la velocidad de transmisión real se mantenga dentro del 1% de la velocidad de transmisión nominal.
Los microcontroladores con los que estoy más familiarizado son los dispositivos PIC18. Los modelos más antiguos usan un contador flexible de 8 bits para escalar la velocidad en baudios, mientras que los más nuevos tienen un contador flexible de 16 bits. También hay modos opcionales de velocidad "alta" y "baja" que cambian la velocidad de transmisión en un factor de cuatro.
Con un reloj de entrada de 20 MHz, la versión de 8 bits de este esquema de generación es suficiente para alcanzar el 0.25% de la velocidad de transmisión nominal para todas las velocidades de 1800 a 19200. La versión de 16 bits te permite bajar a velocidades aún más bajas.
http://www.nicksoft.info/el/calc/?ac=spbrg&submitted=1&mcu=+Generic+16bit+BRG&Fosc=20&FoscMul=1000000&FoscAutoSelector=0&MaxBaudRateError=1 (ignore la sincronización = 1 columnas, están para ejecutar los EE.UU. modo síncrono)
Los PLL, divisores fraccionarios, etc. no son realmente necesarios para la serie UART.
Para intercambiar datos en serie, un controlador debe emitir o muestrear datos dentro de una determinada ventana del tiempo "ideal". Si bien es más simple tener un controlador que divida un reloj por un factor programable y luego nuevamente por un factor codificado adicional, no es necesario que los bits se lean o escriban a intervalos iguales. Si el extremo lejano de una conexión genera bits a intervalos uniformes exactos que coinciden con la velocidad en baudios, un receptor puede funcionar con cualquier velocidad de muestreo que sea mayor que el doble de la velocidad en baudios, siempre que muestree las cosas en los momentos correctos. Por ejemplo, suponga que los datos se emiten a 19.200 y uno está muestreando precisamente a 48,000Hz (2.5x).
Cuando se ve un borde descendente, se sabrá que el bit de parada ha comenzado entre 0 y 1 muestras hace un tiempo. Si se etiqueta la primera muestra donde se observó el bit de inicio como tiempo 0, el bit 0 comenzará en algún punto entre el tiempo 1.5 y 2.5; el bit 1 comenzará en algún momento entre el tiempo 4.0 y 5.0, el bit 2 comenzará en algún momento entre el tiempo 6.5 y 7.5, y el bit 3 comenzará en algún momento entre el tiempo 9.0 y 10.0. Por lo tanto, se garantizará que una muestra tomada en el tiempo 3 capturará el bit 0 [que comienza entre el tiempo 1.5 y 2.5, y termina entre el tiempo 4.0 y 5.0]. Del mismo modo, una muestra tomada en el tiempo 6 capturará el bit 1, y una muestra tomada en el tiempo 8, 11, 13, 16, 18 y 20 capturará los bits 2-7.
El uso de una frecuencia de muestreo más rápida haría que el receptor sea más tolerante a las imperfecciones en la fuente, pero incluso con una frecuencia de muestreo de solo 2.5 veces la frecuencia de bits, los márgenes no son terribles [aproximadamente 1/5 de un tiempo de bits].