www.mikrocontroller.net

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


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Ralf (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hi

> Komischerweise wird gleichzeitig auch das MSTR Bit wieder gekippt.

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

MfG Spess

Autor: G. G. (g_g)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Ralf (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net