Corrected seeprom write function that wrote wrong number of bytes when near page end.
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user