www.mikrocontroller.net

Forum: Compiler & IDEs ATMegas über SPI verbinden


Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>


ISR(USART0_RX_vect)
{  
  uint8_t x;
  x = UDR0;
  SPI_MasterT(x);
}

void USART_Trans (uint8_t data)
{
  while(!(UCSR0A & (1<<UDRE0)));
  UDR0 = data;
}

void SPI_MasterInit(void)
{
  PORTB = (1<<PB5)|(1<<PB7);
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

void SPI_MasterT(uint8_t cData)
{
  SPDR = cData;
  while(!(SPSR & (1<<SPIF)))
  ;
  USART_Trans(SPDR);
}



int main(void)
{  
  SPI_MasterInit();
  UBRR0 = 77;
  UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
  UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
  
  sei();

  while (1)
  {  
    asm volatile("NOP");
    asm volatile("NOP");
    asm volatile("NOP");    
  }
  
}

Slave:ATMega8515
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>

volatile unsigned char Data;

void SPI_SlaveInit(void)
{
  PORTB = (1<<PB4);
  SPCR = (1<<SPE);
}

void SPI_SlaveR(void)
{
  while(!(SPSR & (1<<SPIF)))
  ;
  Data = SPDR;
}

int main(void)
{  
  uint8_t Data;

  SPI_SlaveInit();
  
  sei();

  while (1)
  {  
    SPI_SlaveR();
    SPDR = Data;              
  }
  
}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ulf Rolf (roolf)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.