Gast
#1021688
Per SPI möchte ich Registerinhalte aus einem Accelerometer auslesen.
Dazu sende ich per SPI_MasterTransmit den passenden Befehl. Zugleich
gibt mir diese Funktion auch gleich den empfangen Wert zurück. Wenn ich
nur ein Register im main auslesen will, so funktioniert alles gut. Falls
ich aber zwei Register im main auslesen will(d.h 2x nacheinander
SPI_MasterTransmit aufrufe), so bekomme ich den richtigen Wert des
ersten Register, aber der Registerinhalt des zweiten Registers ist dann
angeblich immer gleich der des ersten Registers, was nicht sein kann.
Beispiel:
1) SPI_MasterTransmit(Register_1) beudetet lese register1. das gibt mir
dann den Rückgabewert -> 0x3A
2) SPI_MasterTransmit(Register_2) beudetet lese register2. das gibt mir
dann den Rückgabewert -> 0xF5
soweit so gut. wenn ich jetzt 2 register im main nacheinander auslesen
will, dann passiert folgendes:
3) SPI_MasterTransmit(Register_1)
SPI_MasterTransmit(Register_2)
Rückgabewerte -> 0x3A 0x3A ich bekomme zweimal den gleichen wert (immer
der wert den ich als erstes auslese)
4) SPI_MasterTransmit(Register_2)
SPI_MasterTransmit(Register_1)
Rückgabewerte -> 0xF5 0xF5
Unten stehend noch mein code bezüglich SPI. ich habe keinen Plan was da
los ist. Ist das überhaupt ein SPI Problem oder eher irgendwas anderes?
void SPI_MasterInit(void){
/* Set MOSI, SCK and SS output, all others input */
DDRB = (1<<PB2)|(1<<PB3)|(1<<PB5);
PORTB &= ~(1<<PB2);
/* Enable SPI, Master, set clock rate fck/128, SCK high in idle,
sampling at rising edge */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1)|(1<<CPOL);
}
char SPI_MasterTransmit(char cData){
//PORTB &= ~(1<<PB2); // brauchts nicht da im Moment nur ein Slave
vorhanden
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
//PORTB |= (1<<PB2); // brauchts nicht da im Moment nur ein Slave
vorhanden
return SPDR;
}