Forum: Mikrocontroller und Digitale Elektronik Mpu 9150 weg von der Api


von Jan L. (jan_l)


Lesenswert?

Hallo,

also ich habe die Mpu 9150 SDK und habe bis jetzt mit der Api 
gearbeitet. da mir diese aber die werte zulangsam liefert will ich davon 
gerne ein bisschen weg.

ich habe allerdings 2 Funktionen die mir doch noch recht nützlich sein 
könnten.
1
int msp430_i2c_write (unsigned char slave_addr, unsigned char reg_addr, unsigned char length, unsigned char data)

und
1
int msp430_i2c_read (unsigned char slave_addr, unsigned char reg_addr, unsigned char length, unsigned char data)

so jetzt hab ich mir das daten blatt vom dem Board angeguckt und 
eigendlich, denke ich zumindest, alles gefunden was ich brauche. bis auf 
diese slave address...

leider finde ich auch im i net nichts was mir hilf diese zu finden...
vielleicht könnt ihr mir da ja helfe...

hab hier jetzt schon paar sachen versucht aber bekomme ums Verrecken 
keine Daten ausgegeben.

und jetzt wäre es schon mal gut zu wissen, ob es vielleicht daran liegt 
das ich bei slave_addr einfach was falsches habe...

ps.: habe eigendlich extra was mit API genommen da ich in hardware 
naheren sachen nicht so bewandert bin.

: Verschoben durch User
von Timmo H. (masterfx)


Lesenswert?

Bevor du das ganze Netz durchsuchst, warum schaust du denn nicht gleich 
in das "MPU-9150 9-Axis Evaluation Board User Guide" (EVB) in "Table 5"?

von Jan L. (jan_l)


Lesenswert?

arg ja die pdf hatte ich noch nicht gesehn xD
wie doof
1
MPU-9150  I²C device address selection pin AD0.
2
When the pin value is low, the device address is 0x68. 
3
When the pin value is high, the device address is 0x69.

irgendwie dacht ich, ich kann low und high gleichzeitig holen...
oder ist mit low und high garnicht die low byte und high byte gemeint 
....

ps.: ich hab ja nicht das evb sondern diese sdk macht das denn nen 
unterschied?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jan L. schrieb:
> oder ist mit low und high garnicht die low byte und high byte gemeint

Nein, überhaupt und gar nicht. Das ist ein einzelner Pin, mit dem Du 
zwischen zwei Adressen umschalten kannst.
Das aber ist nur relevant, wenn das Ding im I2C-Slave-Modus betrieben 
wird, also von einem anderen I2C-Master angesteuert wird.

Machst Du das? Oder willst Du irgendwelche I2C-Peripherie ansteuern?

von Jan L. (jan_l)


Lesenswert?

also wenn du mit i2c periperie die Sensoren meinst die schon auf dem 
Board sind, dann will ich die ansteuern...

brauch ich dann nur einen der beiden oder wie?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jan L. schrieb:
> also wenn du mit i2c periperie die Sensoren meinst die schon auf dem
> Board sind, dann will ich die ansteuern...

Dann brauchst Du deren Adressen. Die musst Du Deiner Funktion als 
slave_addr übergeben.

von Jan L. (jan_l)


Lesenswert?

ahh mist jetzt bin ich ja so klug wie vorher XD

die haben zwar register adressen für z.b. 0x1C für Accel_Config aber das 
ist ja nicht die slave adresse....

von Jan L. (jan_l)


Lesenswert?

und ich bin mit meinem latein wirklich am ende wo das steht ....

von Timmo H. (masterfx)


Lesenswert?

auch wenn ich nicht ganz glaube, dass der Funktionsprototyp so aussieht:
1
int msp430_i2c_read (unsigned char slave_addr, unsigned char reg_addr, unsigned char length, unsigned char data)
sondern zumindest so:
1
int msp430_i2c_read (unsigned char slave_addr, unsigned char reg_addr, unsigned char length, unsigned char *data)
dann dürfte dein Funktionsaufruf etwa so aussehen:
1
uint8_t buf[10];
2
3
msp430_i2c_read(0x68,0x1C,1,buf);
danach müsste in buf[0] der Wert aus dem Register 0x1C stehen.

Kann aber natürlich auch sein, dass die Funktion die Slave-Adresse 
geshiftet erwartet sowie das "lese-bit"
1
uint8_t buf[10];
2
3
msp430_i2c_read((0x68<<1)|I2C_READ,0x1C,1,buf);

