Forum: Mikrocontroller und Digitale Elektronik Problem mit ITG3200 Gyro (i2c)


von joe (Gast)


Angehängte Dateien:

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?

von Michael K. (mmike)


Lesenswert?

Hallo joe,

Mach doch mal nach jedem Schreibvorgang eine Abfrage ob das geschriebene 
auch ge"acked" wurde. Evtl. ist nicht nur das lesen das Problem. Sonst 
alles richtig verkabelt? Pullups ....

Grüße,
Michael

von joe (Gast)


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...

von joe (Gast)


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
}

von joe (Gast)


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 ;)

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.