ATMegas über SPI verbinden

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

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.