Serielle MSP430-Kommunikation schlägt bei kaltem Wetter fehl

Ich habe ein Produkt, das den MSP430-Mikroprozessor verwendet, der jetzt seit ein paar Jahren verkauft wird. Eine der Aufgaben des MSP430 ist die Kommunikation über asynchrone serielle Schnittstelle mit einem Low-Power-Funkgerät.

Mit Beginn dieses Winters gab es eine nicht akzeptable Ausfallrate (mehrere Prozent) bei kalten Temperaturen. Die Untersuchung hat ergeben, dass die serielle Kommunikation mit dem Funkgerät fehlschlägt. Der Baudratengenerator für die serielle Schnittstelle wird von SMCLK gespeist, das vom digital gesteuerten Oszillator (DCO) des MSP430 getrennt ist.

Warum schlägt die serielle Kommunikation bei niedrigen Temperaturen fehl?

(Hinweis: Ich habe das Problem bereits gelöst und werde die Antwort bald posten. Hinweis: Es war ein Softwarefehler.)

Antworten (3)

Welches MSP430 verwendest du? Die verschiedenen Familien haben unterschiedliche Uhrenstrukturen und Fähigkeiten.

Der DCO ändert die Frequenz mit der Temperatur, was dazu führt, dass die USART-Baudrate außerhalb der Spezifikation driftet. Der MSP hat einen Temperatursensor (nicht sehr genau). Sie können die Werte in den DCO-Steuerregistern ändern, um die DCO-Frequenz wieder in den Bereich zu bringen, aber dies würde kalibrierte Nachschlagetabellen erfordern, die den erwarteten Temperaturbereich abdecken. Einige der MSP-Geräte haben DCO-Kalibrierungstabellen, die bei der Herstellung in einen der Flash-Sektoren programmiert wurden, aber diese sind nur nützlich, wenn sie die Frequenz abdecken, die Sie verwenden möchten, und ich glaube nicht, dass sie Temperaturkompensationswerte haben.

Haben Sie einen Referenz-Quarzoszillator, den Sie als Kalibrierungsquelle verwenden könnten? Ich würde immer in einem 32-kHz-Quarz entwerfen und diesen auf dem ACLK verwenden. Für Baudraten bis 9600 kann diese direkt verwendet werden. Für höhere Baudraten müssen Sie den DCO gegen das ACLK-Signal kalibrieren. Die neueren Teile haben eine Hardware-FLL, die dies automatisch erledigt.

Hier also die Antwort:

Das Produkt hat einen 32-kHz-Quarz, und ich hatte eine Routine zum Einstellen der DCO-Frequenz codiert. Die Frequenzeinstellung verwendete zwei Zeitgeber, einen vom DCO und einen vom 32-kHz-ACLK. Es wurde durch eine Unterbrechung des Erfassungs-/Vergleichssystems angesteuert, so dass es sich während des Betriebs regelmäßig neu kalibrieren konnte.

Leider habe ich die anfängliche Kalibrierung in den falschen Teil meines Startcodes eingefügt, wo Interrupts ausgeschaltet waren. Daher wurde die Kalibrierung nicht vor der ersten Verwendung der seriellen Schnittstelle durchgeführt, und die Initialisierung blieb hängen und wartete auf eine Antwort auf der seriellen Schnittstelle.

Die DCO-Frequenz beginnt mit dem werkseitig kalibrierten Wert, weshalb sie bei Raumtemperatur funktionierte.

Diese Plots erzählen die Geschichte:

Zunächst die DCO-Temperaturkurve:Alt-Text

Jetzt funktioniert die Kurve nach der Kalibrierung tatsächlich:Alt-Text

Gute Geschichte! Hat die Reparatur viel gekostet? :D
Interessant ist, dass sich die Steigung vom ersten Graphen zum zweiten Graphen ändert. Irgendwelche Theorien? Ergibt eine Abstimmung des DCO auf eine niedrigere Frequenz einen schlechteren Temperaturkoeffizienten?
Beachten Sie, dass sich die y-Achse zwischen den beiden Diagrammen ändert. Und lesen Sie im Allgemeinen nicht zu viel in sie hinein. Das Teil wurde in einem Haushalts-Gefrierschrank eingefroren und die Temperatur wurde während des Aufwärmens auf Raumtemperatur mit einem Thermoelement auf einem billigen MAS-345 ( elexp.com/tst_s345.htm ) gemessen, das nur ganzzahlige Grad anzeigt. Dann interpolierte ich linear zwischen Ganzgradänderungen, um das Diagramm zu erstellen.

Die niedrigen Temperaturen haben dazu geführt, dass die DCO-Frequenz so weit angestiegen ist, dass die UART-Baudrate zu hoch angestiegen ist? Sie haben die Temperatur gemessen und dann den Oszillator per Software kompensiert?