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

📄 28sf040a.asm

📁 里面包括很多的驱动程序的
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;2002-03-21...26
;9008D主板上编程28SF040芯片
;8D_ALL.asm
;用串口收发的方式实现了对flash芯片sst28sf040的所有的接口操作!
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;硬件引脚
LED_GRE_PIN        .REG    P1.6
LED_YEL_PIN        .REG    P1.5
LED_RED_PIN        .REG    P3.3
LED_IC1_PIN        .REG    P3.2
LED_IC2_PIN        .REG    P3.5

;编程标志位
XRAM_BLOCK_BIT        .REG    00H    ;外部RAM块的选择(0/1)
LADD_OVERFLOW_BIT    .REG    01H    ;逻辑地址溢出(=1)

;外部操作地址
FLASH_START_ADD        .EQU    4000H    ;器件起始地址
TEMP_DPTR_SADDR        .EQU    0000H    ;XRAM中公共数据存储区的起
始地址
XRAM_ADDH        .EQU    00H    ;操作FLASH所用的XRAM的起始地址
XRAM_ADDL        .EQU    00H


;FLASH 操作的芯片寻址字节
FADD_PAGE        .EQU    30H    ;A14...A18
FADD_HIGH        .EQU    31H    ;A8 ...A13
FADD_LOW        .EQU    32H    ;A0 ...A7

;FLASH 操作的逻辑字节
LADD_H3BIT        .EQU    33H    ;A16...A18
LADD_8TF        .EQU    34H    ;A8 ...A15
LADD_0T7        .EQU    35H    ;A0 ...A7

P1_DATA            .EQU    36H    ;FOR P1 STATE
P1_HIGH_3BIT        .EQU    37H    ;保存P1.7...P1.5的状态

F_CHIP_ID_BYTE1        .EQU    38H    ;SST公司标识字节
F_CHIP_ID_BYTE2        .EQU    39H    ;28xx040芯片标识字节


;常数
CONST_BLANK_CHAR    .EQU    0FFH    ;FLASH 擦除后的空白字符
CONST_TEST_DATA1    .EQU    55H    ;测试XRAM的数据1
CONST_TEST_DATA2    .EQU    0AAH    ;测试XRAM的数据2

CONST_CMD_CHIP_READ_ID    .EQU    'I'    ;读芯片ID命令,0
CONST_CMD_ERASE_CHIP    .EQU    'E'    ;芯片擦除命令,1
CONSR_CMD_ERASE_SECTOR    .EQU    'e'    ;扇区擦除命令,2
CONSR_CMD_READ_SECTOR    .EQU    'R'    ;扇区读取命令,3
CONSR_CMD_READ_BYTE    .EQU    'r'    ;字节读取命令,4
CONSR_CMD_WRITE_SECTOR    .EQU    'W'    ;扇区写入命令,5
CONSR_CMD_WRITE_BYTE    .EQU    'w'    ;字节写入命令,6
CONSR_CMD_BCHECK_CHIP    .EQU    'V'    ;芯片查空命令,7
CONSR_CMD_BCHECK_SECTOR    .EQU    'v'    ;扇区查空命令,8

;出错返回的定义
;命令接口中:
OPERATE_SUCCESS        .EQU    30H    ;成功
ERR_CHIP_READ_ID    .EQU    31H    ;读芯片ID命令处理出错
ERR_ERASE_CHIP        .EQU    32H    ;芯片擦除命令处理出错
ERR_READ_BYTE        .EQU    33H    ;字节读取命令处理出错
ERR_READ_SECTOR        .EQU    34H    ;扇区读取命令处理出错
ERR_WRITE_SECTOR    .EQU    35H    ;扇区写入命令处理出错
ERR_ERASE_SECTOR    .EQU    36H    ;扇区擦除命令处理出错
ERR_BCHECK_SECTOR    .EQU    37H    ;扇区查空命令处理出错
ERR_BCHECK_CHIP        .EQU    38H    ;芯片查空命令处理出错
ERR_WRITE_BYTE        .EQU    39H    ;字节写入命令处理出错
;串口子程序中:
ERR_BYTE_RECV_TIMEOUT    .EQU    40H    ;串口字节接收超时出错
ERR_RECV_DATA_NOT_ALL    .EQU    41H    ;串口数据接收不完整出错
ERR_RECV_ILLEGAL_CMD    .EQU    42H    ;串口收到非法命令出错
ERR_RECV_ILLEGAL_ADDR    .EQU    43H    ;串口收到非法地址值出错
;FLASH操作子程序中:
ERR_FLASH_WRITE_TIMEOUT    .EQU    50H    ;FLASH写入等待超时

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    ORG    0000H
    LJMP    MAIN

