www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI will nicht


Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

leider kann ich mit meinem Atmega8 SPI im Master mode nicht zur 
Mitarbeit ueberreden - es passiert garnichts. Weder an SCK noch an MOSI.

Ich verwende folgenden Code:
void spi_master_init(void)
{
  DDR_SPI |= (1 << DISP_SI) | (1 << DISP_CLK);

  /* SPE:   SPI enable
   * MSTR:  SPI master mode
   * CPOL:  clock polarity (high when idle)
   * CPHA:  clock phase (trailing edge)
   * frequency: F_OSC/32 => 250KHz
   */
  SPCR |= (1 << SPE) | (1 << MSTR) | (1 << CPOL) | (1 << CPHA) | (1 << SPI2X) | (1 << SPR1);
  _delay_ms(100);
}

Hinweis: SS ist als Output konfiguriert. Das sollte aber keine Probleme 
machen duerfen. Im Master Mode ist SS nach Datenblatt konfigurierbar und 
ein "general output". Als solchen verwende ich ihn derzeit auch (habe 
eine LED dran), er ist also als Ausgang konfiguriert.

Initial setze ich PortB komplett als Output.
Worin koennte das Problem bestehen?

Danke fuer Eure Hilfe.

P.S. Ein kleiner Abschnitt zu SPI im Tutorial waere mal nicht schlecht.

Gruss,
Michael

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst schon was senden, sonst passiert an den Pins auch nichts.
SPDR = 0x55;

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was erwartest du denn vom SPI, wenn du ihm keine Arbeit gibst? Nur durch 
Initialisieren allein spielt das SPI noch keine Musik.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erm... dass ich natuerlich Daten sende sollte klar sein.

Das lustige ist uebrigens, dass er da problemlos durchkommt, also SPIF 
geloescht wird.
void spi_transmit(uint8_t data)
{
  _delay_us(1);
  SPDR = data;
  _delay_us(1);
  while (!(SPSR & (1 << SPIF)));
}

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann zeig halt mal den gesamten relevanten Teil und nicht immer nur 
diejenigen Häppchen, in denen der Fehler garantiert nicht liegt.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
There you go.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Seit wann ist SPI2X im SPCR ?
Die gesamte Zeile mit dem SPCR|= ist sehr fehleranfälllig, da du nicht 
weißt was vorher drin steht.
Genauso hier: DDR_SPI |= (1 << DISP_SI) | (1 << DISP_CLK);
Das kannst du dir sparen, wenn du DDRB sowiso schon auf 0xFF setzt.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woher weisst du, dass am SPI nichts passiert?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo, das "SPCR |= ..." ergibt keinen Sinn, "SPCR = ..." ist besser.

Aber wenn der frisch aus dem Reset kommt, ist der Inhalt sauber 
definiert vorher 0. Das kann also kaum die Ursache sein.

Ebenso führt das falsch plazierte SP2X nur zu einem anderen Takt, /128 
statt /32.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joa ich hatts schon auf SPRC = ..., vorher.
Taktkombinationen hab ich auch schon alle moeglichen ausprobiert.
Was soll am SP2X "falsch platziert" sein.


Naja woher ich es weiss: Weil ich nachgemessen habe?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael G. wrote:

> Was soll am SP2X "falsch platziert" sein.

RTFM !!!

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benedikt Dir scheint schon die Sonne aus dem Arsch, was?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PLONK

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit nem Oszi. Und nicht garnichts. Das Teil geht nach dem Reset des 
Controllers und dem Initialisierungsaufruf von High auf Low. Das 
bezeichne ich aber als "nichts", weil sich beim Senden nichts tut.

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.