Всё, осилил, работает (в принципе просто) больше времени ушло на отладку записи в проекте (при разных ситуациях пропажи питания) Если кому интересно - код внутри Там есть макросы, но, в принципе всё понятно.
Удручает одно: Ну почему, блядь не сделать всё прозрачно и понятно, одной двумя, ну десятком команд. ИМХО все эти телодвижения можно былоб упрятать в кремний, оставив программисту одну инструкцию записи в EEPROM. Уроды, блин.
P.S. Охренеть какая развесистая тема получилась, пофлеймили изрядно, ну не без пользы, конечно :))
;-------------------------------------------------------------------------------------------------
;Обновление (сравнение/запись)блока данных заданой длины из RAM в EEPROM для контроллера XMEGA
;NVM контроллер д.б. сконфигурирован так, чтобы можно было использовать команды ld/st (MAPPED EEPROM)
;Используемые регистры:
; X - Адрес начала размещения блока данных в RAM
; Z - Адрес начала размещения записываемых данных в EEPROM
; TMP - Длина считываемого блока (до 256 байт) 1..256
; TMP2 - рабочий регистр
;05/VIII.14
WriteEEPROM_ZX:
push TMP ;Сохраним длину блока данных (передаваемую данной П/П через TMP)
;
Mapping_EEPROM ;Переназначение EEPROM в область ОЗУ (для возможности использования команд ld/st)
;-------------- запись (обновление) блока данных из RAM в EEPROM
Updating:
;Проверка не занят ли NVM контроллер какой операцией (например записью предыдущего байта)
Wait_forNVM_BUSY ;проверка готовности к записи (окончания предыдущей операции, - например записи предыдущего байта)
;------------------------
ld TMP,X ;читаем из RAM очередной байтик данных в TMP
ld TMP2,Z ;читаем байт из EEPROM
cp TMP,TMP2 ; сравниваем их.
breq WR_CheckEND ; Если они одинаковые, то пропускаем запись и идём на проверку , иначе будем писать.
;--- ЗАПИСЬ (вариант для Mapped-EEPROM) ---
st Z,TMP ;копируем байт данных (TMP) в NVM буфер данных EEPROM (вариант для Maped-EEPROM)
;
sts NVM_ADDR0,ZL ;копируем адрес в NVM буфер адреса EEPROM (байты 0,1,2)
sts NVM_ADDR1,ZH
clr TMP2
sts NVM_ADDR2,TMP2
S_LDI NVM_CMD,NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc ;запишем команду ситрания-записи
;
lds TMP,NVM_CTRLA ;установим флажок CMDEX, активизирующий команду записи (не меняя остальных бит)
sbr TMP,NVM_CMDEX_bm
Write_Locked_Register_by_REG NVM_CTRLA,TMP ;Активизируем команду записи через механизм работы с защищёнными регистрами
WR_CheckEND:
adiw X,1 ;инкрементируем индексные (адресные) регистры (выше это делать нельзя, т.к. Z используется для записи)
adiw Z,1
pop TMP ;посмотрим на счётчик считанных байт
subi TMP,1 ; уменьшим его
push TMP ; и сохраним
brcc Updating ;Если ещё не весь блок считали, то продолжаем
pop TMP ; иначе подчищаем стек (команда push была в начале П/П) и уходим.
;
Unmapping_EEPROM ;Отмена переназначения EEPROM в область ОЗУ (для запрета возможности использования команд ld/st)
;
Wait_forNVM_BUSY ;Ожидаем окончания записи последнего байта
ret
;-------------------------------------------------------------------------------------------------
;Макрос проверки занятости и ожидания окончания операций NVM контроллера
;используемые регистры:
; TMP
;Синтаксис:
; Wait_forNVM_BUSY
.macro Wait_forNVM_BUSY
call Verify_NVM_BUSY
.endmacro
Verify_NVM_BUSY:
lds TMP,NVM_STATUS ;-- проверка на BUSY и FBUSY
sbrc TMP,NVM_NVMBUSY_bp ;Если NVM контроллер не занят, то перескакиваем на проверку занятости при работе с флешем
rjmp Verify_NVM_BUSY ; иначе ждём, пока NVM-контроллер освободится.
sbrc TMP,NVM_FBUSY_bp ;Если NVM контроллер уже ничем не занят, то уходим,
rjmp Verify_NVM_BUSY ; иначе ждём, пока NVM-контроллер освободится.
ret
;----------------------------------------------------------------------------
;Разблокировка (на 4 такта) конфигурационных регистров системы
;и запись в них байта данных
;Синтаксис: Write_Locked_Register_by_REG Register,REG
; Где Register,REG - регистр для записи, и регистр с даными для записи - соответственно
;Никакие регистры, кроме TMP, - не портятся
;05/VIII.14
.macro Write_Locked_Register_by_REG
push @1
ldi TMP,CCP_IOREG_gc;Временно снимаем защиту с критически важных коннфигурационных
out CPU_CCP,TMP ; регистров (защита через 4 такта автоматически восстановится).
pop TMP ;Вспомним, данные, которые хотели записать.
sts @0,TMP ;Пишем данные из REG в защищённый регистр
.endmacro
;-------------------------------------------------------------------------------------------------