;=======================================================
    ORG    0040H
MAIN:
    MOV    IE,#00H
    MOV    SP,#60H
    LCALL    HD_LED_TEST_START
    LCALL    COM_INIT_SET
    MOV    P1_HIGH_3BIT,#0
PRE_START:    
    MOV    A,#1
    LCALL    HD_LIGHT_A_LED
START:    
    LCALL    PUB_RECV_A_CMD
    JNC    RECV_A_CMD
    MOV    A,#ERR_RECV_ILLEGAL_CMD
    LCALL    COM_SEND_BYTE
    LJMP    START
RECV_A_CMD:
    MOV    A,#2            
    LCALL    HD_LIGHT_A_LED
    LCALL    PUB_GO_SUB    
    MOV    A,#2
    LCALL    HD_SHUT_A_LED
    LJMP    PRE_START

;=======================================================
;ALL MODE
;这里的各个命令的相互关系是独立的,有上位机控制他们的次序!
;程序的命令接口层子程序,操作失败时才有出错的串口应答,
;操作成功先发送应答字节再发送数据串(如果有的话)
;-------------------------------
;字节的写入
;入口:[LADD_H3BIT,LADD_8TF,LADD_0T7,写入字节值]
;出口:[串口应答字节]
;使用:[]
;-------------------------------
CMD_BYTE_WRITE:
    LCALL    COM_RECV_BYTE
    JNC    CBW_1
CBW_0:
    MOV    A,#ERR_BYTE_RECV_TIMEOUT
    LJMP    CBW_17
CBW_1:    
    MOV    LADD_H3BIT,A
    LCALL    COM_RECV_BYTE
    JNC    CBW_3
    LJMP    CBW_0
CBW_3:
    MOV    LADD_8TF,A
    MOV    A,LADD_H3BIT
    ANL    A,#0F8H
    JZ    CBW_06
CBW_04:    
    MOV    A,#ERR_RECV_ILLEGAL_ADDR
    LJMP    CBW_17
CBW_06:    
    LCALL    COM_RECV_BYTE
    JNC    CBW_07
    LJMP    CBW_0
CBW_07:
    MOV    LADD_0T7,A

CBW_08:    
    LCALL    COM_RECV_BYTE
    JNC    CBW_09
    MOV    A,#ERR_RECV_DATA_NOT_ALL
    LJMP    CBW_15
CBW_09:
    PUSH    ACC
    LCALL    F_SDUP
    POP    ACC
    LCALL    F_WRITE_BYTE
    JC    CBW_11
    MOV    A,#OPERATE_SUCCESS
    LJMP    CBW_15
CBW_11:
    MOV    A,#ERR_BCHECK_SECTOR            
CBW_15:
    PUSH    ACC
    LCALL    F_CHIP_RESET
    LCALL    F_SDP
    POP    ACC
CBW_17:    
    LCALL    PUB_JUDGE_GIVE_RED
    LCALL    COM_SEND_BYTE
    RET    

;-------------------------------
;芯片的查空
;入口:[无]
;出口:[串口应答字节]
;使用:[]
;-------------------------------
CMD_CHIP_BCHECK:
    LCALL    F_BCHECK_CHIP
    JC    CCB_09
CCB_07:
    MOV    A,#OPERATE_SUCCESS
    LJMP    CCB_15
CCB_09:
    MOV    A,#ERR_BCHECK_CHIP            
CCB_15:
    PUSH    ACC
    LCALL    F_CHIP_RESET
    POP    ACC
    LCALL    PUB_JUDGE_GIVE_RED
    LCALL    COM_SEND_BYTE
    RET        

;-------------------------------
;扇区的查空
;入口:[LADD_H3BIT,LADD_8TF]
;出口:[串口应答字节]
;使用:[]
;-------------------------------
CMD_SECTOR_BCHECK:
    LCALL    COM_RECV_BYTE
    JNC    CSB_41
CSB_40:
    MOV    A,#ERR_BYTE_RECV_TIMEOUT
    LJMP    CSB_57
CSB_41:    
    MOV    LADD_H3BIT,A
    LCALL    COM_RECV_BYTE
    JNC    CSB_43
    LJMP    CSB_40
