Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 27 additions & 10 deletions src/main/drivers/eeprom.c
Original file line number Diff line number Diff line change
Expand Up @@ -236,19 +236,36 @@ static byte_t get_data( void )

static void ready_isr( void )
{
// If no data is left, disable the interrupt and return
if( write_buf_count() == 0 )
// Loop until finding a byte that isn't already set correctly
while( write_buf_count() != 0 )
{
set_eeprom_interrupt_enabled( false );
return;
// Read current data from EEPROM
set_address( s_write_buf[ s_write_tail ].address );
strobe_read_enable();
byte_t current_data = get_data();

// Does the current data match what we want to write?
if( current_data != s_write_buf[ s_write_tail ].data )
{
// Data doesn't match - write it, then stop looping
set_write_mode_erase_write();
set_address( s_write_buf[ s_write_tail ].address );
set_data( s_write_buf[ s_write_tail ].data );
strobe_write_enable();
increment_rollover( s_write_tail, WRITE_BUF_SZ );
break;
}
else
{
// Data matches - ignore this byte and continue looping
increment_rollover( s_write_tail, WRITE_BUF_SZ );
continue;
}
}

// Write the next byte
set_write_mode_erase_write();
set_address( s_write_buf[ s_write_tail ].address );
set_data( s_write_buf[ s_write_tail ].data );
increment_rollover( s_write_tail, WRITE_BUF_SZ );
strobe_write_enable();
// If all data was consumed, clear the interrupt
if( write_buf_count() == 0 )
set_eeprom_interrupt_enabled( false );

} /* ready_isr() */

Expand Down