Forum: Mikrocontroller und Digitale Elektronik SPI will nicht


von Michael G. (linuxgeek) Benutzerseite


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:
1
void spi_master_init(void)
2
{
3
  DDR_SPI |= (1 << DISP_SI) | (1 << DISP_CLK);
4
5
  /* SPE:   SPI enable
6
   * MSTR:  SPI master mode
7
   * CPOL:  clock polarity (high when idle)
8
   * CPHA:  clock phase (trailing edge)
9
   * frequency: F_OSC/32 => 250KHz
10
   */
11
  SPCR |= (1 << SPE) | (1 << MSTR) | (1 << CPOL) | (1 << CPHA) | (1 << SPI2X) | (1 << SPR1);
12
  _delay_ms(100);
13
}

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

von Matthias L. (Gast)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

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

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Erm... dass ich natuerlich Daten sende sollte klar sein.

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

von Andreas K. (a-k)


Lesenswert?

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

von Michael G. (linuxgeek) Benutzerseite


Angehängte Dateien:

Lesenswert?

There you go.

von Benedikt K. (benedikt)


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.

von Andreas K. (a-k)


Lesenswert?

Woher weisst du, dass am SPI nichts passiert?

von Andreas K. (a-k)


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.

von Michael G. (linuxgeek) Benutzerseite


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?

von Benedikt K. (benedikt)


Lesenswert?

Michael G. wrote:

> Was soll am SP2X "falsch platziert" sein.

RTFM !!!

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Benedikt Dir scheint schon die Sonne aus dem Arsch, was?

von Andreas K. (a-k)


Lesenswert?

PLONK

von Michael G. (linuxgeek) Benutzerseite


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.

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.