SPI: ATMega8<=>ATMega644

Gast #1716769
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
lass einfach den mega644 bei jedem spi interrupt nen pin toggeln dann 
siehst du ob da der hund begraben liegt (ansonsten is vlt. dei 
verbindung im a****.
Gast
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.
Gast
Aha, mein MKII Programmierer stört beim Anschließen offensichtlich den 
BUS.


Wenn ich eine externe Spannungsquelle anschließe, fangen beide an zu 
zählen.


Danke nochmal ;)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.