mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI-Bug im MSP430??


Autor: Odic X. (odic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend zusammen,

ich habe eine SPI Kommunikation mit einem F2274 als Master aufgebaut. Es 
werden lediglich CLK bzw. MOSI verwendet, CS wird separat geschaltet und 
vom Slave wird nicht gelesen. Der inaktive clock Zustand ist low, die 
Daten sollen vom Slave auf steigender Flanke übernommen werden (UCCKPH 
gesetzt).

Das klappt alles auch soweit, lediglich das Warten auf das Ende der 
Übertragung funktioniert nicht wie gewollt. Ohne die unten eingefügte 
for()-Schleife dreht der Master dem Slave unmittelbar nach der letzten 
(16.) steigenden Flanke den CS ab. Damit geht die Übertragung schief, 
weil das Software-SPI im Slave zwar schnell ist, den Portzustand aber 
auch nicht in der Zeit Null lesen kann.
So wie ich das BUSY-Flag interpretieren würde sollte es erst 
zurückgesetzt werden, wenn die Übertragung beendet, sprich CLK wieder 
low ist. Verstehe ich hier etwas falsch oder bräuchte TI einen weiteren 
Eintrag im Errata-Sheet?

Beste Grüße,
odic


// select slave
d_SpiSlaveCS_1();

// write command byte
UCB0TXBUF = t_Data_UB;

// wait till TX buffer is empty
while(UCB0TXIFG != (IFG2 & UCB0TXIFG)){;}

// write checksum
UCB0TXBUF = (UBYTE)~t_Data_UB;

// wait till TX buffer is empty
while(UCB0TXIFG != (IFG2 & UCB0TXIFG)){;}

// wait till transmission is completed
while(UCBUSY == (UCB0STAT & UCBUSY)){;}

// wait before disabling CS (waiting for BUSY flag doesn't have the effect as expected)
for (i=0;i<600;i++){;}

// deselect slave
d_SpiSlaveCS_0();

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch wenn Du die Empfangsseite der SPI in Deinem Fall gar nicht nutzt, 
solltest Du trotzdem das UCB0RXIFG-Flag als Erkennung der 
abgeschlossenen Datenübertragung nutzen!

Autor: Odic X. (odic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan,

ich verstehe deine Antwort nicht ganz. Unter welchen Bedingungen wird 
denn das RX-Flag gesetzt? Ich empfange doch gar nichts...

Grüße,
odic

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SPI überträgt IMMER in beide Richtungen gleichzeitig. Sobalt du ein Byte 
raussendest, hast du auch 1 Byte empfangen. Ob du willst oder nicht :)

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann hast Du SPI noch nicht verstanden ;-)
Senden und Empfangen ist untrennbar miteinander verbunden.
Wenn Du Dir den User-Guide anschaust, wirst Du sehen, dass pro 
Taktperiode einmal gesendet wird (z.b. steigende Flanke) und einmal 
empfangen wird (fallende Flanke). Das RX-Flag wird gesetzt, wenn die 
Datenübertragung komplett zu Ende ist, und genau das ist auch der 
Zeitpunkt, den Du suchst!
Auch wenn Du gar nichts empfangen willst und der entspr. Pin 
unbeschaltet ist, wird dir Dein MSP trotzdem irgendwas in den 
Empfangsbuffer reintakten... Kann Dir egal sein, es geht ja nur ums 
Erkennen des Endes der Übertragung!

Autor: Odic X. (odic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Argh... ihr habt natürlich recht. Da hatte ich eben wohl einen argen 
Knoten im Hirn....

Besten Dank für die Erklärung.

Bleibt dennoch die Frage: Wofür dient das BUSY-Flag? Als (statische) 
Statusinformation scheint es nicht zu genügen, statt dessen muss ich 
immer den Kontext betrachten....



PS: Ich würde nicht unbedingt soweit gehen wollen zu sagen, dass ich SPI 
nicht verstanden hätte... ;-)

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.