Hallo Zusammen,
folgendes Problem: Ich versuche einen MMA7745 (Beschleunigungssensor von
Freescale) per SPI@4MHz am ATMega32@16MHz zu betreiben.
Hier meine Schreibroutine / Initialisierungsroutine:
1 | PORTB &= ~(1 << PB4); // SS auf LOW w�hrend der �bertragung
|
2 |
|
3 | SPDR = 0b10101100; // send address 0x16 Mode Control Register (Read/Write)
|
4 | while (!(SPSR & (1<<SPIF))) // wait until address is sent
|
5 | ;
|
6 | x = SPDR; // dummyread
|
7 | SPDR = 0b01001000; // send data: 2g measurement range, measurement mode, no selftest
|
8 | // SPI 4 wire mode, data ready output on INT1
|
9 | while (!(SPSR & (1<<SPIF))) // wait until data is sent
|
10 | ;
|
11 | x = SPDR; // get 8bit value of x axis
|
12 | PORTB |= (1 << PB4); // SS auf HIGH zum Beenden der �bertragung
|
.. und die Leseroutine:
1 | acc_x = 0;
|
2 | PORTB &= ~(1 << PB4); // SS auf LOW w�hrend der �bertragung
|
3 |
|
4 | SPDR = 0b00001100; // send address 0x06 8 bits output value X (Read)
|
5 | while (!(SPSR & (1<<SPIF))) // wait until address is sent and reception complete
|
6 | ;
|
7 | x = SPDR; //dummy read
|
8 |
|
9 | SPDR = 0x00;//Daten werden mit dem N�chsten Transfer gesendet
|
10 | while (!(SPSR & (1<<SPIF)))//Warten bis Transfer abgeschlossen ist
|
11 | ;
|
12 | PORTB |= (1 << PB4);
|
13 |
|
14 | acc_x = SPDR; //Empfangene Daten Auslesen
|
Das Schreiben sieht auf dem Scope ganz gut aus.
Nur beim auslesen der Beschleunigungswerte sieht man seltsames.
Manchmal sind Daten vorhanden die schnell wechseln und über alle 16 SCK
Takte verteilt sind, dann wieder gibts es über Sekunden hinweg ein
festes Datum und zu guter letzt sieht man gar keine Aktivität mehr.
Ich habe hierzu einige ScopeScreenshots angehängt.
Weiß jemand was da falsch läuft?