Stimmt, wahrscheinlich habe ich ihn noch nicht ganz verstanden.
Deswegen habe ich auch noch ein paar Fragen

- Wodurch ruft der Master die Daten vom Slave ab? Einfach indem er eine Übertragung startet?

Nun kann man einen Slave selektieren (Slave Select auf logische null) und durch Schreiben von Daten in das Datenregister eine Übertragung einleiten. Wartende Daten im Slave werden bei dieser Übertragung zum Master gesendet.
- Wieso ist es notwendig, beim Slave das Flag zurückzusetzten und wie wird das gemacht? Bzw. wird das Flag nicht automatisch zurückgesetzt?

SPIF is cleared by
hardware when executing the corresponding interrupt handling vector. Alternatively, the
SPIF bit is cleared by first reading the SPI Status Register with SPIF set, then accessing
the SPI Data Register (SPDR).
Ich hab auch mal versucht, das umzusetzen, allerdings funktioniert es so immer noch nicht.

Master:
Code:
/* UART-Init beim AT90S2313 */
#include <avr/io.h>
#include <stdint.h>


 
#ifndef F_CPU
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
   F_CPU im Makefile definiert werden, eine nochmalige Definition
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
   #ifndef/#endif 
 
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
   verwendet wird und dort eine andere, nicht zur Hardware passende 
   Taktrate eingestellt ist: Dann wird die folgende Definition 
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
   noch nicht definiert: */
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
#define F_CPU 16000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
                         // Ohne ergeben sich unten Fehler in der Berechnung
#endif
 
#define BAUD 9600UL      // Baudrate
 
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
 
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif
 
  /* USART-Init beim ATmega16 */
 
int main(void)
{

    UCSRB = (1<<TXEN);                // UART TX einschalten
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
 
    UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;

 
/* SPI Initialisieren
	
*/

/* Set MOSI, SS and SCK output, all others input */
DDRB = (1<<DDB5)|(1<<DDB4)|(1<<DDB7);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<MSTR)|(1<<SPE)|(1<<SPR0);



char data;

  while (1) 
  	{ 

	SPDR='a';					// Übertragung starten

	while(!(SPSR & (1<<SPIF)))  /* Wait for transmission complete */
	;
 	data = SPDR;				// Daten vom Slave einlesen

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

    // Daten über den UART an den PC schicken
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
	;

    UDR = data;
	}
}
Slave:
Code:
#include <avr/io.h>
#include <stdint.h>

int main()
{
	

// SPI Slave Init

DDRA = (1<<DDA5);	 // DO als output und DI/USCK als input definieren
USICR = (1<<USIWM0)|(1<<USICS1);	 // SPI initialisieren

// SPI Übertragung

while (1) 
	{

	while (!(USISR&(1<<USIOIF)))	// Warten bis die Übertragung komplett ist
   	;
	USIDR='x';						// Übertragung starten

	}
}