bidirektionale Kommunikation zweier UNO über SPI

Hallo,

ich beschäftige mich gerade mit SPI-Schnittstelle.

Als Beispiel habe ich das hier gefunden.

Leider finde ich kein Beispiel in dem Daten vom Slave zum Master zurückgesendet werden.

In diesen Beispiel werden die Daten die vom Master kommen durch den Slave an den Master zurückgesendet.

for (const char * p = "Hello, world!\n" ; c = *p; p++){
    R = SPI.transfer (c);
    Serial.print(R);
  }

Wie bekomme ich z.B. Messwerte vom Slave zum Master?

Hallo,

du hast die Seite mit dem Beispiel doch selber verlinkt. Wenn man da runter scrollt steht da

How to get a response from a slave

Mit dem Slave Beispiel worin sich diese Funktion befindet

ISR (SPI_STC_vect)
{
  byte c = SPDR; 
 
  switch (command)
  {
  // no command? then this is the command
  case 0:
    command = c;
    SPDR = 0;
    break;
    
  // add to incoming byte, return result
  case 'a':
    SPDR = c + 15;  // add 15
    break;
    
  // subtract from incoming byte, return result
  case 's':
    SPDR = c - 8;  // subtract 8
    break;

  } // end of switch

}  // end of interrupt service routine (ISR) SPI_STC_vect

Das Register SPDR wird zum Senden und Empfangen verwendet. Wenn ein Byte über SPI beim Slave reinkommt, wird der Inhalt des SPDR vom Slave über MISO rausgeschoben, während gleichzeitig die Daten vom MOSI auf der anderen Seite des Registers reingeschoben werden. D.h. wenn obige Funktion aufgerufen wird, steht in SPDR drin was vom Master gekommen ist und man schreibt da rein, was beim nächsten Byte, das vom Master kommt, an diesen zurückgesendet wird.

Siehe "Figure 23-2." im Atmega 328 Datenblatt.