ATMega48 als SPI-Slave

Gast #666634
Lesenswert?

Hallo zusammen

Ich habe den ATMega48 wie folgt als SPI-Slave konfiguriert:

void SPI_SlaveInit(void)
{
  // Port B initialization
  PORTB=0x00;
  DDRB=0x10;

       /* Set MOSI and SCK output, all others input */
  DDRB = (1<<DDB3);
  /* Enable SPI, Master, set clock rate fck/16 */
  SPCR = (1<<SPE);
}

char SPI_SlaveReceive(void)
{
  /* Wait for reception complete */
  while (!(SPSR) & (1<<SPIF));

  return SPDR;
}

void SPI_SlaveTransmit(char cData){
  /* Start transmission */
  SPDR = cData;

  /* Wait for reception complete */
  while (!(SPSR & (1<<SPIF)));
}

Sobald ich jedoch SPI_SlaveReceive() ausführe in einer while(1) loop 
wird nicht gewartet bis ein Zeichen anliegt und wird demzufolge nicht 
ausgelesen.

Hab ich irgendwas in der Konfiguration vergessen?

Vielen Dank.
Gast #666924
Lesenswert?

So viel ich weiß kannst du sofort danach die receive Funktion nochmal 
aufrufen um ein 2. Byte auszulesen. Wenn du mit return SPDR das Byte 
zurückgibst wird es nämlich intern wieder gelöscht und du kannst sofort 
das nächste Byte empfangen. So ist es jedenfalls bei UART und ich glaub 
nicht, dass das bei SPI anders ist.

Was aber wahrscheinlich komfortabler wäre, ist das ganze mit Interrupts 
zu lösen. Da wird dann bei jedem empfangenen Byte eine 
Interrupt-Funktion aufgerufen die das Byte ausließt und z.B. in nem 
char-Array speichert. Wenn du dann ein bestimmtes Stoppzeichen (z.B. \n 
(LF)) erhälst ruft die Interrrupt-Funktion dann eine Funktion auf, die 
das Array dann auswertet. So würde ich das jedenfalls machen.

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