Problem mit ITG3200 Gyro (i2c)

Gast #2274410
Lesenswert?

Hallo,

ich versuche gerade das Gyroskop ITG3200 per I2C auszulesen.
Im Anhang ist der Sourcecode (zumindest alles relevante)

Per UART erhalte ich dann das hier:
1
i2c_write(0xD3) failed!
2
TWSR = 0x40

Also klappt es anscheinend nicht, die Adresse des ITG3200 + das Read bit 
zu senden..
Ich hab schon so viel probiert aber ich finde den Fehler nicht..
Habt ihr eventuell einen Tipp?
Angehängte Dateien:
Gast #2274450
Lesenswert?

Hallo,

die Initialisierung klappt komischerweise ohne Probleme... Hier noch der 
Code:
1
void itg3200_init(void)
2
{
3
  // reset to defaults
4
  itg3200_write(PWR_MGM, 0x80);
5

6
  // SMPLRT_DIV = 0
7
  itg3200_write(SMPLRT_DIV, 0x00);
8

9
  // DLPF_CFG = 0, FS_SEL = 3
10
  itg3200_write(DLPF_FS, 0x18);
11

12
  // no interrupts
13
  itg3200_write(INT_CFG, 0x00);
14

15
  // normal operation...
16
  itg3200_write(PWR_MGM, 0x00);
17

18
  // wait 100ms...
19
  _delay_ms(100);
20
}

Pullups sind 4.7k an 3.3V, das sollte also auch passen... Alles ist auf 
einer Platine verlötet, also sollte die "Kabellänge" auch nichts 
ausmachen...
Gast #2274465
Lesenswert?

Das hier habe ich noch vergessen:
1
void itg3200_write(uint8_t address, uint8_t data)
2
{
3
  // start transmission
4
  i2c_start();
5
  i2c_write(ITG3200_ADDRESS + I2C_WRITE);
6

7
  // write register address and data...
8
  i2c_write(address);
9
  i2c_write(data);
10

11
  // stop transmission
12
  i2c_stop();
13
}
Gast #2274531
Lesenswert?

Hallo,

ich habe den Fehler selbst gefunden ;)
In der i2c.c ist in dieser Zeile ein Fehler:
1
if( ((TWSR & 0xF8) != TW_MT_SLA_ACK) && ((TWSR & 0xF8) != TW_MT_DATA_ACK))

Das ganze muss so lauten:
1
if( ((TWSR & 0xF8) != TW_MT_SLA_ACK) && ((TWSR & 0xF8) != TW_MT_DATA_ACK) && ((TWSR & 0xF8) != TW_MR_SLA_ACK))

Nun geht alles ;)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren