Kann ich SPI für die asynchrone serielle Ausgabe verwenden?

Ich benötige einen zweiten seriellen asynchronen Ausgangskanal auf dem MSP430G2553 und möchte dafür die SPI USCI verwenden.

Ist die USCI-SPI-Baudrate stabil genug, um dies bei 300 Baud, 2400 Baud oder 9600 Baud zu tun? Ich verwende derzeit den 8-MHz-Takt.

Gibt es eine andere Option, die mich vor Bit-Banging bewahren kann?

Meine aktuelle Überlegung für 300 bd Tx ist wie folgt:

  1. Stellen Sie den Prescaler zuerst auf 26666 LSB ein
  2. Byte in Txbuf laden
  3. Lade 0x7F in Txbuf, um Stopp- und Startbits zu erzeugen
  4. 2-3 wiederholen
  5. Endstoppbits 0xFF senden

Es ist möglicherweise auch möglich, zehn Datenbits an andere Mitglieder der MSP430-Familie zu senden, die eine SPI enthalten.

Vielen Dank für Ihre Antworten.

Warum brauchen Sie Rx für einen Ausgangskanal?
@CL. Der Rx ist Teil einer Folgefrage. Die Hauptfrage betrifft Tx. Aus Gründen der Übersichtlichkeit bearbeitet.

Antworten (1)

Die Verwendung von SPI zur Ausgabe von mehr als acht Bits ist möglich, solange Sie sicherstellen können, dass TXBUF immer gefüllt ist.

Ihr Schema, jedes zweite Byte 0x7F zu verwenden, wird unzuverlässig, wenn eine Verzögerung auftritt. Es könnte eine bessere Idee sein, die eigentlichen Daten auf zwei Bytes zu verteilen:

1110xxxx xxxx1111
iiisdddd ddddSiii

( i= Leerlauf, s= Startbit, S= Stoppbit, d= Daten)

Dann müssen Sie diese beiden Bytes nur noch zusammenhalten und können danach eine Pause einplanen.

  1. Warten, bis TXBUF leer ist (TXIFG);
  2. Interrupts deaktivieren;
  3. 1. Byte in TXBUF schreiben;
  4. warte bis TXBUF leer ist;
  5. 2. Byte in TXBUF schreiben;
  6. Interrupts aktivieren.

Überprüfen Sie jedoch, ob das SPI-Modul Ihrer MCU tatsächlich 1 (den letzten Wert) ausgibt, wenn es sich im Leerlauf befindet. Es könnte stattdessen das erste Bit des letzten Bytes ausgeben; in diesem Fall müssen Sie danach 0xFF senden (oder die nächste gültige Zwei-Byte-Kombination).

Empfangen mit SPI könnte gefährlicher sein. Jede Unterbrechungslatenz wirkt sich auf die Abtastung der Datenbits aus, sodass Sie eine Verzögerung haben, die in der Praxis nicht kontrollierbar ist.


Alternativ können Sie einen Timer-Ausgang verwenden, um einen UART zu emulieren. Verwenden Sie den kontinuierlichen Modus, programmieren Sie ein CCR für den Zeitpunkt der nächsten Signalflanke und setzen Sie den Ausgangsmodus nach Bedarf zurück oder setzen Sie ihn zurück. Programmieren Sie im Interrupt-Handler die folgende Flanke (addieren Sie die Bitlänge zum CCR und schalten Sie den Set/Reset-Modus um, falls erforderlich). Dies ähnelt dem Bit-Banging, garantiert jedoch das Timing, solange Sie den Interrupt für jedes Bit schnell genug verarbeiten können.

Ebenso können Sie einen Timer zum Empfangen verwenden: Programmieren Sie einen CCR im Erfassungsmodus auf die fallende Flanke. Wenn Sie einen Interrupt erhalten, erhalten Sie den genauen Zeitpunkt der Flanke im CCR-Register, und Sie können das CCR dann für den Vergleichsmodus neu programmieren und in der Mitte des jeweils nächsten Bits triggern; im Interrupt-Handler zeigt das SCCI-Bit den Wert des Timer-Eingangs, als er ausgelöst wurde.

Danke, Ihre Idee wird mit anderen Familienmitgliedern funktionieren, bei denen 10 Bits konfiguriert werden können. Im MSP430G2553 sehe ich jetzt, dass USCI_B0 Tx- und Rx-Register nur bytebreit sind. (Ich denke, beide Byte-Schemata werden zuverlässig sein, solange Sie keine Verzögerung sicherstellen können.) Was denken Sie über Rx?
Bitte posten Sie Ihre Interrupt-gesteuerte Bit-Banging-Lösung als separate Antwort.
Ich bin jetzt weiter unten auf der Linie. Wenn Sie Ihre Terminologie verwenden, müssen Sie iiiiiisd dddddddSfür ein Stoppbit oder iiiiisdd ddddddSSfür zwei tun, um sicherzustellen, dass Sie rechtzeitig zu Rx wechseln können. Ich bin sicher, dass das sehr Einfache iiiiiiis dddddddd iiiiiiis dddddddd Siiiiiiifunktioniert, wenn Rx turn around länger als ein Zeichen ist. (Erinnere dich an `i = S' )
Ich weiß jetzt, wie es geht, gebe es aber geschlagen. Ich bestelle ein Entwicklungskit mit vier UARTs!