DS1307 Echtzeituhr am I²C des IO-Warrior

Programmbeispiel

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).