von Jan L. (jan_l)


Lesenswert?

oh ja, keine ahnung wann das * verschwunden ist.

ok das kann ich zumindest mal versuchen aber wie kommst du jetzt auf die 
0x68?





also wahrscheinlich stimmt die da ich so was ähnliches schon mal in dem 
forum vom hersteller gelesen hatte.

hier mal das zitat von dem post:
1
1. Reset MPU9150: write 0x80 to 0x6B (PWR_MGMT_1), address 0x68 
2
2. Disable sleep: write 0x01 to 0x6B (PWR_MGMT_1), address 0x68 
3
3. Setup I2C Bypass: write 0x02 to 0x37 (INT_PIN_CFG), address 0x68
4
5
4. Set mag to single measurement: write 0x01 to 0x0A (CNTL), address 0x0C
6
5. read mag: Read 6 bytes from 0x03 (HXL), address 0x0C

was mich an derAsache dann nur verwirrt hatte, war das er da unten dann 
plötzlich auf 0x0C Schreibt. vielleicht liegt es auch nur daran das das 
mag. anders funktioniert...

von Timmo H. (masterfx)


Lesenswert?

Jan L. schrieb:
> oh ja, keine ahnung wann das * verschwunden ist.
>
> ok das kann ich zumindest mal versuchen aber wie kommst du jetzt auf die
> 0x68?
hast du dir doch selbst schonmal beantwortet:
Jan L. schrieb:
> arg ja die pdf hatte ich noch nicht gesehn xD
> wie doof
>
>
1
> MPU-9150  I²C device address selection pin AD0.
2
> When the pin value is low, the device address is 0x68.
3
> When the pin value is high, the device address is 0x69.
4
>
>

von Jan L. (jan_l)


Lesenswert?

aber könnte es dann nicht auch 69 sein?

von Timmo H. (masterfx)


Lesenswert?

Ja, je nachdem wie AD0 angeschlossen ist.

von Jan L. (jan_l)


Lesenswert?

ahhh langsam wirds klarer mal sehn ob ich ad0 noch finde xD

von Timmo H. (masterfx)


Lesenswert?

Jan L. schrieb:
> ahhh langsam wirds klarer mal sehn ob ich ad0 noch finde xD
Pin 24 an der Stiftleiste (bzw. Pin 9 am MPU), ist ja nicht so dass es 
nicht im Manual des Eval Boards stehen würde

von Jan L. (jan_l)


Lesenswert?

ahh wenn man es weiß dann ists ganz logisch xD habs jetzt auch :P

danke für deine / eure Hilfe =)
werd das alles gleich mal teste =)

von Jan L. (jan_l)


Lesenswert?

edit: hier stand ein Problem was sich von allein gelöst hat...

von Jan L. (jan_l)


Lesenswert?

also ich starte die

I2C verbindung,
Resete mit dem Powermanagement,
setzte den Accel auf eine range von +-4g High Pass Filter aus
dann lese ich vom Accel
1
// Power Management reset / start
2
  w_buff[0] = 0x80;
3
  msp430_i2c_write(ADDR, 0x6B, 1, w_buff);
4
5
  w_buff[0] = 0x01;
6
  msp430_i2c_write(ADDR, 0x6B, 1, w_buff);
7
8
9
10
  //write / read Accel Config
11
  w_buff[0] = 0x01;
12
  msp430_i2c_write(ADDR, 0x1C, 1, w_buff);
13
  //msp430_i2c_read(ADDR, 0x1C, 1, r_buff);
14
15
16
  //read Accel data
17
  msp430_i2c_read(ADDR, 0x3B, 6, r_buff);
18
19
  for(i = 0; i < 10; i++)
20
      printf("r_buff[%d]: %X \t w_buff[%d]: %X\n", i, r_buff[i], i, w_buff[i]);

leider stehen nur "0" in meinem Array =(

von Timmo H. (masterfx)


Lesenswert?

Was steht in ADDR?
Wie sieht die "msp430_i2c_read" aus?
Kannst du andere Register auslesen (z.B. Status oder so)?
Evtl. machst du auch den Start zu früh nach dem Reset.
Wie schon gesagt muss ADDR vielleicht um einen nach links geshiftet 
werden

von Jan L. (jan_l)


Lesenswert?

in addr steht 0x68 drin und wie das read aussieht weiß ich leider nicht 
... aber nach dem ich das board an und ausgeschaltet hatte ging es -.-

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.