Forum: Mikrocontroller und Digitale Elektronik SPI: ATMega8<=>ATMega644


von Tobi W. (Gast)


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

von Max (Gast)


Lesenswert?

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****.

von Tobi W. (Gast)


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.

von Tobi W. (Gast)


Lesenswert?

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 ;)

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.