Corrected seeprom write function that wrote wrong number of bytes when near page end.

This commit is contained in:
skarg
2010-03-25 15:33:56 +00:00
parent f92316649b
commit b56cf7bba5
+8 -6
View File
@@ -285,13 +285,14 @@ int seeprom_bytes_write_page(
int rv = 0; int rv = 0;
uint16_t endaddr; uint16_t endaddr;
uint8_t twst; /* status - only valid while TWINT is set. */ uint8_t twst; /* status - only valid while TWINT is set. */
uint16_t page_end_addr;
if ((eeaddr + len) < (eeaddr | (SEEPROM_PAGE_SIZE - 1))) { /* limit the length to end of the EEPROM page */
endaddr = eeaddr + len; page_end_addr = eeaddr | (EEPROM_PAGE_SIZE - 1);
} else { if ((eeaddr + len) > page_end_addr) {
endaddr = (eeaddr | (SEEPROM_PAGE_SIZE - 1)) + 1; endaddr = page_end_addr + 1;
len = endaddr - eeaddr;
} }
len = endaddr - eeaddr;
#if SEEPROM_WORD_ADDRESS_16BIT #if SEEPROM_WORD_ADDRESS_16BIT
/* 16bit address devices need only TWI Device Address */ /* 16bit address devices need only TWI Device Address */
sla = SEEPROM_I2C_ADDRESS; sla = SEEPROM_I2C_ADDRESS;
@@ -380,7 +381,7 @@ int seeprom_bytes_write_page(
goto error; goto error;
} }
for (; len > 0; len--) { for (; len > 0; len--) {
TWDR = *buf++; TWDR = *buf;
/* start transmission */ /* start transmission */
TWCR = _BV(TWINT) | _BV(TWEN); TWCR = _BV(TWINT) | _BV(TWEN);
/* wait for transmission */ /* wait for transmission */
@@ -391,6 +392,7 @@ int seeprom_bytes_write_page(
/* device write protected -- Note [16] */ /* device write protected -- Note [16] */
goto error; goto error;
case TW_MT_DATA_ACK: case TW_MT_DATA_ACK:
buf++;
rv++; rv++;
break; break;
default: default: