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

📄 at45db041b.asm

📁 介绍了at45db041的驱动程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
FlashRead:
        LCALL FlashWaitReady       ;wait for ready
        MOV FLASH_CMD,#ArrayRead
        MOV PAGE_ADDR,LOGIC_ADDR
        MOV PAGE_ADDR+1,LOGIC_ADDR+1
        MOV BYTE_ADDR,#0           ;PAGE DATA AREA
        MOV BYTE_ADDR+1,LOGIC_ADDR+2
        LCALL FlashCommand         ;连续阵列读
        RET

;******************************************************************************
;功能:往flash写1页(264字节)内数据子程序
;标号:FlashPageWrite
;入口参数:(1) PAGE_ADDR----页地址
;         (2) BYTE_ADDR----字节地址
;         (3) DPTR----缓冲区(XDATA)
;         (4) (R6,R7)----长度
;出口参数:C: 0:失败,1:成功
;******************************************************************************
FlashPageWrite:
        PUSH ACC
        MOV A,R4
        PUSH ACC
        MOV A,R5
        PUSH ACC
 ;------读取页内容至缓存1 ----------
        LCALL FlashWaitReady       ;wait for ready
        MOV FLASH_CMD,#PageToBuf1
        LCALL FlashCommand         ;
 ;------写入字符串至缓存1 ----------
        LCALL FlashWaitReady       ;wait for ready
        MOV FLASH_CMD,#Buf1Write
        LCALL FlashCommand         ;
 ;------读出缓存1比较 ----------
        LCALL FlashWaitReady       ;wait for ready
        PUSH DPH
        PUSH DPL                   ;SAVE DPTR
        MOV FLASH_CMD,#Buf1Read
        MOV DPTR,#XPAGEBUF         ;PAGE BUFFER
        LCALL FlashCommand         ;
        MOV A,R6
        MOV R4,A
        MOV A,R7
        MOV R5,A                   ;(R4,R5)--LEN
        POP ACC
        MOV R7,A
        POP ACC
        MOV R6,A                   ;(R6,R7)--XADDR
        LCALL XMEMCMP              ;compare
        JC FPWRET                  ;C:(1--不等,0--相等)
 ;------缓存1写入页 ----------
        LCALL FlashWaitReady       ;wait for ready
        MOV FLASH_CMD,#Buf1ToPageWithErase
        LCALL FlashCommand         ;
 ;------比较写入是否成功 ----------
        LCALL FlashWaitReady       ;wait for ready
        LCALL FlashBuf1CmpPage
        JC FPWRET                  ;C:(1--不等,0--相等)
 ;----------------------------------
        ;MOV R7,#1
        ;LCALL DelayX10ms    ;DELAY
FPWRET: CPL C
        POP ACC
        MOV R5,A
        POP ACC
        MOV R4,A
        POP ACC
        RET

;******************************************************************************
;功能:从flash连续读出1页内数据子程序
;标号:FlashPageRead
;入口参数:(1) PAGE_ADDR----页地址
;         (2) BYTE_ADDR----字节地址
;          (3) DPTR----缓冲区(XDATA)
;          (4) (R6,R7)----长度
;出口参数:无
;******************************************************************************
FlashPageRead:
        LCALL FlashWaitReady       ;wait for ready
        MOV FLASH_CMD,#PageRead
        LCALL FlashCommand         ;连续阵列读
        RET


;******************************************************************************
;                                 内部函数实现
;******************************************************************************

;****************************************************************
;标号: XMEMCMP
;功能: XDATA数据比较是否相等
;入口条件:@DPTR -- SOURCE
;          (R6,R7) -- DEST
;          (R4,R5) -- NUMBER
;出口信息:C:(1--不等,0--相等)
;影响资源: PSW
;****************************************************************
XMEMCMP:
        PUSH ACC
        PUSH B
        MOV  A,R5
        JZ   GETXDC1
        INC  R4
GETXDC1:
        MOVX A,@DPTR
        MOV  B,A  ;TEMP SAVE
        INC  DPTR
        PUSH DPH
        PUSH DPL  ;TEMP SAVE
        MOV  DPH,R6
        MOV  DPL,R7
        MOVX A,@DPTR
        INC  DPTR
        MOV  R6,DPH
        MOV  R7,DPL
        POP  DPL
        POP  DPH
        XRL  A,B
        JNZ  XMCMPER     ;
        DJNZ R5,GETXDC1
        DJNZ R4,GETXDC1
