ATMegas über SPI verbinden

Gast #1601492
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
}
Gast #1609688
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
Gast #1609698
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren