📄 28sf040a.asm
字号:
;==========================================================
;命令接口的分解部分
;==========================================================
;-------------------------------------
;写入FLASH的一个字节
;输入:[LADD_H3BIT,LADD_8TF,LADD_0T7,Acc 数据值]
;输出:[C=0 成功, C=1 失败]
;使用:
[Acc,DPTR,F_LADD_TO_FADD,F_GET_P1_DATA_AND_DPTR,P1_DATA,FLASH_START_ADD,WAIT_WR_
END]
;-------------------------------------
F_WRITE_BYTE:
PUSH DPH
PUSH DPL
PUSH ACC
LCALL F_LADD_TO_FADD
LCALL F_GET_P1_DATA_AND_DPTR
MOV P1,P1_DATA
PUSH DPH
PUSH DPL
MOV DPTR,#FLASH_START_ADD
MOV A,#10H
MOVX @DPTR,A
POP DPL
POP DPH
POP ACC
MOVX @DPTR,A
LCALL F_WAIT_WR_END
POP DPL
POP DPH
RET
;-------------------------------------
;芯片的查空
;输入:[无]
;输出:[C=0 成功, C=1 失败]
;使用:[Acc,DPTR,C,LADD_H3BIT,LADD_8TF,F_BCHECK_SECTOR]
;-------------------------------------
F_BCHECK_CHIP:
PUSH DPH
PUSH DPL
MOV LADD_H3BIT,#0
MOV LADD_8TF,#0
CLR LADD_OVERFLOW_BIT
FBC_01:
LCALL F_BCHECK_SECTOR
JNC FBC_03
LJMP FBC_OUT
FBC_03:
JNB LADD_OVERFLOW_BIT,FBC_01
CLR C
FBC_OUT:
POP DPL
POP DPH
RET
;-------------------------------------
;扇区的查空
;输入:[扇区号LADD_H3BIT,LADD_8TF]
;输出:[C=0 成功, C=1 失败,输入参数已经更改]
;使用:[Acc,R7,DPTR]
;-------------------------------------
F_BCHECK_SECTOR:
PUSH DPH
PUSH DPL
MOV R7,#0
MOV LADD_0T7,#0
FBS_NEXT_BYTE:
LCALL F_READ_A_BYTE
CJNE A,#CONST_BLANK_CHAR,FBS_ERR
LCALL F_INC_LADD
DJNZ R7,FBS_NEXT_BYTE
CLR C
LJMP FBS_OUT
FBS_ERR:
SETB C
FBS_OUT:
POP DPL
POP DPH
RET
;-------------------------------------
;扇区的擦除
;输入:[扇区号LADD_H3BIT,LADD_8TF]
;输出:[C=0 成功, C=1 失败,输入参数已经更改]
;使用:
[Acc,R7,DPTR,F_WRITE_A_BYTE,F_INC_LADD,HD_XRAM_PAGE_SEL,HD_SELECT_FLASH/XRAM,F_W
AIT_WR_END]
;DPTR地址范围:0000H...3FFFH
;-------------------------------------
F_ERASE_SECTOR:
PUSH DPH
PUSH DPL
MOV LADD_0T7,#0
LCALL F_LADD_TO_FADD
LCALL F_GET_P1_DATA_AND_DPTR
MOV P1,P1_DATA
PUSH DPH
PUSH DPL
LCALL HD_SELECT_FLASH
MOV DPTR,#FLASH_START_ADD
MOV A,#20H
MOVX @DPTR,A
LCALL HD_SELECT_XRAM
LCALL HD_SELECT_FLASH
POP DPL
POP DPH
MOV A,#0D0H
MOVX @DPTR,A
MOV R7,#100
FSE_WAIT:
LCALL F_WAIT_WR_END
JNC FSE_OUT
DJNZ R7,FSE_WAIT
SETB C
FSE_OUT:
POP DPL
POP DPH
RET
;-------------------------------------
;写入FLASH的一个扇区
;输入:[扇区地址LADD_H3BIT,LADD_8TF,XRAM的地址DPTR,XRAM_BLOCK_BIT]
;输出:[C=0 成功, C=1 失败,输入参数已经更改]
;使用:
[Acc,B,DPTR,F_WRITE_A_BYTE,F_INC_LADD,HD_XRAM_PAGE_SEL,HD_SELECT_FLASH/XRAM]
;DPTR地址范围:0000H...3FFFH
;-------------------------------------
F_WRITE_SECTOR:
MOV LADD_0T7,#0
MOV B,#0
FWS_NEXT:
PUSH B
LCALL HD_XRAM_PAGE_SEL
LCALL HD_SELECT_XRAM
MOVX A,@DPTR
INC DPTR
PUSH DPH
PUSH DPL
PUSH ACC
LCALL F_SDUP
POP ACC
LCALL F_WRITE_BYTE
JC FWS_ERR
LCALL F_CHIP_RESET
LCALL F_SDP
LCALL F_INC_LADD
POP DPL
POP DPH
POP B
DJNZ B,FWS_NEXT
LCALL F_CHIP_RESET
LCALL F_SDP
CLR C
RET
FWS_ERR:
LCALL F_CHIP_RESET
LCALL F_SDP
POP ACC
POP DPL
POP DPH
POP B
SETB C
RET
;-------------------------------------
;读取FLASH的一个扇区(256字节)存放到指定的外部RAM
;输入:[扇区地址LADD_H3BIT,LADD_8TF,XRAM的地址DPTR,XRAM_BLOCK_BIT]
;输出:[输入参数已经更改]
;使用:
[Acc,R7,DPTR,F_READ_A_BYTE,F_INC_LADD,HD_XRAM_PAGE_SEL,HD_SELECT_FLASH/XRAM]
;DPTR地址范围:0000H...3FFFH
;-------------------------------------
F_READ_SECTOR:
MOV LADD_0T7,#0
MOV R7,#0
FRS_NEXT:
PUSH DPH
PUSH DPL
LCALL HD_SELECT_FLASH
LCALL F_READ_A_BYTE
PUSH ACC
LCALL F_INC_LADD
POP ACC
POP DPL
POP DPH
LCALL HD_XRAM_PAGE_SEL
LCALL HD_SELECT_XRAM
MOVX @DPTR,A
INC DPTR
DJNZ R7,FRS_NEXT
RET
;----------------------------------
;读取FLASH的一个字节
;输入:[LADD_H3BIT,LADD_8TF,LADD_0T7]
;输出:[Acc]
;使用:[Acc,DPTR,F_LADD_TO_FADD,F_GET_P1_DATA_AND_DPTR,P1_DATA,HD_SELECT_FLASH]
;----------------------------------
F_READ_A_BYTE:
PUSH DPH
PUSH DPL
LCALL F_LADD_TO_FADD
LCALL F_GET_P1_DATA_AND_DPTR
MOV P1,P1_DATA
LCALL HD_SELECT_FLASH
MOVX A,@DPTR
POP DPL
POP DPH
RET
;-------------------------------------
;芯片的擦除
;输入:[无]
;输出:[C=0 成功,=1 失败]
;使用:
[Acc,R7,DPTR,HD_SELECT_FLASH/XRAM,FLASH_START_ADD,F_WAIT_WR_END,F_CHIP_RESET]
;-------------------------------------
F_ERASE_CHIP:
PUSH DPH
PUSH DPL
LCALL HD_SELECT_FLASH
MOV DPTR,#FLASH_START_ADD
MOV A,#30H
MOVX @DPTR,A
LCALL HD_SELECT_XRAM
LCALL HD_SELECT_FLASH
MOV DPTR,#FLASH_START_ADD
MOV A,#30H
MOVX @DPTR,A
MOV R7,#200
FEC_WAIT:
LCALL F_WAIT_WR_END
JNC FEC_OUT
LCALL PUB_DELAY_100us
DJNZ R7,FEC_WAIT
SETB C
FEC_OUT:
POP DPL
POP DPH
RET
;-------------------------------------
;读取芯片ID的值
;输入:[无]
;输出:[F_CHIP_ID_BYTE1/2]
;使用:[Acc,DPTR,FLASH_START_ADD,F_READ_A_BYTE,F_CHIP_RESET]
;-------------------------------------
F_READ_CHIP_ID:
PUSH DPH
PUSH DPL
MOV DPTR,#FLASH_START_ADD
MOV A,#90H
MOVX @DPTR,A
MOV LADD_H3BIT,#00H
MOV LADD_8TF,#00H
MOV LADD_0T7,#00H
LCALL F_READ_A_BYTE
MOV F_CHIP_ID_BYTE1,A
LCALL F_INC_LADD
LCALL F_READ_A_BYTE
MOV F_CHIP_ID_BYTE2,A
LCALL F_CHIP_RESET
POP DPL
POP DPH
RET
;==========================================================
;其他的FLASH操作子程序
;-------------------------------------
;等待字节的写操作完毕
;入口:[DPTR]
;出口:[C=0 成功, =1 出错]
;使用:[Acc,B,C,R6,DPTR]
;-------------------------------------
F_WAIT_WR_END:
MOV R6,#5
FWRE_NEXT:
MOVX A,@DPTR ;2
MOV B,A ;1
MOVX A,@DPTR ;2
XRL A,B ;1
ANL A,#40H ;1
JB ACC.6,FWRE_JUDGE ;2
CLR C
RET
FWRE_JUDGE:
DJNZ R6,FWRE_NEXT ;2
SETB C
RET
;-------------------------------------
;进行软件数据保护SDP
;入口:[无]
;出口:[无]
;使用:[LADD_H3BIT,LADD_8TF,LADD_0T7]
;-------------------------------------
F_SDP:
PUSH LADD_H3BIT
PUSH LADD_8TF
PUSH LADD_0T7
MOV LADD_H3BIT,#0
MOV LADD_8TF,#18H
MOV LADD_0T7,#23H
LCALL F_READ_A_BYTE
MOV LADD_0T7,#20H
LCALL F_READ_A_BYTE
MOV LADD_0T7,#22H
LCALL F_READ_A_BYTE
MOV LADD_8TF,#04H
MOV LADD_0T7,#18H
LCALL F_READ_A_BYTE
MOV LADD_0T7,#1BH
LCALL F_READ_A_BYTE
MOV LADD_0T7,#19H
LCALL F_READ_A_BYTE
MOV LADD_0T7,#0AH
LCALL F_READ_A_BYTE
POP LADD_0T7
POP LADD_8TF
POP LADD_H3BIT
RET
;-------------------------------------
;解除软件数据保护SDUP
;入口:[无]
;出口:[无]
;使用:[LADD_H3BIT,LADD_8TF,LADD_0T7]
;-------------------------------------
F_SDUP:
PUSH LADD_H3BIT
PUSH LADD_8TF
PUSH LADD_0T7
MOV LADD_H3BIT,#0
MOV LADD_8TF,#18H
MOV LADD_0T7,#23H
LCALL F_READ_A_BYTE
MOV LADD_0T7,#20H
LCALL F_READ_A_BYTE
MOV LADD_0T7,#22H
LCALL F_READ_A_BYTE
MOV LADD_8TF,#04H
MOV LADD_0T7,#18H
LCALL F_READ_A_BYTE
MOV LADD_0T7,#1BH
LCALL F_READ_A_BYTE
MOV LADD_0T7,#19H
LCALL F_READ_A_BYTE
MOV LADD_0T7,#1AH
LCALL F_READ_A_BYTE
POP LADD_0T7
POP LADD_8TF
POP LADD_H3BIT
RET
;-------------------------------------
;进行28SF040的复位
;入口:[无]
;出口:[无]
;使用:[ACC,DPTR,HD_SELECT_XRAM]
;-------------------------------------
F_CHIP_RESET:
PUSH DPH
PUSH DPL
MOV DPTR,#FLASH_START_ADD
MOV A,#0FFH
MOVX @DPTR,A
LCALL HD_SELECT_XRAM
POP DPL
POP DPH
RET
;-------------------------------------
;命令程序的跳转
;入口:[R2命令代码0...8]
;出口:[无]
;使用:[Acc,R2,R3,DPTR]
;-------------------------------------
PUB_GO_SUB:
MOV DPTR,#CMD_TABLE
MOV A,R2
ADD A,R2
MOV R3,A
MOVC A,@A+DPTR
XCH A,R3
INC A
MOVC A,@A+DPTR
MOV DPL,A
MOV DPH,R3
CLR A
JMP @A+DPTR
CMD_TABLE:
DW CMD_READ_CHIP_ID ;0
DW CMD_CHIP_ERASE
DW CMD_SECTOR_ERASE
DW CMD_SECTOR_READ ;3
DW CMD_BYTE_READ
DW CMD_SECTOR_WRITE
DW CMD_BYTE_WRITE ;6
DW CMD_CHIP_BCHECK
DW CMD_SECTOR_BCHECK
;-------------------------------------
;第一命令字节的接收和分解
;入口:[无]
;出口:[R2命令代码0...8,C=0 合法命令, C=1 非法命令]
;使用:[Acc,R2]
;-------------------------------------
PUB_RECV_A_CMD:
LCALL COM_RECV_BYTE
JC PUB_RECV_A_CMD
PRAC_1:
CJNE A,#CONST_CMD_CHIP_READ_ID,PRAC_3
MOV R2,#0
RET
PRAC_3:
CJNE A,#CONST_CMD_ERASE_CHIP,PRAC_6
MOV R2,#1
RET
PRAC_6:
CJNE A,#CONSR_CMD_ERASE_SECTOR,PRAC_9
MOV R2,#2
RET
PRAC_9:
CJNE A,#CONSR_CMD_READ_SECTOR,PRAC_12
MOV R2,#3
RET
PRAC_12:
CJNE A,#CONSR_CMD_READ_BYTE,PRAC_15
MOV R2,#4
RET
PRAC_15:
CJNE A,#CONSR_CMD_WRITE_SECTOR,PRAC_18
MOV R2,#5
RET
PRAC_18:
CJNE A,#CONSR_CMD_WRITE_BYTE,PRAC_21
MOV R2,#6
RET
PRAC_21:
CJNE A,#CONSR_CMD_BCHECK_CHIP,PRAC_24
MOV R2,#7
RET
PRAC_24:
CJNE A,#CONSR_CMD_BCHECK_SECTOR,PRAC_27
MOV R2,#8
RET
PRAC_27:
SETB C
RET
;===============
END
;===============
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -