Zu blöd zum SPI!

Gast #681797
Lesenswert?

Hallo,

ich bin mit einem ATMega16 an einem Projekt dran. Ich benutze AVR Studio 
und einen Billig ISP Parallelport Programmer (2 Widerstände). An dem SPI 
hängt ein Dataflash und ein FPGA (später noch eine SD-Card). 
Funktioniert alles wunderbar.
Jetzt habe ich aus Speicherplatz gründen einen ATMega644 eingesetzt. 
Alle Register angepasst und habe nun das Problem, das das senden von SPI 
(warten auf das SPIF-Bit) nur für ein einziges Byte funktioniert.
Sprich : Ich sende ein Byte, und beim 2. Byte bleibt der uC in der 
While-Schleife hängen.

Ich habe den ganz normalen "Standard" Code für SPI verwendet

void vSPIInit (void)
{
  PRR  &= ~(1 << PRSPI);
  DDRB |= (1<<5)|(1<<7);
  SPCR  = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
  SPSR  = 0;
}


UCHAR ucSPITransceiveByte (UCHAR ucData)
{
  PRR  &= ~(1 << PRSPI);
  SPDR = ucData;
  while(!(SPSR & (1<<SPIF)));
  return SPDR;
}

Im Datenblatt steht auch nicht viel mehr (bis auf das man PRR auf 0 bzw. 
das 2. Bit im PRR löschen sollte/muß)
Was kann das sein, das so etwas einfaches nicht funktioniert ?! Vor 
allem hatte ich auf dem ATMega16 keine solchen Probleme. Und das 
SPI-Interface sollte doch so einfach sein das es sich ohne größere 
Probleme portieren (zumindest auf den ATMegas) lässt oder ?

Gruß
Rene
Gast #681842
Lesenswert?

wo soll denn der unterschied zwischen meinem code und dem aus dem 
datenblatt sein ?!
ich sehe da keinen (bis auf die geschichte mit PRR)
das ist ja das was ich nicht verstehe. der code ist auf dem mega16 und 
dem mega644 derselbe (laut datenblatt), aber es funktioniert einfach 
nicht.
port-pins gesetzt laut datenblatt. initialisierung laut datenblatt und 
es läuft einfach nicht.

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