SPI - Nach 3 Byte ist Schluss

Gast #2989748
Lesenswert?

Hallo da draußen,

ich habe hier ein Problem, dass ich mir nicht ganz erklären kann. Mit 
folgendem Code sende ich ein Byte über SPI und warte auf das Flag. am 
Oszi sehe ich, dass das auch wunderbar funktioniert. Wenn ich genau den 
gleichen Code 4 mal hintereinander schreibe, sendet der Controller 
(dsPIC33) aber nur 3 Bytes. Nach dem dritten Byte scheint das Flag 
einfach nicht gesetzt zu werden. Hat jemand eine Idee, woran das liegen 
kann?
1
IFS0bits.SPI1IF = 0;
2
SPI1BUF = temp;        
3
while (!IFS0bits.SPI1IF)
4
{
5
     continue;
6
}

Außerdem müsste sich doch die Taktfrequenz ändern, wenn ich den 
prescaler verstelle? Entsprechende Änderungen im SPI1CON1 scheinen 
keinen Einfluss zu haben.
1
SPI1STAT = 0x8000;
2
SPI1CON1 = 0x003A;
3
SPI1CON2 = 0x0001;
Gast #2990024
Lesenswert?

Walther von der Vogelweide schrieb:
> Außerdem müsste sich doch die Taktfrequenz ändern, wenn ich den
> prescaler verstelle? Entsprechende Änderungen im SPI1CON1 scheinen
> keinen Einfluss zu haben.

Könnte an einer falschen Reihenfolge liegen (SPIEN gesetzt, bevor 
SPICONx beschrieben werden). Guck mal ins Datenblatt, da steht genau 
drinn, in welcher Sequenz man die Register beschreiben muß.
Gast #2990449
Lesenswert?

Danke für den Tip, im Datenblatt steht zwar nichts zur Reihenfolge aber 
dafür in der SPI Application Note von Microchip. Hoffentlich komme ich 
morgen dazu es mit neuer Reihenfolge zu probieren.
Gast #2990467
Lesenswert?

Walther von der Vogelweide schrieb:
> Danke für den Tip, im Datenblatt steht zwar nichts zur Reihenfolge

Schau mal hier:
http://ww1.microchip.com/downloads/en/DeviceDoc/70206D.pdf

Da steht so was drinn wie

1.If using interrupts, configure the Interrupt controller:
(...)
2.Set the Master Mode Enable bit (MSTEN) in the SPIxCON1 register 
(SPIxCON1<5> = 1).
3.Clear the Receive Overflow Flag bit (SPIROV) in the SPIxSTAT register 
(SPIxSTAT<6> = 0).

usw.
#2990857
Lesenswert?

Da SPI von Natur aus immer Vollduplex arbeitet, kommt mit jedem 
gesendeten Byte auch automatisch eines im SPIBUF an.

Es ist daher unbedingt erforderlich, den SPIBUF nach jeder Sendung zu 
lesen, z.B.  dummy = SPIBUF.

Wenn man das nicht macht, läuft der Empfangspuffer über und es wird ein 
(Fehler-)Flag gesetzt - Namen weiss ich jetzt nicht auswendig.
Das kann auch der Grund für das Fehlverhalten sein.
Gast #2991412
Lesenswert?

Das Dokument meinte ich mit Application Note. Habe es nun genau wie dort 
beschrieben gemacht und es hat leider immer noch nicht funktioniert. Als 
ich dann aber den Buffer immer brav ausgelesen habe, hat es 
funktioniert. :D
Vielen Dank für die Hilfe!

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