I2C gibt nur NACK (Fleury

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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.