- LiTime Speicher und Akkus         
Ergebnis 1 bis 6 von 6

Thema: SPI master transmit problem

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795

    SPI master transmit problem

    Anzeige

    Praxistest und DIY Projekte
    Hallo.

    Ich habe einen ATMEGA128 mit dem CAN-Controller MCP2515 verbunden.

    Nun, peinlicherweise habe ich solche Probleme das SPI zum Laufen zu bringen!

    Das Programm hängt immer am zweiten SPI-transmit Versuch, weil es darauf wartet bis SPIF im SPSR-Register logisch 1 ist. Die Übertragung wird also nicht fertig...?

    Das Problem hatte ich beim Mega32 mit MCP2515 nochnie!

    Hier der Code:

    Code:
    //  -=> SPI initialisieren <=-
    void SPI_init(void){
    	// Setze CS, SCK und MOSI als Ausgang; MISO als Eingang; Pullup auf CS
    	SPI_DDR  |= (1<<SPI_CS)|(1<<SPI_SCK)|(1<<SPI_MOSI);					// Ausgang
    	SPI_DDR  &= ~(1<<SPI_MISO);											// Eingang
    	//SPI_PORT |= (1<<SPI_MISO);												// Pullup ein
    	//SPI_PORT &= ~(1<<SPI_CS)|(1<<SPI_SCK)|(1<<SPI_MOSI);				// Pullup aus
    
    	// Aktiviere SPI; Master Interface; Rate = F_CPU / 4
    	SPCR = (1<<SPE)|(1<<MSTR);
    }
    
    
    //  -=> SPI Transmit <=-
    uint8_t SPI_transmit( uint8_t data ){
    UART_transmit_string("\rTransmit");
    	SPDR = data;						// Starte Transmission
    	while( !( SPSR & (1<<SPIF) ) );	// Warte bis Transmission beendet ist
    	UART_transmit_string("\rTransmit finished");
    	return SPDR;						// Return Daten-Register
    }
    
    
    //  -=> CS auf Low <=-
    void SPI_cs_low(void){
    SPI_PORT &= ~(1<<SPI_CS);
    }
    
    
    //  -=> CS auf High <=-
    void SPI_cs_high(void){
    SPI_PORT |= (1<<SPI_CS);
    }
    UART_transmit_string("\rTransmit");
    UART_transmit_string("\rTransmit finished");
    Durch sie kann ich ermitteln wo es hängt.

    Eserscheint im Terminal:
    "Transmit
    Transmit finished
    Transmit"

    Das bedeutet er hängt beim zweiten Transmittversuch:

    while( !( SPSR & (1<<SPIF) ) ); // Warte bis Transmission beendet ist

    An was kanndas liegendass die Transmission nicht beendet wird?
    bzw. SPIF-Flag in SPSR nicht gesetzt wird?!?!?
    Gruß,
    Franz

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795
    Also irgendwie is das zu hoch für mich.... wenn ich das Programmierkaben berühre dann macht er weiter....??????

    BITTE HELFT MIR! Auch die kleinste Ahnung könnte mir helfen!
    Gruß,
    Franz

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795
    Sollte die SCK-Leitung mit 10K ge-Pullupt bzw. downt werden?
    Gruß,
    Franz

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795
    aha, also wenn ich die SCK-Leitung anfasse, dann geht es, aber extrem langsam!

    Ich vermute dass ich durch das 50Herz dignal aus dem Boden die Taktfrequenz erzeuge für SCK. 50/8bit (für jedes schift ca.). er schreibt mir ca. 5 hin pro secunde. das ginge hin.... ABER WARUM?!?!!?

    Die SCK-Leitung ist doch verbunden! ich kann den Controller ja auch Programmieren damit! sonst würde das ja auch nicht funktionieren!
    Gruß,
    Franz

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795
    AHA....

    Also #define SPI_SCK 1 mag der Compiler anscheinend nicht... mit PB1 direkt eingesetzt wird der PIN SCK auch ein ausgang und dann gehds...

    Äusserst seltsam.

    Bitte entschuldigt die Posts!

    Eure Meinungen dazu währen jetzt gefragt.
    Gruß,
    Franz

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795
    OOps

    Tut mir leid. Das hab ich in den ganzen Frust völlig übersehen.

    Ganzversteckt befand sich noch eine definierung für SPI_SCK MOSI MISO CS ... Jedoch für ATMEGA32.

    Sorry. Vielleicht hilft es ja jemande

    Der schmwarrn hat mich 4 Stunden gekostet
    Gruß,
    Franz

Berechtigungen

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

LiTime Speicher und Akkus