G-Sensor BMA020 via SPI

Gast #4410331
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
}
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren