Forum: Mikrocontroller und Digitale Elektronik AltIMU-10 Breakout


von Sven (Gast)


Lesenswert?

Hallo,

ich versuche schon das ganze Wochenende, zunächst einmal nur die 
Gyrowerte, aus dem L3GD20 per I2c auszulesen. Bisher ohne Erfolg, den 
das mit der Device-Sub-Adresse ist mir nicht ganz klar.
Ich Spreche den L3GD20 mit der Adresse 107 an, und bekomme 108 zurück. 
Wenn ich dann den Gyro mit 108 anspreche beomme ich keine Antwort von 
Sensor.
Vielleicht kan mir jemand weiterhelten.

Danke

von Timmo H. (masterfx)


Lesenswert?

Die I2C Adresse wird mit SA0 auf 0x6A (106) (SA0 => GND) bzw. 0x6B (107) 
(SA0 => VCC) eingestellt. Je nach verwendeter Lib musst du die Adresse 
dann noch um eins nach links shiften und dann noch "1" rein-ODERN wenn 
du lesen wollst.
Also wenn SA0 auf GND ist, dann lautet die Adresse 0x6A, diese wird um 
eins nach links geshiftet, also 0xD4. Wenn du lesen willst sendest du 
als 0xD5 wenn du schreiben willst 0xD4.
Eine einfache Initialisierung sieht z.B. so aus:
1
#define L3GD20_ADDR 0xD4
2
3
uint8_t gyro_init(){
4
  uint16_t i;
5
  int16_t x,y,z;
6
  
7
  i2c_write_reg(L3GD20_ADDR, CTRL_REG4, 0xA0); //2000 dps
8
  
9
  i2c_write_reg(L3GD20_ADDR, CTRL_REG5, 0x13);  //HPen = 1, Outsel0...1 = 1
10
  i2c_write_reg(L3GD20_ADDR, CTRL_REG2, 0x34); // Autoreset on interrupt event, 0.09 Cutoff @ 380 Hz
11
  i2c_write_reg(L3GD20_ADDR, CTRL_REG1, 0x4F); // ODR = 380 Hz, Cutoff 20
12
  
13
14
  _delay_ms(100);
15
16
  gyro_calcoffset();  
17
  
18
  return 0;
19
}

: Bearbeitet durch User
von Sven (Gast)


Lesenswert?

Ich habe ja schon vieles über I2c angesteuert, aber da klemmt es bei 
mir. Auch das Datenblatt hilft mir da nicht viel weiter. Daraus verstehe 
ich, das zwei Adressen gibt, eine zum Lesen und eine zum Schreiben, was 
ja bei I2c Bus nicht sein kann.

von Timmo H. (masterfx)


Angehängte Dateien:

Lesenswert?

Nein es gibt nur eine Adresse. Nur gibt es hinter der Adresse noch ein 
Bit welches sagt ob man liest oder schreibt. Wie gesagt, bei fertigen 
libs braucht man sich darum nicht kümmern, da in der Schreib/Leseroutine 
schon das Bit entsprechend reingeodert wird, so wie hier: 
(I2C_WRITE/I2C_READ)
1
uint8_t i2c_read_reg(uint8_t addr, uint8_t reg){
2
  uint8_t val;
3
4
  i2c_start(addr+I2C_WRITE);
5
  
6
  i2c_write(reg);  
7
  i2c_start(addr+I2C_READ);
8
  
9
  val = i2c_readNak();
10
  
11
  i2c_stop();
12
  return val;
13
}

Und das steht natürlich auch im Datenblatt "SAD + W" bzw. "SAD + R", 
siehe Bild.

EDIT: Auf S.23 ist sogar die fertige Tabelle

: Bearbeitet durch User
von Sven (Gast)


Lesenswert?

Die Seite 23 habe ich mir auch schon ausgedruckt, ich verstehe das jetzt 
so: Es können zwei Devices (L2GD20) an einem I2c - Bus angesprochen 
werden (was bei mir aber nicht der Fall ist). Diese unterscheiden durch 
SAD[0] 0 und 1, und dann kommt noch das Bit zum Lesen / Schreiben dazu. 
Ach wie schön einfach war es doch als die Adressen noch "hart" 
verdrahtet wurden. Vielen Dank für die Hilfe, ich versuch mal damit kalr 
zu kommen, ein paar Bytes aus der IMU zu bekommen.

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.