📄 ispasm.s
字号:
#include <avr/io.h>
#include "clock.h"
#include "isp.h"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.global wait64us ;rcall 4ck count1031ck=64.4375us
wait64us:
mov r0,r1 ;1ck
_wait64usloop:
dec r0 ;1ck
breq _ret ;1ck+1ck
rjmp _wait64usloop ;2ck
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;SLOW 16MHz fck/16/1035 966Hz SCK 可能也不正确,至少1M时钟正常
;FAST 16MHz fck/16/4 250kHz SCK 好象并不正确4M时钟都通信失败。
_ispT:
ldi r21,(1<<USIOIF)
out _SFR_IO_ADDR(USISR),r21
ldi r21,(1<<USIWM0)+(1<<USICS1)+(1<<USICLK)+(1<<USITC) ;
#ifdef selectFAST
sbic _SFR_IO_ADDR(PINA),selectFAST
rjmp _SPI_loop
_slowSPI_loop:
out _SFR_IO_ADDR(USICR),r21 ;1
rcall wait64us
sbis _SFR_IO_ADDR(USISR),USIOIF ;1
rjmp _slowSPI_loop
ret
#endif
_SPI_loop:
out _SFR_IO_ADDR(USICR),r21 ;1
sbis _SFR_IO_ADDR(USISR),USIOIF ;1
rjmp _SPI_loop
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.global ispTransmit32
ispTransmit32:
; push r21
out _SFR_IO_ADDR(USIDR), r22 ;低位先
rcall _ispT ;
in r22,_SFR_IO_ADDR(USIDR) ;
out _SFR_IO_ADDR(USIDR), r23 ;
rcall _ispT ;
in r23,_SFR_IO_ADDR(USIDR) ;
out _SFR_IO_ADDR(USIDR), r24 ;
rcall _ispT ;
in r24,_SFR_IO_ADDR(USIDR) ;
out _SFR_IO_ADDR(USIDR), r25 ;
rcall _ispT ;
in r25,_SFR_IO_ADDR(USIDR) ;
; pop r21
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;uchar ispEnterProgrammingMode()
.global ispEnterProgrammingMode
ispEnterProgrammingMode:
ldi r22,lo8(31)
mov r11,r22
_count_loop:
ldi r22,0xAC;
ldi r23,0x53;
; ldi r24,0;
; ldi r25,0
rcall ispTransmit32
subi r24,lo8(83);0x53 cpi r24,0x53
breq _ret ;return 0
sbi _SFR_IO_ADDR(ISP_OUT),ISP_SCK ;ISP_OUT |= (1 << ISP_SCK);ISP_SCK? ISP_RST?
rcall wait64us;
cbi _SFR_IO_ADDR(ISP_OUT),ISP_SCK ;ISP_OUT &= ~(1 << ISP_SCK);
rcall wait64us;
dec r11
brne _count_loop
_epmret:
_ret:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;uchar ispReadEEPROM(unsigned int address)
.global ispReadEEPROM
ispReadEEPROM:
ldi r22,0xA0 ;
; ldi r25,0;
_transmit32:
mov r23, r9 ;hi
mov r24, r8 ;lo
rjmp _retlast
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;uchar ispReadFlash()
;&prog_address= lo8(r8) hi8(r9) hlo8(r10)
.global ispReadFlash
ispReadFlash:
ldi r22,0x20;cmd
; ldi r25, 0
_address_lsr:
mov r23, r9 ;hi
mov r24, r8 ;lo
lsr r23 ;
bst r10,0
bld r23,7
ror r24 ;
brcc _retlast;
ori r22,0x08;
_retlast:
rcall ispTransmit32;
mov r24, r25;
ret
.global inc_prog_address
inc_prog_address:
sec
adc r8, r1
adc r9, r1
adc r10, r1
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;uchar ispWriteFlash(uchar data)
.global ispWriteFlash
ispWriteFlash:
ldi r22,0x40 ;cmd
mov r25, r24 ;data
cp r4, r1 ;prog_pagesize
cpc r5, r1
breq _address_lsr
rcall _polling_flash ;paged
dec r2 ;prog_pagecounter--
brne _ret ;
rcall ispFlushPage ; 0x7a4 <ispFlushPage>
mov r2, r4
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;ispFlushPage(prog_address, data[i]);
.global ispFlushPage
ispFlushPage:
ldi r22, 0x4c ;cmd
; ldi r25, 0 ;任意值
_polling_flash:
; push r20
ldi r20, 0x7F
mov r11, r25
cpi r22, 0x40
breq _polling
ldi r20,0xFF
ld r11, Y ;Y=data[i]
_polling:
rcall _address_lsr
cp r11,r20
brne _loop_init
ldi r24, CLOCK_T_4800us
rcall Waitn64us
rjmp _popr20ret
_loop_init:
out _SFR_IO_ADDR(TIMERVALUE),r1 ;TIMERVALUE=0
_retries_loop:
rcall ispReadFlash;
cp r24,r20; if (ispReadFlash(address) != 0xFF)
brne _return1
in r24,_SFR_IO_ADDR(TIMERVALUE);
cpi r24,CLOCK_T_9600us
brlo _retries_loop ;if ((uint8_t)TIMERVALUE > CLOCK_T_9600us)
_return1:
_popr20ret:
; pop r20
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;uchar ispWriteEEPROM(uchar data) 返回值无使用去掉
;;;;;;;;;;;;;;;;;;; r24 r25 r22 r23
.global ispWriteEEPROM
ispWriteEEPROM:
ldi r22,0xC0 ;cmd
mov r25,r24 ;data
rcall _transmit32
ldi r24,CLOCK_T_9600us;
; rjmp Waitn64us ;
; ret ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.global Waitn64us
Waitn64us:
rcall wait64us;
subi r24,lo8(-(-1))
brne Waitn64us
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -