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 | }
|