Forum: Mikrocontroller und Digitale Elektronik G-Sensor BMA020 via SPI


von Ratsuchender (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen, ich bemühe mich den G-Sensor von Bosch BMA020

http://stefanfrings.de/mindstorms/BMA020.pdf

über SPI Arduino Uno auszulesen. Dabei möchte ich alle 
Standardeinstellung lassen (SPI4, +/-2G range) und nur die 
3-Achsen-beschleunigung ohne Funktion auslesen.

Leider bekomme ich nur 0er auf allen 3 Achsen zurück. Kalte Lötstellen 
oder defekter Sensor sind nicht Grund hierfür.

Die Bitschiebung ist auch nicht die Ursache, diese hab ich erfolgreich 
über I²C auslesen können, die Werte waren gemessen an der ErdG/Achse 
sinnvoll. Ausgelesen werden sollen 10 Bit= 1ByteMsb + 2BitLSB. Das LSB 
Byte zuerst, mit SPI.mode(MSBFIRST). Außerdem habe ich die Werte einzeln 
binär ausspucken lassen, nur nuller.

Laut Datenblatt können immer einzelne Bytes hintereinander ausgelesen 
werden. (siehe Protokoll, 2 Bilder im Anhang).

Dazu: For a complete readout of 10 bit acceleration data from all axes 
the sensor IC provides the option to use an automatic incremented read 
command to read more than one byte (multiple read). This
is activated when the serial enable pin CSB (chip select) stays active 
low after the read out of a data register. Thus, read out of data LSB 
will also cause read out of MSB if the CSB stays low
for further 8 cycles of system clock.

Aufgrund diesen Angaben, habe ich gedacht, dass mein folgender Code 
ausreichend wäre. Jedoch funktioniert anscheinend meine "multiple 
Reading" so nicht. Um Rat wäre ich sehr dankbar. LG.








1
//Circuit
2
//BMA020 - Arduino Uno
3
//Uin -- 5V
4
//CSB ----- 10
5
//SCK ------ 13
6
//SDI ----- 11
7
//SDO ---- 12
8
//GND------GND
9
10
11
# include <SPI.h>
12
const int chipSelectPin = 10; //ss
13
const byte READ =0B10000010; //page 26
14
void setup() {
15
Serial.begin(9600);
16
SPI.setClockDivider(SPI_CLOCK_DIV2);
17
SPI.setDataMode(SPI_MODE3);
18
SPI.setBitOrder(MSBFIRST);
19
SPI.begin();
20
pinMode(chipSelectPin,OUTPUT);
21
digitalWrite(chipSelectPin, HIGH);
22
delay(100);
23
}
24
void loop() {
25
digitalWrite(chipSelectPin, LOW);
26
SPI.transfer(READ); // Command to Read //(0x80) Register 2 (0x02) multiple reading
27
byte xl = SPI.transfer(0); // Read register 2
28
byte xh = SPI.transfer(0); // Read register 3
29
byte yl = SPI.transfer(0); // Read register 4
30
byte yh = SPI.transfer(0); // Read register 5
31
byte zl = SPI.transfer(0); // Read register 6
32
byte zh = SPI.transfer(0); // Read register 7
33
digitalWrite(chipSelectPin,HIGH);
34
unsigned short x = int (xh << 2) | (xl >> 6);
35
unsigned short y = int (yh << 2) | (yl >> 6);
36
unsigned short z = int (zh << 2) | (zl >> 6);
37
Serial.print("x = ");
38
Serial.println(x,DEC);
39
Serial.print("y = ");
40
Serial.println(y,DEC);
41
Serial.print("z = ");
42
Serial.println(z,DEC);
43
delay(80);
44
}

: Verschoben durch User
von Ratsuchender (Gast)


Lesenswert?

Aufgrund den Angaben im Bild "datenregister" halte ich es für 
ausreichend, die Achsen direkt auszulesen und vorher gar nicht zu 
adressieren. Ist das so machbar, was mache ich falsch?

von holger (Gast)


Lesenswert?

Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel vorstellen 
und diskutieren. Bitte hier keine Fragen posten!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

"holger" hat's auf den Punkt gebracht.

von Ratgefunden (Gast)


Lesenswert?

Mein Fehler... hat sich schon erledigt.

von Forist (Gast)


Lesenswert?

Ratgefunden schrieb:
> Mein Fehler... hat sich schon erledigt.

Und? Was war der Grund?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.