;**************************************************************
;以下几段为84I9_PROG编程内部操作模块
;**************************************************************
;示例---在指定的扇区内依次写入00H-7FH共128个序列数据
;RR10---写入的扇区地址起始
;--------------------------------------------------------
PROGRAM_84I9_SECTOR:
PUSH R11
PUSH R0
;要写入新数据前必须进行扇区擦除
CALL ERASE_84I9_SECTOR
CALL START_84I9_PROG
;设置写入起始地址为指定扇区的最低地址
CP R11,#80H
JR ULT,SET_00H
LD R11,#80H
JR WB_ST
SET_00H:
LD R11,#00H
WB_ST:
LD R0,#00H
WB_LOOP:
LDC @RR10,R0
INC R11
INC R0
CP R0,#7FH
JR ULE,WB_LOOP
;编程停止
CALL END_84I9_PROG
POP R0
POP R11
RET
;------------------------------------------------------
;擦除芯片内一个SECTOR
;RR10--要擦除的SECTOR地址高低位
;注意: 每个扇区被定义为(00H-7FH和80H-FFH)128个字节
;每个256字节段被分为2个扇区,由FMSECL的值来区分是高位和低位扇区
;若00H<=FMSECL<=7FH,则擦除低位扇区
;若80H<=FMSECL<=FFH,则擦除低位扇区
ERASE_84I9_SECTOR:
SB1
LD FMSECH,R10
LD FMSECL,R11
LD FMUSR,#0A5H
LD FMCON,#0A1H
LD BTCON,#0A0H
REPEAT:
LD FMCON,#10100001B
NOP
NOP
TM FMCON,#4
JR NZ,REPEAT ;检测擦除成功否?
LD FMUSR,#00H
SB0
RET
;-------------------------------------------------------
;扇区写功能启动初始化
;RR10---要写入的扇区地址起始
START_84I9_PROG:
SB1
LD FMSECH,R10
LD FMSECL,R11
LD FMUSR,#0A5H
LD FMCON,#51H
SB0
RET
;-------------------------------------------------------
;编程结束
END_84I9_PROG:
SB1
AND FMCON,#0FEH
LD FMUSR,#00H
SB0
RET
;*****************************************************************