Konfiguration der Register
- Damit die Programme in der angegebenen Weise laufen, müssen wieder einige Register auf dem ATmega32 konfiguriert werden.
- Achtung, es gibt hier zunächst zwei und später dann drei Programme: Eines für den Master, eines für Slave 1 und eines für Slave 2.
- Die Programme werden zunächst prozedural umgesetzt, um sie auf das nötigste zu reduzieren.
- Später sollen aber auch geeignete Klassen zur Verwendung der SPI-Schnittstelle als Master oder Slave entworfen werden.
|
- Folgende Konfigurationen müssem beim Master im SPCR (SPI Control Register) vorgenommen werden:
|
- Bit 7 SPIE - 0 Interupt aus (Der Master erzeugt bei den Slaves Interrupts, bekommt aber selber keinen.)
- Bit 6 SPE - 1 SPI-Schnittstelle freigeben.
- Bit 5 DORD - 0 MSB, Most significant Bit, zuerst, also Bit 7 zuerst senden (DORD=1 hieße Bit 0, LSB, zuerst senden).
- Bit 4 MSTR - 1 Betriebsart: als Master arbeiten
- Bit 3 CPOL - 0 SCK ist Low in Ruhe. Der Takt beginnt also beim Übertragen neuer Daten mit einer steigenden Flanke.
- Bit 2 CPHA - 0 Das erste Datenbit wird erst ab der zweiten High-Flanke des Taktes begonnen zu senden, also versetzt. (CPHA=1: erstes Bit gleich mit erster Flanke des Taktes setzen).
- Bit 1 SPR1 - 0 Die Teilung des Systemtaktes für SPI ist über SPR1 und SPR0 kodiert: hier Teilung durch 4.
- Bit 0 SPR0 - 0 SPR1, SPR0 => Teilung: 0,0=>4 0,1=>16 1,0=>64 1,1=>128
|
SPCR = (0<<SPIE) | (1<<SPE) | (0<<DORD) | (1<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
Code 0-1: Konfiguration des SPCR-Registers beim Master.
- Außer, in der Betriebsart (MSTR) müssen die Slaves mit dem Master übereinstimmen.
- Darum ergibt sich für das Register SPCR bei den Slaves bis auf dieses eine Bit und die Aktivierung der Interrupts bei Low-Flanke auf Slave-Select die gleiche Konfiguration.
- Folgende Konfigurationen müssem deshalb bei den Slaves im Register SPCR vorgenommen werden:
|
- Bit 7 SPIE - 1 Interupt ein.
- Bit 6 SPE - 1 SPI-Schnittstelle freigeben.
- Bit 5 DORD - 0 MSB, Most significant Bit, zuerst, also Bit 7 zuerst senden (DORD=1 hieße Bit 0, LSB, zuerst senden).
- Bit 4 MSTR - 0 Betriebsart: als Slave arbeiten
- Bit 3 CPOL - 0 SCK ist Low in Ruhe. Der Takt beginnt also beim Übertragen neuer Daten mit einer steigenden Flanke.
- Bit 2 CPHA - 0 Das erste Datenbit wird erst ab der zweiten High-Flanke des Taktes begonnen zu senden, also versetzt. (CPHA=1: erstes Bit gleich mit erster Flanke des Taktes setzen).
- Bit 1 SPR1 - 0 Die Teilung des Systemtaktes für SPI ist über SPR1 und SPR0 kodiert: hier Teilung durch 4.
- Bit 0 SPR0 - 0 SPR1, SPR0 => Teilung: 0,0=>4 0,1=>16 1,0=>64 1,1=>128
|
SPCR = (1<<SPIE) | (1<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
Code 0-2: Konfiguration des SPCR-Registers bei den Slaves.
- Das zweite am SPI-Bus beteiligte Register ist das Register SPSR (SPI Status Register).
- Hier werden nur die Bits 7,6 und 0 verwendet:
/ul> |
- Bit 7 SPIF - 1: Trasfer fertig/Masterabbruch; 0: Übertragung läuft noch.
- Bit 6 WCOL - 1: Schreibfehler/ Kollision; 0: Datenübertragung in Ordnung.
- Bit 0 SPI2X - 1: Verdopplung des Taktes; 0: einfacher Takt.
|
- Das dritte am SPI-Bus beteiligte Register ist das Register SPDR (SPI Data Register).
- Hier wird das aktuell zu sendende Byte hinein geschrieben, bzw. wird das aktuell empfangene Byte gespeichert.
- Vor dem Empfangen des nächsten Bytes, muß dieses Register ausgelesen werden.
- Vor dem Ausführen eines Sende/Empfangszyklus' müssen die Datenregister von Master und Slave 1 mit der jeweils zu sendenden Zahl gefüllt sein.
- Im SPDR-Register des Masters steht nach dem ersten Teil des Sende/Empfangszyklus' dann die von Slave 1 gesendete Zahl.
/ul> |
- Aufgrund der obigen Beschreibungen und der eingefügten Kommentare, sollten die folgenden zusammengehörenden Programme für Master, Slave1 und Slave2 zur durchführung des beschriebenen Versuches nun verstehbar sein:
/ul> |