PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SPI master transmit problem



Kaiser-F
01.04.2006, 21:20
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:


// -=> 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?!?!?

Kaiser-F
01.04.2006, 21:35
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!

Kaiser-F
01.04.2006, 21:50
Sollte die SCK-Leitung mit 10K ge-Pullupt bzw. downt werden?

Kaiser-F
01.04.2006, 21:56
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!

Kaiser-F
01.04.2006, 22:08
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.

Kaiser-F
01.04.2006, 22:42
OOps :oops: :oops: :oops: :oops: :oops: :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 :oops: :oops: :oops:

Der schmwarrn hat mich 4 Stunden gekostet ](*,)