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:
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.
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.
Ü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.
iiiiiisd dddddddS
für ein Stoppbit oder iiiiisdd ddddddSS
für zwei tun, um sicherzustellen, dass Sie rechtzeitig zu Rx wechseln können. Ich bin sicher, dass das sehr Einfache iiiiiiis dddddddd iiiiiiis dddddddd Siiiiiii
funktioniert, wenn Rx turn around länger als ein Zeichen ist. (Erinnere dich an `i = S' )
CL.
sehr