BMA020 mit GNUBLIN dip

Gast #3297213
Lesenswert?
• ▲
▼
Hallo,

ich versuche die Achsendaten die der BMA020 liefert unter gunblin 
auszulesen. Laut Datenblatt muss ich dafür erst ein Offset (0x02) auf 
0x70 schreiben und dann 0x71 auslesen, was mir die 6 Byte zurückgeben 
soll, die die Werte repräsentieren.

Hier mal mein Code:
1
#include <stdio.h>
2
#include <fcntl.h>
3
#include <unistd.h>
4
#include <sys/ioctl.h>
5
#include <linux/i2c-dev.h>
6

7
#define acc_10Bit(LSB, MSB)     ((int8_t)MSB << 2 | LSB >> 6)
8

9
int main(int argc, char **argv)
10
{
11
        int r;
12
        int fd;
13

14
        char buf[10] = {0};
15
        char data[6] = {0};
16

17
        char *dev = "/dev/i2c-1";
18
        int addr = 0x38;
19

20
        printf("BMA020 Test\n");
21

22
        fd = open(dev, O_RDWR);
23
        if (fd < 0)
24
        {
25
                perror("Opening i2c device node\n");
26
                return 1;
27
        }
28

29
        r = ioctl(fd, I2C_SLAVE, addr);
30

31
        if(r < 0)
32
        {
33
                perror("Selecting i2c device\n");
34
        }
35

36

37
        /**
38
         * Offset auf i2c schreiben um BMA020 zum auslesen
39
         * vorzubereiten
40
         * Data: 0x02, Addresse: 0x70
41
         */
42

43
        __u8 acc_w = 0x70;
44

45
        buf[0] = acc_w;
46
        buf[1] = 0x02;
47

48
        if (write(fd, buf, 2) != 2)
49
        {
50
                perror("Write error i2c\n");
51
        }
52
        else
53
        {
54
                printf("Write successful\n");
55
        }
56

57
        sleep(1.1);
58

59
        /**
60
         * daten von i2c lesen
61
         * 6 Byte lesen
62
         */
63

64
        read(fd, data, 6);
65

66
        printf("%x\n", data[0]);
67
        printf("%x\n", data[1]);
68
        printf("%x\n", data[2]);
69
        printf("%x\n", data[3]);
70
        printf("%x\n", data[4]);
71
        printf("%x\n", data[5]);
72

73
        printf("\n");
74
        return 0;
75

76
}

Vorausgesetzt der Write-Code ist soweit richtig (kein logischer Fehler 
also) funktioniert der einwandfrei. Lediglich das auslesen gibt mir nur 
"ff"s zurück.

Hier mal noch die Ausgabe des Programms:
1
root@gnublin:~/messung# ./mess
2
BMA020 Test
3
Write successful
4
ff
5
ff
6
ff
7
ff
8
ff
9
ff

und hier noch die Ausgabe von i2cdump:
1
root@gnublin:~/messung# i2cdump -y 1 0x38
2
No size specified (using byte-data access)
3
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
4
00: 02 12 c1 03 41 00 c1 c0 15 00 00 00 48 4e 30 4b    ????A.???...HN0K
5
10: 4d 07 39 63 80 80 ff ff ff ff ff ff ff ff ff ff    M?9c??..........
6
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
7
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
8
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
9
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
10
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
11
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
12
80: 02 12 c1 03 01 00 81 c0 15 00 00 00 48 4e 30 4b    ?????.???...HN0K
13
90: 4d 07 39 63 80 80 ff ff ff ff ff ff ff ff ff ff    M?9c??..........
14
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
15
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
16
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
17
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
18
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
19
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................

Im Moment seh ich leider vor lauter Wald den Baum nicht mehr.
Danke schonmal für eure Hilfe!
Gast #3298278
Lesenswert?
• ▲
▼
Das Problem hat sich erledigt:
gnublin bietet eine API für C++, die das soweit ganz gut übernimmt.

Zum testen hab ich mir ein kleines Programm geschrieben, dass die Werte 
aus dem BMA020 ausliest, sie in 10 Bit Format bringt und dazu noch die 
Änderungen der Werte im Vergleich zur vorherigen Messung ausgibt. Der 
Absolutwert dient lediglich zum testen.

Für Interessierte hier nochmal der Code mit Einsatz der API:
1
#define BOARD GNUBLIN
2
#define acc_10Bit(LSB, MSB)     ((int8_t)MSB << 2 | LSB >> 6)
3
#include "gnublin.h"
4

5
int main()
6
{
7
        gnublin_i2c i2c;
8

9
        int x2 = 0;
10
        int y2 = 0;
11
        int z2 = 0;
12

13
        int x1 = 0;
14
        int y1 = 0;
15
        int z1 = 0;
16

17
        //Aenderungswerte
18
        int dx = 0;
19
        int dy = 0;
20
        int dz = 0;
21

22
        //Absolutwert
23
        int absolut = 0;
24
        int i = 0;
25

26
        //Zu schreibende Daten
27
        unsigned char buffer[8];
28

29
        //Zu empfengende Daten
30
        unsigned char rxBuf1[8];
31
        unsigned char rxBuf2[8];
32

33
        //Adresse des BMA020 am I2C Bus
34
        i2c.setAddress(0x38);
35

36
        buffer[0] = 0x02;
37

38
        printf("Sende 0x02 an 0x70\n");
39
        i2c.send(0x70, buffer, 1);
40
        printf("Gesendet\n");
41

42
        printf("Dauerschleife Datenabfrage und Berechnung\n");
43

44
        while(1)
45
        {
46
                usleep(1000);
47

48
         if( i%2 == 0)
49
         {
50
                i2c.receive(0x02, rxBuf1, 6);
51
                x1 = acc_10Bit(rxBuf1[0], rxBuf1[1]) * 100;
52
                y1 = acc_10Bit(rxBuf1[2], rxBuf1[3]) * 100;
53
                z1 = acc_10Bit(rxBuf1[4], rxBuf1[5]) * 100;
54

55
                dx = x2 - x1;
56
                dy = y2 - y1;
57
                dz = z2 - z1;
58

59
                absolut = x1 + y1 + z1;
60

61
                printf("X: \t%d,\t Y: \t%d,\t Z: \t%d\n", x1, y1, z1);
62
                //Absolutwert ausgeben
63
                printf("Abs: \t%d\n", absolut);
64

65

66
         }
67
         else
68
         {
69
                //Daten auslesen
70
                i2c.receive(0x02, rxBuf2, 6);
71

72
                //10 Bit Werte erstellen
73
                x2 = acc_10Bit(rxBuf2[0], rxBuf2[1]) * 100;
74
                y2 = acc_10Bit(rxBuf2[2], rxBuf2[3]) * 100;
75
                z2 = acc_10Bit(rxBuf2[4], rxBuf2[5]) * 100;
76

77
                //Aenderungen berechnen
78
                dx = x1 - x2;
79
                dy = y1 - y2;
80
                dz = z1 - z2;
81

82
                //Absolutwer berechnen
83
                absolut = x2 + y2 + z2;
84

85
                //10 Bit Werte ausgeben
86
                printf("X: \t%d,\t Y: \t%d,\t Z: \t%d\n", x2, y2, z2);
87

88
                //Absolutwert ausgeben
89
                printf("Abs: \t%d\n", absolut);
90
         }
91

92
                dx = x1 - x2;
93
                dy = y1 - y2;
94
                dz = z1 - z2;
95

96
                printf("DX: \t%d,\t DY: \t%d,\t  DZ: \t%d\n\n", dx, dy, dz);
97
                i++;
98
        }
99
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.