Это вы как-то не совсем правильно понимаете: Страница EEPROM пишется вся целиком, т.к. более мелкими дозами запись технически невозможна.
Пожалуй что это верно - но для программиста это без разницы. Программа пишет определённый байт.
Процедура такая: сперва страница целиком копируется в оперативную память,
Не надо ничего копировать.
Т.е. работа с EEPROM у X-Меги организована, как процедура блочного редактирования ее прошлого содержимого, используя оперативную память в качестве буфера.
Нет - все буферы скрыты от программиста.
Выглядит типа такого:
/*! \brief Write one byte to EEPROM using IO mapping.
*
* This function writes one byte to EEPROM using IO-mapped access.
* If memory mapped EEPROM is enabled, this function will not work.
* This functiom will cancel all ongoing EEPROM page buffer loading
* operations, if any.
*
* \param pageAddr EEPROM Page address, between 0 and EEPROM_SIZE/EEPROM_PAGESIZE
* \param byteAddr EEPROM Byte address, between 0 and EEPROM_PAGESIZE.
* \param value Byte value to write to EEPROM.
*/
void EEPROM_WriteByte( uint8_t pageAddr, uint8_t byteAddr, uint8_t value )
{
/* Flush buffer to make sure no unintetional data is written and load
* the "Page Load" command into the command register.
*/
EEPROM_FlushBuffer();
NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc;
/* Calculate address */
uint16_t address = (uint16_t)(pageAddr*EEPROM_PAGESIZE)
|(byteAddr & (EEPROM_PAGESIZE-1));
/* Set address to write to. */
NVM.ADDR0 = address & 0xFF;
NVM.ADDR1 = (address >> 8) & 0x1F;
NVM.ADDR2 = 0x00;
/* Load data to write, which triggers the loading of EEPROM page buffer. */
NVM.DATA0 = value;
/* Issue EEPROM Atomic Write (Erase&Write) command. Load command, write
* the protection signature and execute command.
*/
NVM.CMD = NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc;
NVM_EXEC();
}