Forum: Mikrocontroller und Digitale Elektronik ATMega 644P I2C-Problem


von GalileosMutter (Gast)


Lesenswert?

Hallo,

beim Versuch, mittels I2C mit einem GPS-Modul (LEA6) zu kommunizieren, 
habe ich folgendes Problem:

ich möchte Daten auslesen. Wenn ich die Funktion I2C_ReadByte_ACK 
benutze, komme ich jedoch nie aus der while-Schleife heraus. Was mache 
ich hier falsch? Wenn ich das 1<<TWINT lösche, dann habe ich zwar keine 
Endlos-Schleife, aber dann ist ja das TWINT nicht zurückgesetzt und ich 
kann mir ja nicht sicher sein, ob die Daten, die ich bekomme, überhaupt 
korrekt sind.

Bei der I2C_ReadByte_NACK() bekomme ich überhaupt keine Reaktion. Laut 
Datenblatt ist es dort ja so, dass ich mit einer 0 in TWEA temporär vom 
Bus abgekoppelt bin, wie kann ich hier das Senden eines NACK erreichen?

Hier sind meine I2C-Routinen, bei denen ich Probleme bekomme:

Problemlos funktionierende Funktionen sind I2C_Start(), I2C_Stop() und 
I2C-WriteByte (unsigned char).
1
unsigned char I2C_ReadByte_ACK(void) // ein Byte mit ACK lesen
2
{
3
  // sendet ACK nach dem Datenempfang, damit der Slave weiss, dass er
4
  // weitere Bytes senden darf.
5
  TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA); // Transfer starten
6
  while(!(TWCR & (1<<TWINT))); // Warte bis erledigt
7
8
  return TWDR; // empfangene Daten zurück
9
}
10
11
unsigned char I2C_ReadByte_NACK(void) // ein Zeichen ohne ACK lesen
12
{
13
  // sendet NACK nach dem Empfang, damit der Slave weiss,dass er
14
  // nichts mehr senden soll. Nomalerweise um das letzte Byte zu empfangen.
15
  TWCR&=(~(1<<TWEA));
16
  TWCR|=(1<<TWEN); // Transfer starten
17
  TWCR|=(1<<TWINT); // Transfer starten
18
  while(!(TWCR & (1<<TWINT))); // Warte bis erledigt
19
  return TWDR; // empfangene Daten zurück
20
}
Vielen Dank für Eure Antworten:)

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.