ATmega16L. Не могу бутлодырем прошить флэш. Был загрузчик и программатор через UART к меге-128. Работал и работает. Понадобилось "самошить" mega16 - подправил исходники от 128. Но. Чтение флэшки идёт на ура, а вот прописать не удаётся - страницы не трутся, сохраняя старое содержимое.
Первоначально лодыря прошиваю через SPI. В камне ничего не залочено. Дебажный вывод - порт С пин 4, имеет вид дрыги из H в L и обратно. Длина обеих дрыг по 3.6мкс, между ними 288 мкс, клок внешний 4 МГц.
Целый день сегодня бьюся, и всё на одном месте... :(
Кусок кода ниже. Сначала стираю страницу, потом пишу. В r20 - номер страницы.
;--- page erase
clr zl ; word pointer (0..64)
mov r20 ,zh ; page pointer (0..127)
lsr zh ;
ror zl ;
3$: if1 SPMCR.0
br 3$
clr portC.4 ;debug
mov $03 ,SPMCR ; erase!!!
spm ;
4$: if1 SPMCR.0 ; enable RWW мать их йети
br 4$ ;
set portC.4 ;debug
mov $11 ,SPMCR ;
spm ;
;--- page loading
clr zl ; word pointer (0..64)
mov r20 ,zh ; page pointer (0..127)
shr zh ;
ror zl ;
mov #B_flash ,yl:yh ; from
5$: mov [y]+ ,r0 ; page fill
mov [y]+ ,r1 ;
;
10$: if1 SPMCR.0 ;
br 10$ ;
;
mov $01 ,SPMCR ;
spm ;
add #2 ,zl:zh ; next word?
cmp yl ,#low[B_end] ;
bne 5$ ;
cmp yh ,#high[B_end] ;
bne 5$ ;yes
;--- page write
clr zl ; word pointer (0..64)
mov r20 ,zh ; page pointer (0..127)
lsr zh ;
ror zl ;
20$: if1 SPMCR.0
br 20$
clr portC.4 ;debug
mov $05 ,SPMCR ; write!!!
spm
25$: if1 SPMCR.0 ; wait program complete
br 25$ ;
set portC.4 ;debug
mov $11 ,SPMCR ; enable RWW мать их йети
spm ;