I2C gibt nur NACK (Fleury

#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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren