I2C gibt nur NACK (Fleury

OP #7006639
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
}
Angehängte Dateien:
Gast #7006648
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.
Gast #7006668
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.
OP #7006669
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
OP #7006695
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.