Wie erfährt MSP430 als SPI-Master, wann ein Zeichen vom Slave fertig gelesen wurde?

Gast #1635809
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.
Gast #1635876
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.
Gast #1635993
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.
Gast #1636469
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
Gast #1637556
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!!!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren