Forum: Mikrocontroller und Digitale Elektronik Wie erfährt MSP430 als SPI-Master, wann ein Zeichen vom Slave fertig gelesen wurde?


von noips (Gast)


Lesenswert?

Hallo,

hab einen MSP430 als SPI-Master. Die Daten vom SPI-Slave werden ja so 
gelesen:

- Slave stellt ein Zeichen in seinem Schieberegister bereit und wartet 
auf Takt
- Master zieht SS auf low ( wenn 4-Wire-Mode )
- In Tx-Buffer des Masters wird ein Dummy-Byte geschrieben
- Master erzeugt Takt und liest das Zeichen vom Slave
- Wenn Zeichen vollständig gelesen, Master liest das nächste Zeichen 
oder zieht SS auf high


Nun meine Frage:

Wie erfährt der MSP430, wann er das Zeichen vollständig empfangen hat? 
Mit dem Auswerten des TxFlags klappt es leider nicht, weil es nur 
signalisiert, wann der Tx-Buffer zur Annahme des nächsten zu sendende 
Zeichens bereit ist und nicht wann das aktuell zu sendende Zeichen 
vollständig aus dem ensprechenden Shift-Register rausgeschoben wurde.

von Rainer M. (excogitator)


Lesenswert?

Hallo noips,

du musst das TXEPT-Flag (Tx-Register empty) in UxTCTL abfragen. Damit 
wird angezeigt, das eine Byte fertig übertragen wurde.

Gruß
Rainer

von noips (Gast)


Lesenswert?

Hallo Rainer,

danke für die Antwort! Mit dem Abfragen des Tx-Register-empty-Flags 
(heißt beim MSP430 einfach TXIFG - Tx-Interrupt Flag) geht es eben 
nicht, wie ich oben geschrieben habe. Das Problem ist, dass das 
SPI-Sendemodul des MSP430 zum Senden zwei Register hat, einen 
Buffer-Register und einen Shift-Register. Zum Senden müssen Zeichen in 
den Buffer-Register geschrieben werden. Wenn Schieberegister leer ist, 
wird das Zeichen aus dem Buffer in Shift-Reg. geschrieben und dann im 
Takt rausgeschiftet. Das TXIFG-Bit signalisiert, wann das Buffer-Reg. 
leer ist, damit man das nächste Zeichen dort hineinschreiben kann. 
Shift-Reg. ist aber noch eine ganze Weile nicht leer, auch wenn Buffer 
schon leer ist und TXIFG-Bit gesetzt wurde. Wenn man also SS sofort 
deaktiviert, gleich nach dem TXIFG gesetzt wurde, wird das letzte 
Zeichen vom Slave nicht empfangen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Abhilfe böte hier ein mit dem Bittakt betriebener abwärtslaufender 
Timer, der mit dem Hineinschreiben in das TX-Register mit dem Wert 8 
aufgezogen wird und bei Ablauf einen Interrupt auslöst - nicht schön, 
aber eine Möglichkeit.

von noips (Gast)


Lesenswert?

Danke für die Antworten! Ich glaube, ich habe eine Lösung. Das SPI-Modul 
des Controllers hat im SPI-Statusregister ein BUSY-Bit. Es zeigt, wann 
eine Übertragung aktiv ist. Ich habe es vorher nie benutzt und kannte es 
nicht, aber es scheint genau für einen Fall wie meinen da zu sein.

von Rainer M. (excogitator)


Lesenswert?

Das mit dem Buffer ist mir schon klar. Deswegen meinte ich auch das du 
das TXEPT (im UXCTL-Register) nehmen sollst und nicht das TXIFG-Flag(im 
IFx-Register). Der MSP430 (zumindest der MSP430F16xx) hat ja genau für 
diese beiden Fälle zwei verschieden Flags.

Gruß
Rainer

von noips (Gast)


Lesenswert?

Aha, OK! Bei dem Typ, den ich verwende ist der ober erwähnte BUSY-Flag 
wohl dazu vorgesehen.

von LM317 (Gast)


Lesenswert?

>Wie erfährt der MSP430, wann er das Zeichen vollständig empfangen hat?
>Mit dem Auswerten des TxFlags klappt es leider nicht

Ja wie wohl er empfängt ja das Byte.. Desshalb würd ich wohl die 
Rx-Flags auswerten.. Beim MSP430F169 währen dies wohl URXIFGO oder 
URXIFG1

Im MSP430xF1xx User Guide (SLAU049F.pdf) steht:

URXIFG0 Bit 6 USART0 receive interrupt flag. URXIFG0 is set when U0RXBUF
              has received a complete character.
              0 No interrupt pending
              1 Interrupt pending

Also wenn das Bit URXIFG0 gesetzt ist wurde das Byte empfangen.

cheers

von noips (Gast)


Lesenswert?

Das Problem mit dem Empfangen von Zeichen ist jetzt dank euch gelöst! 
Jetzt habe ich noch folgende Frage:

Wenn der SPI-Master Zeichen lesen will, muss er ja ein Dummy-Zeichen 
schicken um Takt zu erzeugen. Wenn jetzt aber das SPI im Slave so 
funktioniert, dass beim Emfangen dieses Dummy-Zeichens im Slave ein 
Interrupt ausgelöst wird, so führt dieses Dummy ja möglicherweise zu 
Timing-Problemen im Slave. Wie kann ich auf der Seite des Masters dafür 
sorgen, dass so etwas vermieden wird?

Was mir da einfällt, ist die Möglichkeit, den MOSI-Pin des Masters für 
die Dauer des Lesevorganges per Software zu deaktivieren. Im MSP430 
müsste man dazu den Pin wieder als I/O-Pin konfigurieren. Ich weiß aber 
nicht, wie gut diese Lösung ist. Da vergeht ja auch Zeit beim 
Umkonfigurieren. Gibt es da übliche gute Lösungen dazu??

Danke schon mal!!!

von Christian R. (supachris)


Lesenswert?

Dann funktioniert dein Slave nicht richtig. Jeder SPI Slave funktioniert 
so, dass bei jedem Schreiben gleichzeitig vom Master gelesen wird. Um zu 
lesen, muss ein Dummay Byte gesschrieben werden. Wo soll da jetzt was 
kollidieren?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.