Arbeite zurzeit an einem kleinen Projekt für mein Studium.
Hänge leider aber am eher leichten Teil des Ganzen an einem
wahrscheinlich trivialen Fehler, den ich aber nicht finde.
Ich soll mittels SPI Werte von einem ADC (MCP3302 / µC: AT90USB162)
einlesen.
Hab das ganze jetzt mal ausprogrammiert, jedoch das Problem, das nur die
erste Übertragung beim Start des µC erfolgreich ist.
Ich bekomme also am Anfang einen Wert (der richtig ist) und dann nichts
mehr.
Habe die SPI wie folgt initialisiert:
1 | // SPI Enable, Mastermode, clock rate: fck/64
|
2 | SPCR |= (1 << SPE) | (1 << MSTR) | (1 << SPR1);
|
3 | DDRB |= (1 << PB2) | (1 << PB1); // MOSI and SCK as output
|
4 | DDRB |= (1 << PB4); // CS also as output ...
|
5 | PORTB |= (1 << PB4); // .. and set to "H"
|
6 | DDRB &= ~(1 << PB3); // MISO must be an input
|
Meine sende/lese Routine schaut so aus:
1 | unsigned char spi_ReWr(unsigned char byte)
|
2 | {
|
3 | SPDR = byte;
|
4 | while(!(SPSR & (1 << SPIF)));
|
5 | return SPDR;
|
6 | }
|
Die Controllbytes habe ich aus dem Datenblatt des MCP3302 (auch schon
mehrfach kontrolliert).
Die gesamte Routine wird ständig im Hauptprogramm aufgerufen.
Und wie schon am Anfang erwähnt, genau einmal funktionierts und dann
hängt das Programm.
Hat jemand eine Idee, wo der Fehler sein könnte?