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


von Odic X. (odic)


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


1
// select slave
2
d_SpiSlaveCS_1();
3
4
// write command byte
5
UCB0TXBUF = t_Data_UB;
6
7
// wait till TX buffer is empty
8
while(UCB0TXIFG != (IFG2 & UCB0TXIFG)){;}
9
10
// write checksum
11
UCB0TXBUF = (UBYTE)~t_Data_UB;
12
13
// wait till TX buffer is empty
14
while(UCB0TXIFG != (IFG2 & UCB0TXIFG)){;}
15
16
// wait till transmission is completed
17
while(UCBUSY == (UCB0STAT & UCBUSY)){;}
18
19
// wait before disabling CS (waiting for BUSY flag doesn't have the effect as expected)
20
for (i=0;i<600;i++){;}
21
22
// deselect slave
23
d_SpiSlaveCS_0();

von Stefan (Gast)


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!

von Odic X. (odic)


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

von Jörg S. (joerg-s)


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 :)

von Stefan (Gast)


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!

von Odic X. (odic)


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... ;-)

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.