ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
23 ноября
739939 Топик полностью
Apтём (27.02.2017 17:44, просмотров: 314) ответил Ксения на Я с X-Мегой много возилась, но по части EEPROM не было нужды. Однако отвечу, как я это себе представляю.
Это вы как-то не совсем правильно понимаете: 
Страница 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(); }