Forum: Mikrocontroller und Digitale Elektronik ATmega1280 SPI kein SPIF-Flag


von Ralf (Gast)


Lesenswert?

Hallo,

ich habe hier ein Problem mit einem Mega1280, bei dem ich vergeblich 
versuche die SPI-Schnittstelle in Betrieb zu nehmen.

Ich halte mich an das Code Beispiel im Datenblatt, aber irgendwo muss 
ich wohl etwas übersehen haben.

void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
}

Offenbar wird das SPIF Flag nicht gesetzt, so dass ich in der while 
Schleife hängen bleibe. Der AVR Studio Simulator bestätigt mir das auch.


Auffällig finde ich, dass bei der Simulation mit dem AVR-Studio nach 
einigen, wenigen Takten nach beschreiben des SPCR-Registers mit:

SPCR |= (1 << SPE) | (1 << MSTR)| (1<<SPR1);

das SPIF Flag gesetzt wird. Komischerweise wird gleichzeitig auch das 
MSTR Bit wieder gekippt. Beim ersten Schreiben in das Senderegister wird 
dann das Write Collision Flag gesetzt und das SPIF Flag gekippt.

Erklären kann ich mir das nur so, dass vor dem Beschreiben des 
Senderegisters das SPIF Flag bzw. das SPSR Register nicht gelesen wurde 
und daher ein unzulässiger Zugriff auf das Datenregister erkannt wird. 
Als Folge wird dann das Write Collision Flag gesetzt.

Meine Frage ist aber nun, warum direkt nach dem Beschreiben des SPCR 
Registers das SPIF-Flag gesetzt und das MSTR Flag wieder gekippt wird.

Danke & Gruß

Ralf

von spess53 (Gast)


Lesenswert?

Hi

> Komischerweise wird gleichzeitig auch das MSTR Bit wieder gekippt.

Liegt möglicherweise an:  21.1 SS Pin Functionality (Datenblatt).

MfG Spess

von Gerhard G. (g_g)


Lesenswert?

Hallo,

#define CTRL_PORT   DDRB
#define DATA_PORT   PORTB
#define SS_PIN      PB0
#define CLK_PIN     PB1
#define MOSI_PIN    PB2
#define MISO_PIN    PB3

int main(){

* CTRL_PORT = _BV(MOSI_PIN) | _BV(CLK_PIN) | _BV(SS_PIN);

...

}

* Muss zuerst abgearbeitet werden.

Sonst ist die SPI-Schnittstelle nicht in der Lage Daten zu übertragen.


Gruß G.G.

von Ralf (Gast)


Lesenswert?

...verdammt!

Danke!!!:-)
Ich verwende einen anderen Pin als Slave Select und habe den 
eigentlichen SS-Pin gar nicht betrachtet. Er muss als Ausgang geschaltet 
sein oder auf High gehalten werden.

Gruß

Ralf

von Gäst_5 (Gast)


Lesenswert?

Hallo,

ich möchte das Thema noch einmal aufgreifen.
Ich habe das selbe Problem wie oben beschrieben.

Ich habe am SPI Interface 2 Slaves angeschlossen.
Einziger unterschied der beiden Slaves im Anschluss bildet die 
CS-Leitung.
Einen habe ich an SS angeschlossen, den anderen an den PIN D4.

Wenn ich das Slave welches den CS an D4 hat ansprechen möchte, muss ich 
die SS Leitung auf Ausgang schalten?
Oder wie wird das gemacht?

von spess53 (Gast)


Lesenswert?

Hi

>Wenn ich das Slave welches den CS an D4 hat ansprechen möchte, muss ich
>die SS Leitung auf Ausgang schalten?
>Oder wie wird das gemacht?

Indem man die CS-Leitung des anzusprechenden Slaves auf  L legt und alle 
anderen auf H (L-Aktives CS vorrausgesetzt). Alle CS-PINS sind als 
Ausgang zu konfigurieren.

MfG Spess

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.