SPI: ATMega8<=>ATMega644

Gast #1716769
Lesenswert?
• ▲
▼
Hallo,

ich möchte 2 µC per SPI verbinden. Det atmega8 (16 Mhz) sendet in einer 
Endlosschleife ein Byte was jede Sekunde um 1 erhöht wird.

Slave ist der ATMega644 (20 Mhz). Er wartet testweise auf die zu 
empfangenen Bytes und gibt das empfangene Byte auf einem Display als 
Zahl aus.

Um zu überprüfen wie viele Byte bereits empfangen wurden wird in der 2. 
Zeile angegeben wie viele Bytes bisher empfangen wurden.


Leider steht in der 2. Zeile immer eine 0 und die erste Zeile bleibt 
leer. Er empfängt also nichts. Um zu überprüfen ob die Sendeschleife 
auch läuft habe ich nach jedem Senden einen Ausgangspin invertiert -> 
Ja, er sendet.


MOSI <=> MOSI
MISO <=> MISO
SS <=> SS
GND <=> GND

Master:
1
void SPI_MasterInit(void)
2
{
3
  /* Set MOSI and SCK output, all others input */
4
  DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK);
5
  /* Enable SPI, Master, set clock rate fck/16 */
6
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
7
}
8

9
void SPI_MasterTransmit(char cData)
10
{
11
  /* Start transmission */
12
  SPDR = cData;
13
  /* Wait for transmission complete */
14
  while(!(SPSR & (1<<SPIF)))
15
    ;
16
}
17

18
int main(void) 
19
{  
20
  char i = 0;
21
  SPI_MasterInit();
22
  DDR_SPI |= (1<<DD_SS);
23
  while(1)
24
  {
25
    PORTB &=~(1<<DD_SS);    //  Aktiviere Slave
26
    wait_ms(1);
27
    SPI_MasterTransmit(i++);
28
    wait_ms(1);
29
    PORTB |=(1<<DD_SS);    // Deaktiviere Slave
30
    wait_ms(1000);
31
  }
32
  return 0;
33
}


Slave:
1
void SPI_SlaveInit(void)
2
{
3
  /* Set MISO output, all others input */
4
  DDR_SPI = (1<<DD_MISO);
5
  /* Enable SPI */
6
  SPCR = (1<<SPE);
7
}
8

9
char SPI_SlaveReceive(void)
10
{
11
  /* Wait for reception complete */
12
  while(!(SPSR & (1<<SPIF)))
13
    ;
14
  /* Return Data Register */
15
  return SPDR;
16
}
17

18
int main(void)
19
{
20
  uint16_t i=0;
21
  char string[20];
22
  DDRB=1;
23
  
24
  LCDInit();
25
  SPI_SlaveInit();
26
  
27

28
  while(1)
29
  {
30
    itoa(i++,string,10);
31
    LCDSetCursorPos(1,0);
32
    LCDWrite(string);
33
    
34
    itoa(SPI_SlaveReceive(),string,10);
35
    LCDSetCursorPos(0,0);
36
    LCDWrite(string);
37
  }
38
  return 0;
39
}


Weiß jemand woran das liegen könnte? Danke schonmal.

Tobi
Gast #1716819
Lesenswert?
• ▲
▼
Hallo Max,

danke für die Unterstützung!

Ich habe nochmal die Verbindung durchgeklingelt, alles sauber. Habe auch 
nochmal die Define's mit den Datenblättern und der Verdrahtung gecheckt, 
auch richtig.

Das Pin-Toggeln brauche ich denke ich nicht versuchen, da er das 
gezählte Ankommen ja sowieso mit dem i++ zählt und auf dem Display 
ausgeben würde.

Ich habe jetzt auch den atmega8 ausgetauscht und programmiert. Dabei 
sind Daten über die MOSI Leitung zum Slave gewandert und das Display hat 
eine 212 und eine 624 angezeigt. Dies verdeutlich, dass die 
physikalische Verbindung da ist.

Aber auch der neue Controller lässt das Display des Slave eine leere 
Zeile und eine Null anzeigen.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.