Das folgende Beispiel setzt die Zeit des DS1307 anhand der Systemzeit.
#define DS1307_ADDR 0x68
int iow_ds1307_set(iowh h)
{
uint8_t data[9];
time_t t;
struct tm *ptime;
iow_i2c_enable(h);
time(&t);
ptime = localtime(&t);
data[0]=0x00; /* Set pointer register to 0 register */
data[1]=dec2bcd(ptime->tm_sec);
data[2]=dec2bcd(ptime->tm_min);
data[3]=dec2bcd(ptime->tm_hour);
data[4]=dec2bcd(ptime->tm_wday+1);
data[5]=dec2bcd(ptime->tm_mday);
data[6]=dec2bcd(ptime->tm_mon+1);
data[7]=dec2bcd(ptime->tm_year-100);
data[8]=0;
if(iow_i2c_write(h, DS1307_ADDR, data, 9) < 0) {
printf("write error\n");
}
printf("clock was set successfully\n");
iow_i2c_disable(h);
return 0;
}
Ein vollständiges Codebeispiel auch mit Funktionen zur Anzeige des gepufferten RAM der DS1307 Echtzeituhr gibt es hier zum downloaden: i2c_ds1307.c
Achtung, es wird zwingend meine libiow Version 0.9
oder neuer benötigt.
In ältere Versionen unterstützte der I²C Code das Lesen und Schreiben von mehr als
6 Bytes noch nicht (ab Version 0.9 werden solche Anfragen automatisch in mehrere
Teilrequests zerlegt).