www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI Bidirektional


Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich habe SPI soweit programmiert, dass ich mit untenstehender Routine 
ein Byte an den Slave schicken kann.:

char SPI_MasterTransmit(char cData)
{
  uint8_t rc;

  PORTB &= ~(1<<0);  //SS low
  // Start transmission
  SPDR = cData;

  while(!(SPSR & (1 << SPIF)));
  rc = SPDR;

  // Wait for transmission complete
  PORTB |= (1<<0);  //SS high

  return (SPDR);
}

Nun weiss ich, dass ich mit folgedem Codestück ein Byte auf dem Slave 
empfangen kann, wenn SPI_SlaveReceive() ausgeführt wurde.

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

  return SPDR;
}

Nun möchte ich, dass der Slave gleichzeitig beim Empfang auch ein 
Zeichen an den Master zurückschick (also ein Byte exchange), was mit SPI 
ja möglich sein sollte. Muss ich dass Zeichen nun unmittelbar nach dem 
Empfang auf den Bus legen oder muss dies vor dem Empfang schon 
passieren?

Vielen Dank.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Jonas (Gast)

>Ich habe SPI soweit programmiert, dass ich mit untenstehender Routine
>ein Byte an den Slave schicken kann.:

Und das geht auch wirklich? Deine Kommentare verwirren ein wenig. 
Ausserdem liest du SPDR doppelt, das is unnötig und kann ggf. ins Auge 
gehen. Eher so.
char SPI_MasterTransmit(char cData)
{
  uint8_t rc;

  PORTB &= ~(1<<0);  //SS low
  
  SPDR = cData;            // Start transmission

  while(!(SPSR & (1 << SPIF)));    // Wait for transmission complete
  rc = SPDR;
  PORTB |= (1<<0);  //SS high

  return rc;
}

>Nun weiss ich, dass ich mit folgedem Codestück ein Byte auf dem Slave
>empfangen kann, wenn SPI_SlaveReceive() ausgeführt wurde.

Nöö, das ist eine Illusion. Du müsstes ja erstmal die Übertragung 
starten.

>Nun möchte ich, dass der Slave gleichzeitig beim Empfang auch ein
>Zeichen an den Master zurückschick (also ein Byte exchange), was mit SPI
>ja möglich sein sollte.

Ja. Das macht dein Routine oben schon. Was glaubst du, was in rc steht?

> Muss ich dass Zeichen nun unmittelbar nach dem
>Empfang auf den Bus legen oder muss dies vor dem Empfang schon
>passieren?

Wer soll was wan auf welchen Bus legen?

MFG
Falk

Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Falk

Das mit dem doppelten Auslesen von SPDR war ein Copy-Paste-Fehler das 
ist natürlich richtig wie du korrigiert hast.

Richtig in rc, steht das Zeichen, welcher der Salve auf den Bus gelegt 
hat. Meine Frage war nur wann und wie muss der Slave das Zeichen auf den 
Bus legen?  In der Slave-Routine wo ich angegeben habe wird nur ein 
Zeichen empfangen, nicht aber gesendet.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Jonas (Gast)

>Meine Frage war nur wann und wie muss der Slave das Zeichen auf den
>Bus legen?

In dem Zyklus, nachdem SS auf LOW gegangen ist.

MFG
Falk

Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also so:

char SPI_SlaveReceive(char cData)
{
  SPDR=cData;

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

  return SPDR;
}

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.