Forum: Mikrocontroller und Digitale Elektronik ATMega48 als SPI-Slave


von Marc (Gast)


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.

von MaN (Gast)


Lesenswert?

vielleicht solltest du mal anstat
1
 while (!(SPSR) & (1<<SPIF));
das hier probieren:
1
 while ( !( (SPSR) & (1<<SPIF) ) );

aber ist nur so ne Vermutung :)

von Marc (Gast)


Lesenswert?

Danke für den Tip!

von Marc (Gast)


Lesenswert?

Aber was passiert nun wenn das nächste Byte kommt? Darf ich dann 
umgehend mit 2ndbyte = SPI_SlaveReceive() das nächste Byte einlesen oder 
muss da eine bestimmte Zeit noch gewartet werden?

von MaN (Gast)


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.

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.