Hallo,
dass der Code ein wenig durcheinander ist, liegt nicht daran, dass es wild zusammenkopiert ist, sondern daran, dass ich das eine Menge rumprobiert habe und dabei die Ordnung habe schleifen lassen.
Ich habe das Ganze einmal aufgeräumt, siehe unten.
Das CS funktioniert sicher. erst ist der Pin HIGH, dann setze ich ihn auf LOW und dann wieder auf HIGH. Das habe ich mir mit dem Oszi angeschaut.
Ich habe einfach mal den SPI-Kram auskommentiert, ein delay zwischen Sensor-aktivieren und Sensor-deaktivieren eingefügt, CS am Oszi angeschaut und das springt eben wie gewünscht HIGH - LOW - HIGH.
Bei der Clock sehe ich aber leider nichts.
Ich habe das Gefühl, dass ich vor lauter Bäumen den Wald nicht mehr sehe.
SPI - Init:
Code:
#define SPI_PIN PINB
#define SPI_DDR DDRB
#define SPI_PORT PORTB
#define SPI_MISO PB3
#define SPI_MOSI PB2
#define SPI_Clock PB1
#define SPI_SS PB0
SPI_DDR &=~(1<<SPI_MISO); // miso auf input
SPI_DDR |= (1<<SPI_Clock); // clock auf output
SPI_DDR |= (1<<SPI_MOSI); // mosi auf output
SPI_DDR |= (1<<SPI_SS); // ss auf output
PORTE |= (1<<PE2); // Sensor deaktivieren
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPI2X)|(1<<SPR0)|(1<<SPR1)|(1<<CPOL)|(1<<CPHA);
// SPI Enable
// Master Select
// f_clkio/64
// Leading Edge -> Falling
// Trailing Edge -> Rising
Code aus der main:
Code:
PORTE &= ~(1<<PE2); // Sensor aktivieren, CS -> LOW
_delay_us(10); // wait
SPDR= 0x10;
while(!(SPSR & (1<<SPIF)));
data= (SPDR<<8) & 0x3FFF; // 8 Bit auslesen
SPDR= 0x01;
while(!(SPSR & (1<<SPIF)));
data+= SPDR; // Weitere 8 Bit auslesen
_delay_us(10); // wait
PORTE |= (1<<PE2); // Sensor deaktivieren
Lesezeichen