www.mikrocontroller.net

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


Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rainer M. (excogitator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rainer M. (excogitator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: noips (Gast)
Datum:

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

Autor: LM317 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.