Forum: Mikrocontroller und Digitale Elektronik SPI - Nach 3 Byte ist Schluss


von Walther von der Vogelweide (Gast)


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;

von Bronco (Gast)


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ß.

von Walther von der Vogelweide (Gast)


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.

von Bronco (Gast)


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.

von Dieter W. (dds5)


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.

von Walther von der Vogelweide (Gast)


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!

von Bronco (Gast)


Lesenswert?

Walther von der Vogelweide schrieb:
> Als
> ich dann aber den Buffer immer brav ausgelesen habe, hat es
> funktioniert. :D

Interessant!
Hätte nicht gedacht, daß ein Receive-Overflow dazu führt, daß keine 
Daten mehr gesendet werden.

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.