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