Gast
#2677568
Hallo,
ich habe hier ein Problem mit einem Mega1280, bei dem ich vergeblich
versuche die SPI-Schnittstelle in Betrieb zu nehmen.
Ich halte mich an das Code Beispiel im Datenblatt, aber irgendwo muss
ich wohl etwas übersehen haben.
void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
}
Offenbar wird das SPIF Flag nicht gesetzt, so dass ich in der while
Schleife hängen bleibe. Der AVR Studio Simulator bestätigt mir das auch.
Auffällig finde ich, dass bei der Simulation mit dem AVR-Studio nach
einigen, wenigen Takten nach beschreiben des SPCR-Registers mit:
SPCR |= (1 << SPE) | (1 << MSTR)| (1<<SPR1);
das SPIF Flag gesetzt wird. Komischerweise wird gleichzeitig auch das
MSTR Bit wieder gekippt. Beim ersten Schreiben in das Senderegister wird
dann das Write Collision Flag gesetzt und das SPIF Flag gekippt.
Erklären kann ich mir das nur so, dass vor dem Beschreiben des
Senderegisters das SPIF Flag bzw. das SPSR Register nicht gelesen wurde
und daher ein unzulässiger Zugriff auf das Datenregister erkannt wird.
Als Folge wird dann das Write Collision Flag gesetzt.
Meine Frage ist aber nun, warum direkt nach dem Beschreiben des SPCR
Registers das SPIF-Flag gesetzt und das MSTR Flag wieder gekippt wird.
Danke & Gruß
Ralf