Сам вопрос:
(пред история ниже)
У меня не работает ни стирание, ни запись.
Они проходят, но не дают результата.
бутлоадер у меня весит с
Код
.cseg
.org THIRDBOOTSTART ;($0E00) third boot block size is 1K
.org THIRDBOOTSTART ;($0E00) third boot block size is 1K
фусе биты в лошади я выставил так
Код
WRITE-FUSE 0x3500
WRITE-LOCK 0x00
WRITE-LOCK 0x00
Эта часть работает. Т.е. управление приходит в бут блок
далее проверяется флаг необходимости обновления и при его наличии
стираем память программ, после дергаем прошивку из AT24C128 и пишем
в память программ, по завершению снимаем флаг.
Функции стирания и записи проходят но не изменяют память программ.
Привожу код BootEraseAllPages = Стирание кристалла = всех страниц
кроме бутлоадера.
Код из ком-портового бутлоадера, я его не оптимизировал - оставил практически как был
Код
BootEraseAllPages:
clr ZL ; Set low byte of address
clr ZH ; Set high byte of address
ldi temp2, 0x70 ; всего страниц
BootEraseAllPags1:
rcall BootErasePage ; Стирание страницы
dec temp2 ; Счётчик страниц
brne BootEraseAllPags1
ret
BootErasePage:
; Выбор режима работы SPM команды
ldi temp1, (1<<PGERS)|(1<<SPMEN) ; стереть страницу = установить PGERS и SPMEN в SPMCR
out SPMCR, temp1 ; и выполнить команду SPM.
spm; При SPM функции бит SPMEN должен быть установлен не ранее, чем за четыре цикла до SPM.
rcall BootOpCompl ; Завершили ли операцию (использует temp1)
rcall BootAdrNext ; След адрес (использует temp1)
ret
BootOpCompl:
in temp1,SPMCR ; Set SPMCR for erasing
sbrc temp1,SPMEN ; SPMEN - Store Program Memory Enable
rjmp BootOpCompl ; Erasing complete ?
ret
BootAdrNext:
ldi temp1, 0b01000000 ; Установим следующий адресс
add ZL, temp1
clr temp1
adc ZH, temp1
ret
clr ZL ; Set low byte of address
clr ZH ; Set high byte of address
ldi temp2, 0x70 ; всего страниц
BootEraseAllPags1:
rcall BootErasePage ; Стирание страницы
dec temp2 ; Счётчик страниц
brne BootEraseAllPags1
ret
BootErasePage:
; Выбор режима работы SPM команды
ldi temp1, (1<<PGERS)|(1<<SPMEN) ; стереть страницу = установить PGERS и SPMEN в SPMCR
out SPMCR, temp1 ; и выполнить команду SPM.
spm; При SPM функции бит SPMEN должен быть установлен не ранее, чем за четыре цикла до SPM.
rcall BootOpCompl ; Завершили ли операцию (использует temp1)
rcall BootAdrNext ; След адрес (использует temp1)
ret
BootOpCompl:
in temp1,SPMCR ; Set SPMCR for erasing
sbrc temp1,SPMEN ; SPMEN - Store Program Memory Enable
rjmp BootOpCompl ; Erasing complete ?
ret
BootAdrNext:
ldi temp1, 0b01000000 ; Установим следующий адресс
add ZL, temp1
clr temp1
adc ZH, temp1
ret
Пред история:
Так исторически сложилось, что мои не коммерческие USB IR проекты настраиваются
изменением патчером прошивки. Для меня это был самый простой способ настройки
так как если пользователь повторил один раз проект, то он вполне может его сам
и перепрошить. К тому же для совместимости с разными ОС пришлось урезать HID
дескриптор до минимума (на винде все окей, на линуксах были проблемы, клаво-мышку
он понимает, но ещё и интерфейс программатора - уже нет), то есть не все мои
прошивки имеют обратную связь.
Но со временем, так получилось, что повторения размножились до нескольких тысяч
и всё больше пользователей являлись просто пользователи, для которых девайс - чёрный
ящик и они в глаза не видели программатор.
В одной из HID веток = Джойстике с обратной связью (Feed Back), со временем
возникла необходимость во внешней I2C памяти и у прошивки был штатный интерфейс
обратной связи (который не глючил ни в одной из ОС). Поэтому появилось решение
поставить более ёмкую I2C память = AT24C128 (вместо 24с04) и обновлять прошивки
через неё.
Разнотипные готовые ХИД бутлоадеры подходят мало, так как проект с трудом вмещается
в Мега8, а всё свободное место отведено под кнопки, поэтому изыскать лишних 2кб не
представляется возможным.
Поэтому было решено загнать в бутлоадер часть I2C кода и несколько функций заливки
кристалла, что существенно экономит место на кристалле (нет необходимости городить
интерфейс получения прошивки из вне)...