Zitat Zitat von oderlachs Beitrag anzeigen
Code:
void SET_Day(uint8_t s_day)
{
        if (s_day < 1) s_day = 1;
        s_day = Decimal_To_BCD(7);     // mal 7 festgelegt zum Test für Sonntag
        TWI_Start();
        TWI_Write_Adr(0xD0);    /* Sende Chip Adresse = 0xD0 für DS1307*/
        TWI_Write_Data(0x03);   /* drittes Zeitregister = weekday*/
        TWI_R_Start();          /* Repeated start */
        TWI_Write_Adr(0xD0);    /* Write Adresse schreiben*/
        TWI_Write_Data(s_day);  // BCD Wert ins Register schreiben 7 für Sonntag
        TWI_Stop();
}
Ich hab jetzt nicht ins Datenblatt geschaut, aber was mir auffällt:
Es geht mit Start los, ok. Dann kommt die Adresse und das R/W Bit. Soweit auch ok.

Nur eine Bemerkung: Auch wenn ich die Funktion "TWI_Write_Adr()" nicht kenne, sollte sie melden, ob ein ACK vom Slave gekommen ist. Wenn man das auswertet weiß man, ob der Slave sich angesprochen fühlt, die Adresse also richtig ist.

Jetzt kommt die Registeradresse, auch ok.

Aber warum jetzt ein Start? Der Slave ist im "Write Mode" (R/W Bit war auf Write), also kann man jetzt den Wert ins Register schreiben. So ist das jedenfalls bei den meissten I2C Bausteinen gängig. Nur wenn man lesen will, bricht man die Übertragung nach dem Schreiben der Registeradresse ab und startet neu mit R/W Bit auf Read. Zusammengefasst : Das zweite Start() und Write_adr() weglassen.

MfG Klebwax