Kaiser-F
01.04.2006, 22: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?!?!?
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?!?!?