Пытаюсь написать загрузчик (bootloader) для ATMEGA128 и не получается. Программа должна постранично модифицировать память программ.
Посмотрел много примеров, вроде делаю все как у всех, но не работает.
Не работает самое элементарное - стирание страницы, запись пока не пробовал, т.к. перед записью нужно стереть страницу.
Вот кусок программы, должна стираться нулевая (для примера) страница:
;Задаем нулевую страницу для стирания
clr ZL
clr ZH
;Проверяем, что не идет запись, ждем когда кончится, если идет
M1:
lds r16,SPMCSR
sbrc r16,SPMEN
rjmp M1
;>Проверяем, что не идет запись в EE, ждем когда кончится, если идет
M2:
sbic EECR,EEWE
rjmp M2
;>Запускаем стирание
ldi r16, (1<<PGERS) | (1<<SPMEN)
sts SPMCSR,r16
spm
;Ждем, когда окончится стирание
M3:
lds r16,SPMCSR
sbrc r16,SPMEN
rjmp M3
Программа виснет на команде spm, дальше не идет. Если закомментировать команду spm,
то все проскакивает (но стирания, естественно тоже не происходит).
Данная программа стартует с адреса 0x1F000 и расположена в области 0x1F000...0x1FFFF.
Может не так устанавливаю FUSES???
Установлено вот так:
BODLEVEL = 1
BODEN = 0
SUT = 2
CKSEL = F
BLB1 = 3 <-полный доступ к памяти зпгрузчика
BLB0 = 3 <-полный доступ к памяти программ
OCDEN = 1
JTAGEN = 1
CKOPT = 1
EESAVE = 0
BOOTSZ = 0 <- 4K область загрузчика (адреса 1F000-1FFFF)
BOOTRST = 0 <- Стартовать с загрузчика (c адреса 1F000)
M103C = 1
WDTON = 1
Где я ошибся, не понимаю?