ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
27 ноября
84057
Морковк (21.03.2007 11:46, просмотров: 2598)
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				;