CSB_43:
    MOV    LADD_8TF,A
    MOV    A,LADD_H3BIT
    ANL    A,#0F8H
    JZ    CSB_46
CSB_44:    
    MOV    A,#ERR_RECV_ILLEGAL_ADDR
    LJMP    CSB_57
CSB_46:    
    LCALL    F_BCHECK_SECTOR
    JC    CSB_49
CSB_47:
    MOV    A,#OPERATE_SUCCESS
    LJMP    CSB_55
CSB_49:
    MOV    A,#ERR_BCHECK_SECTOR            
CSB_55:
    PUSH    ACC
    LCALL    F_CHIP_RESET
    POP    ACC
CSB_57:    
    LCALL    PUB_JUDGE_GIVE_RED
    LCALL    COM_SEND_BYTE
    RET        

;-------------------------------
;扇区的擦除
;入口:[LADD_H3BIT,LADD_8TF]
;出口:[串口应答字节]
;使用:[]
;-------------------------------
CMD_SECTOR_ERASE:
    LCALL    COM_RECV_BYTE
    JNC    CSE_1
CSE_0:
    MOV    A,#ERR_BYTE_RECV_TIMEOUT
    LJMP    CSE_17
CSE_1:    
    MOV    LADD_H3BIT,A
    LCALL    COM_RECV_BYTE
    JNC    CSE_3
    LJMP    CSE_0
CSE_3:
    MOV    LADD_8TF,A
    MOV    A,LADD_H3BIT
    ANL    A,#0F8H
    JZ    CSE_06
CSE_04:    
    MOV    A,#ERR_RECV_ILLEGAL_ADDR
    LJMP    CSE_17
CSE_06:    
    LCALL    F_SDUP
    LCALL    F_ERASE_SECTOR
    JC    CSE_09
CSE_07:
    MOV    A,#OPERATE_SUCCESS
    LJMP    CSE_15
CSE_09:
    MOV    A,#ERR_ERASE_SECTOR            
CSE_15:
    PUSH    ACC
    LCALL    F_CHIP_RESET
    LCALL    F_SDP
    POP    ACC
CSE_17:    
    LCALL    PUB_JUDGE_GIVE_RED
    LCALL    COM_SEND_BYTE
    RET        

;-------------------------------
;扇区的写入
;入口:[LADD_H3BIT,LADD_8TF,256字节的数据]
;出口:[串口应答字节]
;使用:[XRAM_BLOCK_BIT,TEMP_DPTR_SADDR]
;-------------------------------
CMD_SECTOR_WRITE:
    LCALL    COM_RECV_BYTE
    JNC    CSW_1
CSW_0:
    MOV    A,#ERR_BYTE_RECV_TIMEOUT
    LJMP    CSW_15    
CSW_1:    
    MOV    LADD_H3BIT,A
    LCALL    COM_RECV_BYTE
    JNC    CSW_3
    LJMP    CSW_0
CSW_3:
    MOV    LADD_8TF,A
    MOV    A,LADD_H3BIT
    ANL    A,#0F8H
    JZ    CSW_06
CSW_04:    
    MOV    A,#ERR_RECV_ILLEGAL_ADDR
    LJMP    CSW_15
CSW_06:    
    MOV    R7,#0
    MOV    DPTR,#TEMP_DPTR_SADDR
    CLR    XRAM_BLOCK_BIT
    LCALL    COM_RECV_STRING
    JNC    CSW_09
CSW_07:    
    MOV    A,#ERR_RECV_DATA_NOT_ALL
    LJMP    CSW_15
CSW_09:
    MOV    DPTR,#TEMP_DPTR_SADDR
    CLR    XRAM_BLOCK_BIT
    LCALL    F_WRITE_SECTOR
    JNC    CSW_12
CSW_11:
    MOV    A,#ERR_WRITE_SECTOR
    LJMP    CSW_15
CSW_12:
    MOV    A,#OPERATE_SUCCESS        
CSW_15:
    LCALL    PUB_JUDGE_GIVE_RED
    LCALL    COM_SEND_BYTE
    RET
        
;-------------------------------
;扇区的读取
;入口:[LADD_H3BIT,LADD_8TF]
;出口:[串口应答字节,256字节值]
;使用:[XRAM_BLOCK_BIT,TEMP_DPTR_SADDR]
;-------------------------------
CMD_SECTOR_READ:
    LCALL    COM_RECV_BYTE
    JNC    CSR_1
