uint8_t mcp79410_read_sram(uint8_t offset) {
	uint8_t data[1];
	data[0] = 0x20 + offset;
	twi_write_to(0x6f, data, 1, TWI_BLOCK, TWI_NO_STOP);
	twi_read_from(0x6f, data, 1, TWI_STOP);
	return data[0];
}
void mcp79410_set(struct mcp79410_time_t *time) {
	// see the note in section 5.3 about how to set the timekeeping registers without rollover issues
	uint8_t data[7];

	// disable the crystal input (ST = 0)
	data[0] = 0x00;								// seconds register
	data[1] = 0x00;								// ST = 0
	twi_write_to(0x6f, data, 2, TWI_BLOCK, TWI_STOP);

	// wait for the oscilator to stop (OSCRUN == 0)
	data[0] = 0x03;
	data[1] = 0x20;
	while (data[1] & 0x20) {
		twi_read_from(0x6f, data, 2, TWI_STOP);
	}
	
	// set the time fields
	data[0] = 0x01;								// minutes register
	data[1] = hex2bcd(time->minute);
	data[2] = hex2bcd(time->hour);
	data[3] = hex2bcd(time->wday) | 0x08,		// enable battery (VBATEN = 1) 
	data[4] = hex2bcd(time->mday),
	data[5] = hex2bcd(time->month),				// bit 5 is LPYR
	data[6] = hex2bcd(time->year - 2000);
	twi_write_to(0x6f, data, 7, TWI_BLOCK, TWI_STOP);
	
	// set the seconds field and enable the crystal input (ST = 1)
	data[0] = 0x00;								// seconds register
	data[1] = hex2bcd(time->second) | 0x80;
	twi_write_to(0x6f, data, 2, TWI_BLOCK, TWI_STOP);
}
void mcp79410_get(struct mcp79410_time_t *time) {
	// register, unused...
	// seconds, minutes, hours, dow, date, month, year
	uint8_t data[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
	
	twi_write_to(0x6f, data, 1, TWI_BLOCK, TWI_NO_STOP);
	twi_read_from(0x6f, data, 7, TWI_STOP);
	
	// it's not clear from the datasheet if the unused bits are 0 or undefined
	time->second = bcd2hex(data[0] & 0x7f);		// bit 7 is the ST flag
	time->minute = bcd2hex(data[1]);
	time->hour = bcd2hex(data[2]);
	time->wday = bcd2hex(data[3] & 0x07);		// bit 5 is OSCRUN, bit 4 is PWRFAIL, bit 3 is VBATEN
	time->mday = bcd2hex(data[4]);
	time->month = bcd2hex(data[5] & 0x1f);		// bit 5 is LPYR
	time->year = 2000 + bcd2hex(data[6]);
}
void ds1307_get(struct ds1307_time_t *time) {
	// register, unused...
	// seconds, minutes, hours, dow, date, month, year
	uint8_t data[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
	
	twi_write_to(0x68, data, 1, TWI_BLOCK, TWI_NO_STOP);
	twi_read_from(0x68, data, 7, TWI_STOP);
	
	// it's not clear from the datasheet if the unused bits are 0 or undefined
	time->second = bcd2hex(data[1] & 0x7f);   // bit 7 is the CH flag
	time->minute = bcd2hex(data[2]);
	time->hour = bcd2hex(data[3]);
	time->wday = data[4];
	time->mday = bcd2hex(data[5]);
	time->month = bcd2hex(data[6]);
	time->year = 2000 + bcd2hex(data[7]);
}