Frage zu Code im SPI-Beispiel

Hallo,
ich bin gerade beim durcharbeiten des Codes dieser Seite.
Da kommunizieren 2 Arduinos über SPI. Der Master-Code ist für mich verständlich, beim Slave hab ich so meine Schwierigkeiten.
Wäre nett, wenn ihr meine Fragen beantworten könntet, besonders der Code in der ISR finde ich extrem kompliziert geschrieben :

ISR(SPI_STC_vect){
  cli();
  
  //while SS Low
  while(!(PINB & 0b00000100)){        //1.
    SPDR = dataEcho;                      //2.
    
    //wait SPI transfer complete
    while(!(SPSR & (1 << SPIF)));      //3. 
    
    dataEcho = SPDR;  //send back in next round     //4.
  }
  sei();
}

Ich hab die Zeilen mit 1. bis 4. markiert, da mir diese unklar sind. Hier meine Fragen :

Was ist bei 1. der Inhalt von PINB ?
Warum wird in 2. SPDR der Wert von dataEcho, also immer 0, zugewiesen ?
Bei 3. blick ich gar nicht durch, da ich keine Ahnung habe, welche Werte SPSR und SPIF beinhalten.
In 4. wird dataEcho wieder der Wert 0 zugewiesen, obwohl dieser schon immer 0 ist und bleibt

Desweiteren dürfte er doch niemals in die Serial.write von loop reinspringen, da dataToPC mit 0 initialisert wurde und niemals seinen Wert ändert, oder ?

Könntet ihr mir bitte auf die Sprünge helfen ? Das Konzept von SPI ist mir klar, aber den Code hier....

Vielen Dank !

Also, wer in einer ISR die Interrupts abschaltet, hat sowieso irgend eine Trommel überhört.

Was ist bei 1. der Inhalt von PINB ?
da ich keine Ahnung habe, welche Werte SPSR und SPIF beinhalten.

Das wissen wir auch nicht!
Das Datenblatt sagt dir, was möglich ist, aber das was konkret da drin steht, kannst nur du herausfinden.

Also, wer in einer ISR die Interrupts abschaltet, hat sowieso irgend eine Trommel überhört.

Er muss ja die Interrupts abschalten, da er ja gerade selber einen Interrupt ausführt. Zum Ende der ISR schaltet er sie ja wieder ein.

Das Datenblatt sagt dir, was möglich ist, aber das was konkret da drin steht, kannst nur du herausfinden.

Ich hab ja schon anhand eines Beispiels versucht, das ganze durchzuarbeiten. Aber keine Ahnung.
Was ich gefunden habe ist, dass SPDR die Daten beinhaltet, die über MISO geshiftet wurden. Nur warum im Code in der ISR das SPDR (mit SPDR = dataEcho) auf 0 gesetzt wird, kein Plan.
Was ich sonst noch finden konnte ist, dass SPCR das Arduino SPI Control Register ist. Aber welche Werte da drin stehen können und was die bedeuten können ???
zu SPIF hab ich nix gefunden.

UnoRookie:
Er muss ja die Interrupts abschalten, da er ja gerade selber einen Interrupt ausführt. Zum Ende der ISR schaltet er sie ja wieder ein.

Das ist Quatsch.

UnoRookie:
Was ich sonst noch finden konnte ist, dass SPCR das Arduino SPI Control Register ist. Aber welche Werte da drin stehen können und was die bedeuten können ???
zu SPIF hab ich nix gefunden.

Eine Suche nach "avr SPIE" liefert z.B.

http://www.avrbeginners.net/architecture/spi/spi.html

Das ist Quatsch.

Würd ich nicht sagen. Wenn er doch gerade eine ISR ausführt und innerhalb dieser nochmal ein Interrupt stattfindet, würde das Ganze eventuell mehr Zeit in Anspruch nehmen und dadurch Registerinhalte neue Werte bekommen.

Eine Suche nach "avr SPIE" liefert z.B.

Vielen Dank, aber was SPIE ist ist mir schon klar. Die Frage war, was SPIF bedeutet

UnoRookie:
Würd ich nicht sagen. Wenn er doch gerade eine ISR ausführt und innerhalb dieser nochmal ein Interrupt stattfindet,
würde das Ganze eventuell mehr Zeit in Anspruch nehmen und dadurch Registerinhalte neue Werte bekommen.

Die Interrupts werden vor Betreten der ISR automatisch abgeschaltet und nachher (via reti) wieder eingeschaltet.

Wer daran rumspielt ohne die Absicht zu haben einen weiteren Interrupt innerhalb der ISR Laufzeit zuzulassen,
hat das Datenblatt nicht gelesen, verstanden oder ein anderes bedauerliches Handicap.

UnoRookie:
Die Frage war, was SPIF bedeutet

Schau mal weiter unten:

"SPIF (SPI Interrupt Flag) bit"

Hier https://www.gammon.com.au/spi steht auch sehr viel zu SPI
und speziell über dessen Benutzung zur Kommunikation zwischen Arduinos.

Hier Gammon Forum : Electronics : Microprocessors : SPI - Serial Peripheral Interface - for Arduino steht auch sehr viel zu SPI
und speziell über dessen Benutzung zur Kommunikation zwischen Arduinos.

Vielen Dank, auf diesen Artikel bin ich eben gestoßen. Der erklärt alles !!

Die Interrupts werden vor Betreten der ISR automatisch abgeschaltet und nachher (via reti) wieder eingeschaltet.

Ach ok, dann ist das natürlich unnötig. Sorry combie

"SPIF (SPI Interrupt Flag) bit"

Danke nochmal !!!

Der Blogger den du da verfolgst scheint nicht so recht zu wissen was er tut...