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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.