SPI-Bug im MSP430??

OP #1260692
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();
Gast #1263423
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!
OP #1263480
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

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