SPI-Schnittstelle mit avrgcc

Gast #12187
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
Gast #12188
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;
}
Gast #12190
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

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