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
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.