?? 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 + -