Es genügt nicht, daß du dich relativ genau an's Datenblatt hälst; du musst dich exakt daran halten.
Lies nochmal nach, wie man das SPIF-Flag zurücksetzt, das geht nämlich anders.
Hi!
Ich habe ein Problem mit meinem ATMega32. Ich will über die SPI Daten senden, jedoch gibt es schon bei den Grundlegenden Sachen Schwierigkeiteen:
Ich habe mich bei den Funktionen SPI_Init() und SPI_Transmit() relativ genau an das Datenblatt gehalten, jedoch sendet mein AVR lediglich (relativ zufällig) nur etwa 2-30 bytes. Dann bleibt er in der Schleife hängen, in der er auf die SPIF-Flag wartet.
Als Debugausgabe lasse ich mir per UART Kontrollstrings an den PC senden.
Wenn man die Ausgabe "waiting" aus der Schleife rausnimmt, dann hört er halt einfach nach einem "sende jetzt" auf.
Wäre nett, wenn mir jemand helfen könnte!
Vielen Dank schon mal!
Greets Tromse
Code:void SPI_Init(void){ /* Set !DM, MOSI and SCK output, MISO input */ DDRB |= (1<<PB3) | (1<<PB5) | (1<<PB7); DDRB &= ~(1<<PB6); /* Enable SPI, Master, set clock rate fck/16 */ SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0); } void SPI_Transmit(uint8_t cData){ /* Start transmission */ SPDR = cData; /* Wait for transmission complete */ while (!(SPSR & (1<<SPIF))) printf("waiting\n"); } void main(){ SPI_Init(); while (1){ printf("sende jetzt\n"); SPI_Transmit(164); printf("senden fertig\n"); } }
Es genügt nicht, daß du dich relativ genau an's Datenblatt hälst; du musst dich exakt daran halten.
Lies nochmal nach, wie man das SPIF-Flag zurücksetzt, das geht nämlich anders.
Disclaimer: none. Sue me.
Das geht nämlich anders?
Wenn du meinst, dass man auch den SPDR auslesen muss, das habe ich probiert, und dennoch hat es nicht funktioniert.
Desweiteren wird dies im Code im Datenblatt ebenfalls nicht gemacht.
Außerdem ist das Problem nicht, dass die Flag nicht gelöscht wird, sondern dass sie nicht gesetzt wird.
Ich zitiere aus dem Datenblatt:
Will heißen, ich habe nur statt char uint8_t genommen, sonst ist außer dem printf() alles gleich.void SPI_MasterTransmit(char cData)
{
/* Start transmission /*
SPDR = cData;
/* Wait für transmission complete */
while/!(SPSR & (1<<SPIF)))
;
}
Bei der SPI_Init() setze ich NUR die Bits, deren Ein/Ausgänge benötigt werden, und nicht auch die anderen.
Sonst habe ich mich selbstverständlich schon an das C Code Example aus dem Datenblatt gehalten!!
Lesezeichen