📄 iap_sst.asm.bak
字号:
; R5 = Address Byte Low
; (2) Sector Count (in R6)
;
; RETURNS: Nothing
;
; DESTROYED: R0, R4, R5, R6
;************************************************************************
sector_e: ;扇区擦除子程序
mov a,r4 ;
anl a,#0f0h
cjne a,#0f0h,sector_e1 ;判断擦除的是B0区还是B1区
mov r0,#40h ;是B1区,为小扇区(64字节)
sjmp sector_e2 ;
sector_e1:
mov r0,#80h ;是B0区,为大扇区(128字节)
sector_e2:
mov a,SFCF
orl a,#0c0h ; VIS = 1,IAPEN=1,激活IAP功能
mov SFCF,a ; put SFCF, ISP ENABLE which enables 4K block
mov SFAH,r4 ;装入要擦除的扇区高地址
mov SFAL,r5 ;装入要擦除的扇区低地址
clr ea ;在擦除过程中,禁止一切中断
mov SFCM,#0bh ;执行扇区擦除命令SFCM=#0BH
nop
nop
nop
acall done? ;等待擦除操作完毕
setb ea
jb ERR,sector_e3 ;擦除超时,中断退出
djnz COUNT,se_nxt ;
sjmp sector_e3 ;所有扇区均已擦完
sector_e3:
jnb TX,$
clr TX
mov a,FLAGS
mov sbuf,a ; send FLAGS byte to PC
nop
ret
se_nxt:
clr c ; configure for next sector
mov a,r5 ;转到下一个扇区的字节地址
add a,r0
mov r5,a ;计算下一个扇区的字节首地址
mov a,r4
addc a,#00h
mov r4,a ; high-byte address updated for next sector
sjmp sector_e2 ; go erase next sector
;************************************************************************
;
; Name: PROGRAM BYTE ROUTINE
;
; INPUTS: (1) Starting Address
; R4, DPH = AdrHi
; R5, DPL = AdrLo
; (2) Byte Count (in R6)
;
; RETURNS: Nothing
;************************************************************************
program_b: ;字节编程子程序
jnb RX,$
clr RX
mov a,b
mov PCDATA,a ;接收要编程的字节数据
mov a,SFCF
orl a,#0c0h ; VIS = 1,IAPEN=1,激活IAP功能
mov SFCF,a
mov SFAH,dph ; 设置要编程的字节地址
mov SFAL,dpl
mov SFDT,PCDATA
mov SFCM,#0eh ; 字节编程命令,SFCM=#0eh
nop
nop
nop
acall done? ;等待操作完毕
jb ERR,program_err ;超时退出
inc dptr ;字节地址加一
mov a,FLAGS
jnb TX,$
clr TX
mov sbuf,a ;发送标志给 PC
nop
djnz COUNT,program_b ;判断是否数据全部写完
program_1:
mov a,SFST
mov STATUS,a
jb BUSY,program_1 ;等待最后一个字节编程完毕
sjmp program_2
program_err:
mov a,FLAGS
jnb TX,$
clr TX
mov sbuf,a ; send error to PC
program_2:
mov a,FLAGS
jnb TX,$
clr TX
mov sbuf,a ; last send...
nop
nop
ret
;************************************************************************
;
; Name: VERIFY BYTE ROUTINE
;
; INPUTS: (1) Starting Address
; R4, DPH = Address Byte High
; R5, DPL = Address Byte Low
; (2) Sector Byte Length (in R6)
;
; RETURNS: SFDT = Last Data Read
;
; DESTROYED: R4, R5, R6
;************************************************************************
verify_b: ;字节校验子程序
mov a,SFCF
orl a,#0c0h ;VIS = 1,IAPEN=1,激活IAP功能
mov SFCF,a
mov SFAH,dph ; load sfah with high address byte
mov SFAL,dpl ; load sfal with low address byte
mov SFCM,#0ch ; issue IAP complete command,字节校验
nop
nop
nop
mov a,SFDT ;读出单元的内容,并发给PC
jnb TX,$
clr TX
mov sbuf,a ; send data byte to PC
inc dptr
djnz COUNT,verify_b ; next byte until count reaches zero
mov a,FLAGS ;读完所有的字节
jnb TX,$
clr TX
mov sbuf,a ;发送标志到PC
nop
nop
ret
;------------------------
BLOCK_E: ;块擦除子程序
mov a,SFCF
orl a,#0c0h ;VIS = 1,IAPEN=1,激活IAP功能
mov SFCF,a
mov a,r4
jz BLOCK_E1 ;R4=0,擦除B0块内容
sjmp BLOCK_E2
BLOCK_E1:
mov SFAH,#00h ;sfah=#00h,擦除B0块内容,sfah=#F0h,擦除B1块内容
mov SFDT,#55h
clr ea
mov SFCM,#0dh ;块擦除命令
nop
nop
acall done? ;等待操作完毕
setb ea
BLOCK_E2:
jnb TX,$
clr TX
mov a,FLAGS
mov sbuf,a ;发送标志
nop
nop
ret
;------------------------
BURST_P: ;闪速编程子程序
mov a,SFCF
orl a,#0c0h ;VIS = 1,IAPEN=1,激活IAP功能
mov SFCF,a
mov SFAH,dph
mov SFAL,dpl
BURST_P1:
jnb RX,$
clr RX
mov a,b
mov PCDATA,a ;接收下一个字节数据
mov SFDT,PCDATA
mov SFCM,#06h ;闪速编程
acall test_busy ;闪速编程结束?
inc dptr
inc SFAL
djnz COUNT,BURST_P1 ;编程下一个字节
acall done?
mov a,FLAGS
jnb TX,$
clr TX
mov sbuf,a
nop
ret
;-----------------------------
test_busy: ;闪速编程结束?
mov a,SFST
anl a,#08h
cjne a,#00h,test_busy
ret
;-------------------------------
LOCK_P: ;加密编程子程序
mov SFDT,#55h
mov b,PCDATA ;取加密的数据
mov a,#05h
mul ab
mov dptr,#LOCK_P1
jmp @a+dptr
LOCK_P1:
mov SFCM,#0fh ;加密位SB1编程命令 PROGRAMMING
sjmp LOCK_P2
mov SFCM,#03h ;加密位SB2编程命令 PROGRAMMING
sjmp LOCK_P2
mov SFCM,#05h ;加密位SB3编程命令 PROGRAMMING
LOCK_P2:
mov a,SFST
anl a,#04h ;检测FLASH_BUSY
cjne a,#00h,LOCK_P2
nop
ret
;************************************************************************
;* *
;* CHECK WHETHER THE FLASH OPERATION IS COMPLETED *
;* *
;************************************************************************
done?: ;检测FLASH操作是否结束子程序
mov r0,#0ffh
loadr1:
mov r1,#0ffh
copy:
mov a,SFST
mov STATUS,a
jnb BUSY,ready ;BUSY=0,操作结束
djnz r1,copy
djnz r0,loadr1
setb ERR ;操作超时,置超时标志
ret
ready:
clr ERR ;操作结束,置操作结束标志
ret
;************************************************************************
;* *
;* SERIAL INTERRUPT SERVICE ROUTINE *
;* *
;************************************************************************
rs232: ;串行中断子程序
push acc
jbc ri,rxdpc
clr ti ;是发送中断,置发送标志TX
setb TX ; set flag for sent data to PC
pop acc
reti
rxdpc:
setb RX ;是接收中断,置接收标志RX
mov a,sbuf
mov b,a ;将接收的数据放入B中
clr TX
mov sbuf,a ;再将接收的数据发给PC用来校验
pop acc
reti
ajmp loop ;软件陷阱
nop
nop
nop
ajmp loop
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -