www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit SPI


Autor: Fritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgendes Problem.

Ich schicke Daten über SPI mit Atmega644.

So sieht der Code aus:

SPDR = 1;                        //eine 1 über SPI versenden
while(!(SPSR&(1<<SPIF)));        //Auf Interrupt warten
bData1 = SPDR;                   //Interrupt Flag zurückgesetzt

SPDR = 2;
while(!(SPSR&(1<<SPIF)));        //Auf Interrupt warten
bData2 = SPDR;


Leider die zweite while-Schleife hängt. Also es kommt kein Interrupt, 
wenn ich SPDR = 2 versende. Woran kann das liegen??

Autor: Fritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe gerade festgestellt, dass WCOL Bit nach der ersten Übertragung 
gesetzt wird!! Das ist ein Kollisionsflag.

The WCOL bit is set if the SPI Data Register (SPDR) is written during a 
data transfer. The WCOL bit (and the SPIF bit) are cleared by first 
reading the SPI Status Register with WCOL set, and then accessing the 
SPI Data Register.

Warum wird dieser Flag gesetzt? Hat jemand eine Idee, warum die SPI 
Übertragung nicht geht, bzw. warum eine Kollision entsteht?

Danke!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fritz wrote:

> Hat jemand eine Idee...
> ...warum eine Kollision entsteht?

Das Datenblatt deines geringsten Misstrauens.  Es schreibt:
The WCOL bit is set if the SPI Data Register (SPDR) is written during
a data transfer.

Ich vermute mal, dein SPIF ist noch von einer früheren Operation
möglicherweise gesetzt.  Damit wartet die erste Schleife nicht, weil
es zum Beginn des Transfers nicht gelöscht worden ist.

Es müsste eigentlich helfen, ein
(void)SPSR;
obendrüber zu schreiben (über den ersten Transfer).

Autor: Uqzze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachdem ich das gemacht habe, hängt die erste Schleife auch!! Also es 
wird nicht mal ein Byte gesendet!

Autor: Fritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WCOL ist gesetzt!! Der Register SPSR hat den Wert 01000000, und das ist 
WCOL Bit -> Kollisionflag.

Woran kann es liegen?!

Im Programm habe ich keinen weiteren Code, nur diese Zeilen mit SPI 
Übertragung.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du den SS Pin auf Ausgang programmiert ?
Oder wenigstens als Eingang mit Pullup ?

Autor: Fritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe den als Ausgang programmiert.

Autor: Fritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Code sieht so aus:

SPCR0 = (1<<SPE0)|(1<<MSTR0)|(1<<SPR00); // SPI Enable; as Master; 
fck/64
printf ("1");  //Ausgabe über COM

(void)SPSR0;  //SPSRO wird zurückgesetzt
(void)SPDR0;  //SPDR0 wird zurückgesetzt
SPDR0 = 0b00000001;   //SPI Data zum Verschicken
while(!(SPSR0 & (1<<SPIF0)));    // wird auf Interruptanforderung 
gewartet
printf ("2"); ->>> Diese Zeile wird nie ausgeführt, es läuft die 
while-Schleife!! Wenn ich SPSR0 anzeigen lasse, dann ist WCOL 
(Kollisionsflag) gesetzt.

:-( Ich bin verzweifelt... was kann das Problem sein?

Autor: Fritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube das Problem liegt an der Hardware. Weil der Code geht an der 
STK500! Welche Ursache kann dieses Problem haben? Kann sein, dass ich 
etwas falsch verbunden habe?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.