Umsetzen einer SPI Client-Server-Struktur
|
Das Konzept
|
Das Server Programm (Fragment)
void datenaustausch()
{
for(i=0;i<KANALANZAHL;i++) //Alle Kanäle durchgehen
{
timeout = 0;
while(!pruefeKanalbereitschaft(i) && timeout<10000) timeout++;
timeout = 0;
timeout=false;
//Wenn Kanal bereit, kompletten Speicherinhalt senden und Inhalt des aktuellen Kanals merken
if(pruefeKanalbereitschaft(i))
{
aktiviereKanal(i); //Interrupt bei Client auslösen.
for(k=0;k<KANALANZAHL*SPI_NACHRICHT_BYTEANZAHL;k++)
{
zeichen_senden = speicher[k];
zeichen_empfangen = senden_empfangen(zeichen_senden);
if(timeout_aufgetreten==true)
break;
//nur wenn Zeichen im Speicherbereich des aktuellen Kanals steht, das
//korrespondierende Zeichen in speicher überschreiben:
if(k/SPI_NACHRICHT_BYTEANZAHL==i)
speicher[k]=zeichen_empfangen;
}
//Interrupt zurücksetzen:
deaktiviereKanal(i);
}
if(timeout_aufgetreten==true)
{
deaktiviereKanal(i);
//SPI-Schnittstelle ausschalten:
SPCR = (0<<SPIE) | (0<<SPE) | (0<<DORD) | (1<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
for(pause=0;pause<1000;pause++);
//SPI-Schnittstelle als Master ohne Interrupts konfigurieren und starten:
SPCR = (0<<SPIE) | (1<<SPE) | (0<<DORD) | (1<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
for(pause=0;pause<1000;pause++);
}
}
}
Code 0-1: Das Serverprogramm.
Das Client-Programm (Fragment)
Bild 0-1: Das Client-Programm.
Versuchsaufbau
Bild 0-2: Versuchsaufbau 1.
Bild 0-3: Versuchsaufbau 2.
Ergebnis über Hyperterminal visualisiert
Bild 0-4: Test mit RS232.