XMCMPOK:CLR  C
        JMP  XECMRET
XMCMPER:SETB C
XECMRET:POP  B
        POP  ACC
        RET

;******************************************************************************
;功能:Flash比较缓冲区1和主存页子程序
;标号:FlashBu1fCmpPage
;入口参数:PAGE_ADDR----页地址
;出口参数:C: 0--相同,1--不同
;******************************************************************************
FlashBuf1CmpPage:
        MOV FLASH_CMD,#PageCmpBuf1
        LCALL FlashCommand         ;读出状态寄存器
        LCALL FlashWaitReady       ;wait for ready
        LCALL FlashState
        MOV C,ACC.6                ;bit6--COMP(0--一致; 1--不一致)
        RET

;******************************************************************************
;功能:Flash等待空闲子程序
;标号:FlashWaitReady
;入口参数:无
;出口参数:无
;******************************************************************************
FlashWaitReady:
        LCALL FlashState           ;读出状态寄存器
        ANL A,#80H
        JZ FlashWaitReady          ;wait for ready
        RET

;******************************************************************************
;功能:读出状态寄存器子程序
;标号:FlashState
;入口参数:无
;出口参数:(1) A----数据
;调用子程序: SPIOUT, SPIIN
;说明: bit7--RDY/BUSY (0--busy; 1--ready)
;      bit6--COMP(0--一致; 1--不一致)
;      bit3~bit5--flash容量
;******************************************************************************
FlashState:
        PUSH DPH
        PUSH DPL
        MOV FLASH_CMD,#StatusRead
        MOV DPTR,#XFLASH_STATE
        LCALL FlashCommand         ;读出状态寄存器
        MOV DPTR,#XFLASH_STATE
        MOVX A,@DPTR
        POP DPL
        POP DPH
        RET


;******************************************************************************
;功能:Flash写地址子程序
;标号:FlashOutAddr
;入口参数: (1) PAGE_ADDR----页地址
;         (2) BYTE_ADDR----字节地址
;出口参数:无
;******************************************************************************
FlashOutAddr:
        PUSH ACC
        MOV A,BYTE_ADDR
        RRC A
        MOV A,PAGE_ADDR+1
        RLC A
        PUSH ACC         ;SAVE
        MOV A,PAGE_ADDR
        RLC A            ;调整为字节对齐
        LCALL SPIOUT     ;前4位页地址
        POP ACC
        LCALL SPIOUT     ;后7位页地址+1位字节地址
        MOV A,BYTE_ADDR+1
        LCALL SPIOUT     ;后8位字节地址
        POP ACC
        RET

;******************************************************************************
;功能:flash命令操作子程序
;标号:FlashCommand
;入口参数:(1) FLASH_CMD----命令
;         (2) PAGE_ADDR----页地址
;         (3) BYTE_ADDR----字节地址
;         (4) DPTR----缓冲区(XDATA)
;         (5) (R6,R7)----长度
;出口参数:
;调用子程序: SPIOUT, SPIIN
;******************************************************************************
FlashCommand:
        PUSH DPH
        PUSH DPL
        MOV A,R6
        PUSH ACC
        MOV A,R7
        PUSH ACC
        CLR FMCS        ;CS=0
        MOV A,FLASH_CMD
        LCALL SPIOUT     ;SEND OP CODE
        MOV A,FLASH_CMD
        XRL A,#StatusRead
        JZ CMDPR1        ;若是StatusRead命令则跳转
        LCALL FlashOutAddr    ;SEND 24 BIT ADDR
   ;------------------------------------------------
CMDPR1: ;不同命令的处理
        MOV A,FLASH_CMD
        XRL A,#StatusRead    ;读状态寄存器
        JNZ CMDPR2
        LCALL SPIIN
        MOVX @DPTR,A
        JMP CMDPRET          ;BREAK
   ;------------------------------------------------
CMDPR2: MOV A,FLASH_CMD      ;直接阵列读,可跨页
        XRL A,#ArrayRead
        JNZ CMDPR3
        JMP CMDPR3P
CMDPR3: MOV A,FLASH_CMD
        XRL A,#PageRead      ;直接读页,缓存不

⌨️ 快捷键说明

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