Forum: Mikrocontroller und Digitale Elektronik I2C gibt nur NACK (Fleury


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Timo E. (tetra)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,
Ich versuche gerade mit einem Atmega328PU per I2C-Protokoll auf den 
Uhrenchip DS1307 zuzugreifen.  Verwendet wird die I2C-Bibliothek von P. 
Fleury.
Ich bekomme immer beim Versuch auf den Uhrenchip zuzugreifen statt ACK 
ein NACK.
Was mich irritiert: Laut Screenshot "NACK mit Atmega" interpretiere ich 
den Eintrag "Write [0x34] + NAK" so, das versucht wird, auf die Adresse 
0x34 des DS1307 zuzugreifen. Aber ich übergebe die Adresse 0x68 laut 
Listing.

Ich habe, um Verdrahtungsfehler auszuschließen, versucht, mit Arduino 
UNO und der dort enthaltenen WIRE-Bibliothek auf die Platine mit dem 
Uhrenchip zuzugreifen, dort funktioniert es, ich bekomme ein ACK (siehe 
Anhang "ACK mit ARDUINO). Sieht jemand, ob ich hier einen Fehler gemacht 
habe?

Viele Grüße,
tetra
1
#include <avr/io.h>
2
#include "i2cmaster.h"
3
4
#define F_CPU  20000000                   // processor clock frequency 20 MHz
5
#define DS1307_Adresse 0x68
6
7
8
void Initialisierung()
9
{
10
  // ----- INITIALISIERUNG -----
11
  i2c_init(); // initialize I2C library
12
  DDRB |= (1<<DDB1); //Pin PB1 (LED) wird auf Ausgang geschaltet
13
  ClearHoldBit(); //Falls der Oszillazor ausgeschaltet sein soll
14
  SQW_ON();  //der Ausgang erzeugt ein 1 Hz Rechtecksignal
15
  LEDOff();
16
}
17
18
void SQW_ON()
19
{
20
  i2c_start(DS1307_Adresse);
21
  i2c_write(0x07);  // Control-Register ansprechen
22
  i2c_write(0x90);  // Setzen auf B 10010000 -> 1 Hz-Ausgang freigeschaltet (1 Hz =>> 0x90 !!!!)
23
  i2c_stop();       // set stop condition = release bus
24
}
25
 
26
void ClearHoldBit()  //There is the CH (clock halt) bit, bit 7 in register 0. If that got set to 1 somehow, the oscillator will not run and neither will SQW.
27
{
28
  if (i2c_start(DS1307_Adresse) == 0) 
29
  {
30
    i2c_write(0x00);  // Control-Register ansprechen
31
    i2c_write(0x40);  // Setzen auf B 01000000 -> Clock-Hold-Bit wird geloescht)
32
    i2c_stop();      // stop transmitting
33
    LEDOff(); //Wenn OK LED aus
34
  }
35
  else if (i2c_start(DS1307_Adresse) == 1)
36
  {
37
    LEDOn(); //bei Fehler LED ein
38
  }
39
}
40
41
void LEDOn()
42
{
43
  PORTB |= (1<<PORTB1); //LED an  PB1 einschalten
44
}
45
46
void LEDOff()
47
{
48
  PORTB &= ~ (1<<PORTB1); //LED an  PB1 ausschalten
49
}
50
51
int main(void)
52
{
53
    Initialisierung();
54
    while (1) 
55
    {
56
    }
57
}

von Daniel (Gast)


Lesenswert?

Der Adresse ist auch das Les/Schreibbit enthalten.
Du musst die Adresse einmal nach links schieben(*2), damit dieser an der 
korrekten Stelle steht.
Dann antwortet der Chip auch.

von HildeK (Gast)


Lesenswert?

Ich benutze auch Fleurys Lib. Bei mir sieht der funktionierende Zugriff 
so aus:
1
  i2c_start(DEV24C32_ADDR+I2C_WRITE);
2
  i2c_write(0);
3
4
// bzw. für Read
5
  ret = i2c_start(DS3231_ADDR+I2C_WRITE);    
6
  i2c_write(DS_MINUTES);                    
7
  i2c_rep_start(DS3231_ADDR+I2C_READ);


Schau mal in die i2cmaster.h, die bei der Lib dabei ist. Dort ist ein 
Beispielcode enthalten.

von Timo E. (tetra)


Lesenswert?

Hallo Daniel,

Vielen Dank!
So funktioniert es:
1
i2c_start(DS1307_Adresse <<1); //1 mal nach links schieben, da in der Adresse  auch das Lese/Schreibbit enthalten ist

Da wäre ich alleine nicht drauf gekommen...

Viele Grüße,

tetra

von HildeK (Gast)


Lesenswert?

Timo E. schrieb:
> #define DS1307_Adresse 0x68

Habe gerade noch das DB vom DS1307 angeschaut; die Adresse ist für die 
Fleury-Lib falsch. Muss heißen
#define DS1307_Adresse 0xD0

von Timo E. (tetra)


Lesenswert?

Hallo HildeK,

auch Dir ein großes Danke!.
Diese Lösung funktioniert ebenfalls, also sowohl Daniel als auch HildeK 
haben Recht:
Verschiebt man die ADresse 0x68 um 1 Bit nach Links ergibt sich die 
Adresse 0xD0

Viele Grüße,

tetra

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.