La comunicación serial MSP430 falla en clima frío

Tengo un producto que utiliza el microprocesador MSP430, que se vende desde hace un par de años. Uno de los trabajos del MSP430 es comunicarse a través de una serie asíncrona con una radio de baja potencia.

Con el inicio de este invierno, ha habido una tasa de fallas inaceptable (varios por ciento) en temperaturas frías. La investigación ha encontrado que la comunicación en serie con la radio está fallando. El generador de velocidad en baudios para el puerto serie es alimentado por SMCLK, que se divide del oscilador controlado digitalmente (DCO) del MSP430.

¿Por qué falla la comunicación serial a bajas temperaturas?

(Nota: ya resolví el problema y publicaré la respuesta pronto. Pista: fue un error de software).

Respuestas (3)

¿Qué MSP430 estás usando? Las diferentes familias tienen diferentes estructuras y capacidades de reloj.

El DCO cambiará la frecuencia con la temperatura, lo que hará que la tasa de baudios del USART se salga de la especificación. El MSP tiene un sensor de temperatura (no muy preciso). Puede cambiar los valores en los registros de control de DCO para que la frecuencia de DCO vuelva al rango, pero esto requeriría tablas de búsqueda calibradas que cubran el rango de temperaturas que espera ver. Algunos de los dispositivos MSP tienen tablas de calibración DCO programadas en uno de los sectores de flash en la fabricación, pero solo son útiles si cubren la frecuencia que desea usar, y no creo que tengan valores de compensación de temperatura.

¿Tiene un oscilador de cristal de referencia que podría usar como fuente de calibración? Siempre diseñaría en un cristal de 32kHz y lo usaría en el ACLK. Para velocidades de transmisión de hasta 9600, esto se puede usar directamente. Para velocidades de transmisión más altas, deberá calibrar el DCO contra la señal ACLK. Las piezas más nuevas tienen un FLL de hardware que hará esto automáticamente.

Así que aquí está la respuesta:

El producto tiene un cristal de 32 kHz y había codificado una rutina para ajustar la frecuencia DCO. El ajuste de frecuencia usó dos temporizadores, uno de DCO y otro de ACLK de 32kHz. Fue impulsado por una interrupción del sistema de captura/comparación, para que pudiera recalibrarse periódicamente durante la operación.

Desafortunadamente, inserté la calibración inicial en la parte incorrecta de mi código de inicio, donde se desactivaron las interrupciones. Por lo tanto, la calibración no se realizó antes del primer uso del puerto serie y la inicialización se bloqueaba esperando una respuesta en el puerto serie.

La frecuencia DCO parte del valor calibrado de fábrica, por lo que estaba trabajando a temperatura ambiente.

Estas tramas cuentan la historia:

Primero, la curva de temperatura DCO:texto alternativo

Ahora la curva después de la calibración está funcionando:texto alternativo

¡Buena historia! ¿Te costó mucho arreglarlo? :D
Es interesante que la pendiente cambie del primer gráfico al segundo gráfico. ¿Alguna teoría? ¿Sintonizar el DCO a una frecuencia más baja le da un peor coeficiente de temperatura?
Observe que el eje y cambia entre los dos gráficos. Y no lea demasiado en ellos en general. La pieza se congeló en un congelador doméstico y la temperatura se midió durante el calentamiento a temperatura ambiente con un termopar en un MAS-345 económico ( elexp.com/tst_s345.htm ) que solo lee grados enteros. Luego interpolé linealmente entre cambios de grados completos para hacer la gráfica.

¿Las bajas temperaturas hicieron que la frecuencia del DCO aumentara lo suficiente como para que la velocidad de transmisión del UART aumentara demasiado? ¿Mediste la temperatura y luego compensaste el oscilador en el software?