www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI-Schnittstelle mit avrgcc


Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
nach einiger vergeblicher Internet Recherche frag' ich doch mal hier im 
Forum - wie kann man die SPI schnittstelle in C realisieren??? Ich hab' 
zwar auf www.avrfreaks.net zahlreiche pdf's zu dem Thema gefunden, aber 
irgendwie sind die alle ein bisschen kompliziert.....

Freu mich über eure Antworten!!!

mfg
Christian

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Christian,
Hier sind zwei C-Programme mit denen du zwei
Atmels miteinander komunizieren lassn kannst.
Die Tasten im Master-Prog sind zur Kontrolle.
Ueber Portc kannst du dir die zurueckgesendeten Daten
anschauen.

Gruss Michael

// MASTER


#include <io.h>

int main(void)
{
  unsigned int dataout;

  outp(0xFF, DDRA);  //Port A als Ausgang
  outp(0xFF, DDRC);  //Port C als Ausgang
  outp(0x00, DDRD);  //Port D als Eingang

  outp(0x11, PORTA);  //11 Fuer definierten Zustand
  outp(0x11, PORTC);  //11 Fuer definierten Zustand

  outp(0X00, SPDR);


  outp(0x70, PORTB);  //01110000
  outp(0xB0, DDRB);  //1011 0000
  outp(0x50, SPCR);  //0101 0000


  sbi(PORTB, 4);

  while ((inp(PIND)&(0x01))==0);
  cbi(PORTB, 4);

  dataout=0xFF;
  outp(dataout, SPDR);
  outp(dataout, PORTA);
  while(bit_is_clear(SPSR, SPIF));
  outp((inp(SPDR)), PORTC);
  cbi(SPSR, 7);

  while ((inp(PIND)&(0x02))==0);
  dataout=0x55;
  outp(dataout, SPDR);
  outp(dataout, PORTA);
  while(bit_is_clear(SPSR, SPIF));
  outp((inp(SPDR)), PORTC);
  //cbi(SPSR, 7);

  while ((inp(PIND)&(0x04))==0);
  dataout=0xaa;
  outp(dataout, SPDR);
  outp(dataout, PORTA);
  while(bit_is_clear(SPSR, SPIF));
  outp((inp(SPDR)), PORTC);
  //cbi(SPSR, 7);


  while ((inp(PIND)&(0x08))==0);
  dataout=0xcc;
  outp(dataout, SPDR);
  outp(dataout, PORTA);
  while(bit_is_clear(SPSR, SPIF));
  outp((inp(SPDR)), PORTC);
  //cbi(SPSR, 7);
return 0;
}


//Slave
#include <io.h>

int main(void)
{
  outp(0xFF, DDRC);

  outp(0x00, PORTC);

  outp(0x00, SPDR);
  outp(0x40, SPCR);  //0100 0000
  outp(0x40, DDRB);  //0100 0000


  while(1)
  {
    while(bit_is_clear(SPSR, SPIF));
    outp((inp(SPDR)), PORTC);
    cbi(SPSR, 7);
  }




return 0;
}

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Michael

vielen lieben Dank für deine Antwort!!!!!
Ich hoffe es funktioniert bei mir auch bald....

Viele Grüße

Christian

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Halli Hallo
ich möchte wegen den Speicher ressourcen gerne zwei Mega 16 oder 32 
miteinander kommunizieren lassen - ich benötige allerdings nicht so 
viele Pins , jedoch könnte es sein, dass der interne 10bit A/D Wandler 
nicht ausreicht --> eventuell brauch ich die SPI schnittstelle noch, 
damit mein Slave Controller die Daten von dem AD Wandler holen kann - 
dann kann aber doch mein Master nicht mehr mit dem Slave reden, oder???
Da liegt es doch irgendwie nahe eine prallele Kommunikation über einen 
ganzen Port und ein paar Steuerleitungen jedes MC's aufzubuen - oder 
spricht da etwas dagegen????

Vielen Dank für eure Antworten!

Christian

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Seltsamer Code, wass soll denn das cbi(SPSR,7) ??? SPSR kann nur gelesen 
werden.

Beste Grüsse,

Peter

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.