- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 3 von 3

Thema: ATMega32 SPI sendet nur 2-30 byte, dann gibts kein SPIF mehr

  1. #1

    ATMega32 SPI sendet nur 2-30 byte, dann gibts kein SPIF mehr

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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");
    	}
    }

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    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.

  3. #3
    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:
    void SPI_MasterTransmit(char cData)
    {
    /* Start transmission /*
    SPDR = cData;
    /* Wait für transmission complete */
    while/!(SPSR & (1<<SPIF)))
    ;
    }
    Will heißen, ich habe nur statt char uint8_t genommen, sonst ist außer dem printf() alles gleich.
    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!!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad