¿Puedo cambiar dinámicamente la frecuencia del reloj de entrada del AT91SAM3X8E?

Fondo:

Estoy intentando usar un microcontrolador AT91SAM3X8E (para compatibilidad con Arduino Due) para crear un USB a I 2 S interfaz. Mayoría I 2 S Los CODEC requieren un reloj maestro que sea METRO C L k = 256 B C L k donde BCLK es el reloj de bits, que a su vez es B C L k = 64 F s . Esto sería trivial de generar si solo estuviera tratando con una frecuencia de muestra, pero me gustaría conservar la compatibilidad para todos los valores comunes (44,1 kHz, 48 kHz, 88,2 kHz, 96 kHz, 196 kHz).

Planeo usar el controlador serial síncrono (SSC) del microcontrolador para esta tarea, para lo cual parece muy adecuado.

Problema:

Toda la I 2 S las señales de reloj deben funcionar con un múltiplo de la frecuencia de muestreo, que varía entre dos conjuntos: múltiplos de 44,1 kHz y múltiplos de 48 kHz. Esto significa que el reloj que impulsa el controlador en serie debe cambiarse dinámicamente entre dos valores. Al principio, pensé que manejar el reloj de transmisión del controlador en serie con la frecuencia adecuada sería la mejor opción, pero eso no permite la división dinámica del reloj para admitir diferentes frecuencias de muestreo. Llegué a la conclusión (quizás incorrectamente) de que necesito poder cambiar el reloj maestro del microcontrolador para solucionar todos estos problemas.

Pregunta:

¿Puede el AT91SAM3X8E admitir cambiar dinámicamente el reloj que recibe en el pin XIN o eso causaría errores de tiempo de ejecución? Si es así, ¿habría alguna forma de evitarlos (como usar temporalmente el oscilador RC)?

Respuestas (1)

No sé nada AT91SAM3X8Eespecíficamente, pero adivinaré una respuesta basada en mi conocimiento de los circuitos integrados.

Teóricamente, no hay ninguna razón por la que no pueda cambiar dinámicamente la frecuencia del reloj maestro en un circuito digital. De lo que debe tener cuidado es de que durante la conmutación no puede tener dos flancos ascendentes sucesivos que violen la frecuencia máxima del dispositivo. Si imagina cambiar de una forma de onda a otra cuando el reloj 'cambiado de' está cayendo y el reloj 'cambiado a' está subiendo, entonces podría obtener un período de reloj para un ciclo que podría ser mucho menor que el período de cualquiera de los relojes. Esto arruinaría el tiempo en varios de los caminos y dejaría su micro en un estado ilegal.

Si tiene alguna forma de garantizar que puede sincronizar correctamente la transición entre los relojes sin crear tal pulso, no puedo pensar en ningún problema con eso.

Ese es un gran punto en el que ni siquiera había pensado, ¡gracias! Supongo que si dejo el primer oscilador funcionando y cambié (temporalmente) al oscilador interno antes de apagarlo, podría evitar esta condición.