⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 28sf040a.asm

📁 里面包括很多的驱动程序的
💻 ASM
📖 第 1 页 / 共 3 页
字号:

;==========================================================
;命令接口的分解部分
;==========================================================
;-------------------------------------
;写入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 + -