Forum: Mikrocontroller und Digitale Elektronik SPI-Schnittstelle mit avrgcc


von Josef (Gast)


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

von Michael (Gast)


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;
}

von Christian (Gast)


Lesenswert?

Hallo Michael

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

Viele Grüße

Christian

von Christian (Gast)


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

von Peter (Gast)


Lesenswert?

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

Beste Grüsse,

Peter

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.