G-Sensor BMA020 via SPI

Gast #4410331
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:
Gast #4410334
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.