www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega48 als SPI-Slave


Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MaN (Gast)
Datum:

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

aber ist nur so ne Vermutung :)

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tip!

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: MaN (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.