Forum: Compiler & IDEs ATMegas über SPI verbinden


von Max (Gast)


Lesenswert?

Hallo zusammen,

ich hoffe ihr könnt mir Helfen. Ich versuche mehrere AVR via SPI zu 
verbinden, momentan kommt am ende nur dummes zeug raus. Ich habe mich 
die letzten Tage in SPI eingelesen und hab auch schon einiges hier im 
Forum gelesen komme jetzt aber nicht mehr weiter.

Anbei hängen die Codes der Master und Slaves.

Mein Problem ist das ich noch nicht mal weiß ob ich das mit dem SPI 
richtig verstanden habe. Bei meinem Programm schicke ich z.B. 1,2,3,4 
über die serielle schnittstelle und müste ein 0,1,2,3 zurück bekommen. 
Ich bekomme aber immer den Wert 255 zurück.


Master: ATMega644
1
#include <inttypes.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <stdlib.h>
5
6
7
ISR(USART0_RX_vect)
8
{  
9
  uint8_t x;
10
  x = UDR0;
11
  SPI_MasterT(x);
12
}
13
14
void USART_Trans (uint8_t data)
15
{
16
  while(!(UCSR0A & (1<<UDRE0)));
17
  UDR0 = data;
18
}
19
20
void SPI_MasterInit(void)
21
{
22
  PORTB = (1<<PB5)|(1<<PB7);
23
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
24
}
25
26
void SPI_MasterT(uint8_t cData)
27
{
28
  SPDR = cData;
29
  while(!(SPSR & (1<<SPIF)))
30
  ;
31
  USART_Trans(SPDR);
32
}
33
34
35
36
int main(void)
37
{  
38
  SPI_MasterInit();
39
  UBRR0 = 77;
40
  UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
41
  UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
42
  
43
  sei();
44
45
  while (1)
46
  {  
47
    asm volatile("NOP");
48
    asm volatile("NOP");
49
    asm volatile("NOP");    
50
  }
51
  
52
}

Slave:ATMega8515
1
#include <inttypes.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <stdlib.h>
5
6
volatile unsigned char Data;
7
8
void SPI_SlaveInit(void)
9
{
10
  PORTB = (1<<PB4);
11
  SPCR = (1<<SPE);
12
}
13
14
void SPI_SlaveR(void)
15
{
16
  while(!(SPSR & (1<<SPIF)))
17
  ;
18
  Data = SPDR;
19
}
20
21
int main(void)
22
{  
23
  uint8_t Data;
24
25
  SPI_SlaveInit();
26
  
27
  sei();
28
29
  while (1)
30
  {  
31
    SPI_SlaveR();
32
    SPDR = Data;              
33
  }
34
  
35
}

von Stefan E. (sternst)


Lesenswert?

Wenn weder am Master, noch am Slave auch nur ein Pin als Ausgang 
definiert wurde, kann auch keine Datenkommunikation stattfinden. Und ein 
SS-Handling ist auch nicht vorhanden.

von Ulf R. (roolf)


Lesenswert?

Max schrieb:
> Hallo zusammen,
>
> ich hoffe ihr könnt mir Helfen. Ich versuche mehrere AVR via SPI zu
> verbinden

SPI und USART sind zwei verschiedene Dinge.  Der Code enthält nach 
meinem Verständnis ein bisschen von jedem.

von hp-freund (Gast)


Lesenswert?


von Malte (Gast)


Lesenswert?

Moin,
ich versuche gerade das gleiche.. (Atmega16 ->Atmega8)
Benötige ich eine Leitung für SS? Zurzeit habe ich bei dem Slave diese 
Leitung fest auf GND geleget. Beim Master ist dieser Ausgang 
unbeschaltet/offen.
Eine Verbindung kommt scheinbar zustande, jedoch scheinen die Bits der 
MISO um einen Takt verschoben zu sein.

Gruß
Malte

von Flo (Gast)


Lesenswert?

ja mit SS fest auf gnd kannst du den Empfänger halt nicht mehr 
synchronisieren, falls er mal z.B. durch Störungen beeinflußt worden 
ist.

Bei so einer Verbindung sollten vorallem die Wartezeiten zu 
Programmanfang beim Master länger als beim Slave sein, da der Slave 
sonst schon zu Beginn nicht mitkommt.

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.