CSR_0:
    MOV    A,#ERR_BYTE_RECV_TIMEOUT
CSR_00:
    LCALL    PUB_JUDGE_GIVE_RED
    LCALL    COM_SEND_BYTE
    RET    
CSR_1:    
    MOV    LADD_H3BIT,A
    LCALL    COM_RECV_BYTE
    JNC    CSR_3
    LJMP    CSR_0
CSR_3:
    MOV    LADD_8TF,A
    MOV    A,LADD_H3BIT
    ANL    A,#0F8H
    JZ    CSR_06
CSR_04:    
    MOV    A,#ERR_RECV_ILLEGAL_ADDR
    LJMP    CSR_00

CSR_06:    
    CLR    XRAM_BLOCK_BIT
    MOV    DPTR,#TEMP_DPTR_SADDR
    LCALL    F_READ_SECTOR
    
    MOV    A,#OPERATE_SUCCESS
CSR_09:    
    LCALL    COM_SEND_BYTE
    
    MOV    R7,#0
    MOV    DPTR,#TEMP_DPTR_SADDR
    CLR    XRAM_BLOCK_BIT
    LCALL    COM_SEND_STRING
    RET

;-------------------------------
;字节读取
;入口:[LADD_H3BIT,LADD_8TF,LADD_0T7]
;出口:[串口应答字节,字节值]
;-------------------------------
CMD_BYTE_READ:
    LCALL    COM_RECV_BYTE
    JNC    CRAB_1
CRAB_0:
    MOV    A,#ERR_BYTE_RECV_TIMEOUT
CRAB_90:        
    LCALL    PUB_JUDGE_GIVE_RED
    LCALL    COM_SEND_BYTE
    RET    
CRAB_1:    
    MOV    LADD_H3BIT,A
    ANL    A,#0F8H
    JZ    CRAB_2
    MOV    A,#ERR_RECV_ILLEGAL_ADDR
    LJMP    CRAB_90
CRAB_2:    
    LCALL    COM_RECV_BYTE
    JNC    CRAB_3
    LJMP    CRAB_0
CRAB_3:
    MOV    LADD_8TF,A
    LCALL    COM_RECV_BYTE
    JNC    CRAB_6
    LJMP    CRAB_0
CRAB_6:    
    MOV    LADD_0T7,A
    
    LCALL    F_READ_A_BYTE
    PUSH    ACC
    MOV    A,#OPERATE_SUCCESS
    LCALL    COM_SEND_BYTE
    POP    ACC    
    LCALL    COM_SEND_BYTE
    RET
    
;-------------------------------
;芯片擦除
;入口:[无]
;出口:[串口应答字节]
;-------------------------------
CMD_CHIP_ERASE:
    LCALL    F_SDUP
    LCALL    F_ERASE_CHIP
    JNC    CCE_03
    MOV    A,#ERR_ERASE_CHIP
    LJMP    CCE_05
CCE_03:        
    MOV    A,#OPERATE_SUCCESS
CCE_05:    
    PUSH    ACC
    LCALL    F_CHIP_RESET
    LCALL    F_SDP
    POP    ACC
    LCALL    PUB_JUDGE_GIVE_RED
    LCALL    COM_SEND_BYTE
    RET
    
;-------------------------------
;读芯片ID
;入口:[无]
;出口:[串口应答字节,F_CHIP_ID_BYTE1/2]
;-------------------------------
CMD_READ_CHIP_ID:
    LCALL    F_READ_CHIP_ID
    MOV    A,#OPERATE_SUCCESS
    LCALL    COM_SEND_BYTE
    MOV    A,F_CHIP_ID_BYTE1
    LCALL    COM_SEND_BYTE
    MOV    A,F_CHIP_ID_BYTE2
    LCALL    COM_SEND_BYTE    
    RET    

;==========================================================
;串口子程序
;------------------------------
;通过串口接收一个定长字符串存放到外部RAM
;入口:    [DPTR,R7,XRAM_BLOCK_BIT]
;出口:    [C=1 500ms接收超时,C=0 正确]
;使用:    [ACC,DPTR,C]
;------------------------------
COM_RECV_STRING:
    LCALL    HD_SELECT_XRAM
    LCALL    HD_XRAM_PAGE_SEL
CRS_0:    
    LCALL    COM_RECV_BYTE
    JNC    CRS_3
    RET
CRS_3:    
    MOVX    @DPTR,A
    INC    DPTR
    DJNZ    R7,CRS_0
    CLR    C
    RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -