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

📄 at45db041b.asm

📁 介绍了at45db041的驱动程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;********************************************************************************
;* 文件名:AT45DB041B.ASM
;* 功  能:AT45DB041B读写操作驱动程序
;* 作  者:宋智宁
;* 日  期:2006.02.09
;* 备  注:调用FlashWrite连续写时, 每页使用前256B存放数据,后8B保留
;*         调用FlashRead连续读时, 每页最多可读出264B
;*********************************************************************************
;==========================AT45DB041B说明==================================
;* 1. 4Mb, 每页264字节, 共2048页
;* 2. 片内2个264字节的SRAM缓存
;* 3. SCK上升沿数据输入, 下降沿数据输出
;* 4. 本文件以页为基本单位进行读写
;--------------------------------------------------------------------------
;* 命令格式: 1字节操作码 + 3字节地址码
;* 3字节地址码:
;*      MSB->   RRRR  XXXX   XXXXXXX X   XXXXXXXX   <-LSB
;*                    |            | |          |
;*             保留    页地址(11b)   字节地址(9b)
;==========================================================================

;-----SPI控制信号------------------
FMCS     EQU    P1.4   ;45DB041的CS
SI       EQU    P1.1   ;45DB041的输入
SO       EQU    P1.2   ;45DB041的输出
SCLK     EQU    P1.3   ;45DB041的CLK

;----全局变量块定义------------
INS1       EQU  28H      ;[8B]应用层入口参数区[10H~17FH]
INS2       EQU  18H      ;[8B]驱动层入口参数区[18H~1FH] (USED)
FLAG1      EQU  20H      ;标志位1
FLAG2      EQU  21H      ;标志位2
CPURAM1    EQU  30H      ;[16B]RAM1变量地址[30H~3FH](miniTable USED)
CPURAM2    EQU  40H      ;[16B]RAM2变量地址[40H~4FH](miniTable USED)
CPURAM3    EQU  50H      ;[16B]RAM3变量地址[50H~5FH] (COM USED)
CPUIRAM1   EQU  80H      ;[64B]IRAM1变量地址[80H~BFH] ()
SPRAM      EQU  0C0H     ;[80B]SP地址[C0H~FFH] (USED)
XRAM1      EQU  0000H    ;[16B]XRAM1变量地址[0000H~000FH] (GPIO USED)
XRAM2      EQU  0010H    ;[16B]XRAM2变量地址[0010H~001FH] (TIMER0 USED)
XRAM3      EQU  0020H    ;[16B]XRAM3变量地址[0020H~002FH] (miniTable USED)
XRAM4      EQU  0030H    ;[16B]XRAM4变量地址[0030H~003FH]
XRAM5      EQU  0040H    ;[16B]XRAM5变量地址[0040H~004FH]
XRAM6      EQU  0050H    ;[16B]XRAM6变量地址[0050H~005FH] (BLACK USED)
XBUFFER1   EQU  0060H    ;[272B]XBUFFER1缓冲区地址[0060H~016FH](FLASH USED)
XBUFFER2   EQU  0170H    ;[512B]XBUFFER2 RAM [0170H~036FH] (APP1 USED)
XBUFFER3   EQU  0370H    ;[128B]XBUFFER3 RAM [0370H~03EFH] (miniTable USED)
XBUFFER4   EQU  03F0H    ;[64B]XBUFFER4 RAM [03F0H~042FH]
XBUFFER5   EQU  0430H    ;[32B]XBUFFER5 RAM [0430H~044FH] ()
XBUFFER6   EQU  0450H    ;[288B]XBUFFER6 RAM [0450H~056FH] (COM USED)
XBUFFER7   EQU  0570H    ;[288B]XBUFFER7 RAM [0570H~068FH] (COM USED)
DATBLOCK   EQU  0690H    ;[6064B]数据结构[0690H~1BFFH]
LCMXRAM    EQU  1C00H    ;[1536B]显存[1C00~1FFFH](128*64)

;----FLASH全局变量----------------------
XFLASH_STATE EQU  XBUFFER1    ;[1B]状态
XPAGEBUF   EQU   XBUFFER1+1   ;[264B]页缓冲区

;----FLASH入口参数----------------------
FLASH_CMD  EQU   INS2         ;[1B]操作命令
PAGE_ADDR  EQU   INS2+1       ;[2B]页地址
BYTE_ADDR  EQU   INS2+3       ;[2B]字节地址
LOGIC_ADDR EQU   INS2+5       ;[3B]线性逻辑地址(后19位有效)

;--------------AT45D041B基本常量定义------------------
PAGE_LENGTH  EQU  264         ;页长
PDATA_LEN    EQU  256         ;页内数据区长度
PCHK_LEN     EQU  8           ;页内校验区长度

;--------------AT45D041B的操作命令定义------------------
StatusRead EQU 57H   ;读状态寄存器
ArrayRead EQU 68H    ;直接阵列读,可跨页
PageRead EQU 52H     ;直接读页,缓存不变
Buf1Read EQU 54H     ;缓存1读
Buf2Read EQU 56H     ;缓存2读
Buf1Write EQU 84H    ;缓存1写
Buf2Write EQU 87H    ;缓存2写
PageWriteThroughBuf1 EQU 82H     ;数据先写入缓存1,再写入页,包含页擦除
PageWriteThroughBuf2 EQU 85H     ;数据先写入缓存2,再写入页,包含页擦除
PageToBuf1 EQU 53H   ;页读至缓存1
PageToBuf2 EQU 55H   ;页读至缓存2
PageCmpBuf1 EQU 60H  ;页与缓存1比较,比较结果在状态寄存器第6位
PageCmpBuf2 EQU 61H  ;页与缓存2比较,比较结果在状态寄存器第
Buf1ToPageWithErase EQU 83H      ;将缓存1写入页,包含页擦除动作
Buf2ToPageWithErase EQU 86H      ;将缓存2写入页,包含页擦除动作
Buf1ToPageWithoutErase EQU 88H   ;将缓存1写入页,不包含页擦除动作
Buf2ToPageWithoutErase EQU 89H   ;将缓存2写入页,不包含页擦除动作
PageRewriteThroughBuf1 EQU 58H   ;页读入缓存1,然后缓存1写入页
PageRewriteThroughBuf2 EQU 59H   ;页读入缓存2,然后缓存2写入页

;------------------示例程序----------------------
        ORG 0000H
        AJMP MAIN
        ORG 0040H
MAIN:   LCALL FLASH_TEST
        AJMP $

;------------------示例程序----------------------
FLASH_TEST:
        ;----set buffer------------
        MOV DPTR,#XBUFFER4
        MOV A,#55H
        MOV R7,#250
DDD1:   MOVX @DPTR,A
        INC A
        INC DPTR
        DJNZ R7,DDD1         ;CREATE DATA

        ;----page write------------
        MOV PAGE_ADDR,#0
        MOV PAGE_ADDR+1,#0
        MOV BYTE_ADDR,#0
        MOV BYTE_ADDR+1,#0   ;address = 0000H
        MOV DPTR,#XBUFFER4
        MOV R6,#0
        MOV R7,#16           ;length = 16
        LCALL FlashPageWrite

        ;----page read------------
        MOV PAGE_ADDR,#0
        MOV PAGE_ADDR+1,#0
        MOV BYTE_ADDR,#0
        MOV BYTE_ADDR+1,#0   ;address = 0000H
        MOV DPTR,#XPAGEBUF
        MOV R6,#0
        MOV R7,#16           ;length = 16
        LCALL FlashPageRead  ;

        ;----flash write------------
        MOV LOGIC_ADDR,#0
        MOV LOGIC_ADDR+1,#0
        MOV LOGIC_ADDR+2,#0FAH  ;address = 0000FAH
        MOV DPTR,#XBUFFER4
        MOV R6,#00H
        MOV R7,#20H         ;length = 32
        LCALL FlashWrite

        ;----flash read------------
        MOV LOGIC_ADDR,#0
        MOV LOGIC_ADDR+1,#0
        MOV LOGIC_ADDR+2,#0FAH  ;address = 0000FAH
        MOV DPTR,#XPAGEBUF
        MOV R6,#00H
        MOV R7,#20H         ;length = 32
        LCALL FlashRead  ;
        RET

;******************************************************************************
;                           外部接口函数
;******************************************************************************
; FlashWrite       ;往flash连续写入N字节数据子程序
; FlashRead        ;从flash连续读出N字节数据子程序
; FlashPageWrite   ;往flash写1页(264字节)内数据子程序
; FlashPageRead    ;从flash连续读出1页内数据子程序

;******************************************************************************
;功能:往flash连续写入N字节数据子程序
;标号:FlashWrite
;入口参数:(1) LOGIC_ADDR----线性逻辑地址(后19位有效)
;          (2) DPTR----缓冲区(XDATA)
;          (3) (R6,R7)----长度
;出口参数:0:失败,1:成功
;******************************************************************************
FlashWrite:
        PUSH B
        PUSH ACC
        MOV A,R4
        PUSH ACC
        MOV A,R5
        PUSH ACC
        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
        CLR C
        MOV A,#PDATA_LEN
        SUBB A,BYTE_ADDR+1
        MOV B,A                 ;第一页的最大字节数
        MOV A,R6
        JNZ FWRMORE
        CLR C
        MOV A,B
        SUBB A,R7
        JC FWRMORE
FWRONE: LCALL FlashPageWrite    ;只写入一页
        JMP FWRRET
FWRMORE:MOV A,R6
        MOV R4,A
        MOV A,R7
        MOV R5,A                ;(R6,R7)->(R4,R5)
        MOV R6,#0
        MOV R7,B
        LCALL FlashPageWrite    ;先写第一页
        JNC FWRRET              ;ERROR
        CLR C
        MOV A,R5
        SUBB A,B
        MOV R5,A
        MOV A,R4
        SUBB A,#0
        MOV R4,A                ;(R4,R5)-B
        MOV A,DPL
        ADD A,B
        MOV DPL,A
        MOV A,DPH
        ADDC A,#0
        MOV DPH,A               ;DPTR+B
        MOV R6,#1
        MOV R7,#0               ;LEN=256
        MOV BYTE_ADDR,#0
        MOV BYTE_ADDR+1,#0      ;BYTE_ADDR=0
FWR1:   INC PAGE_ADDR+1
        JNZ FWR2
        INC PAGE_ADDR           ;指向下一页
FWR2:   MOV A,R4
        JZ FWRLAST
        LCALL FlashPageWrite    ;写中间各页
        JNC FWRRET              ;ERROR
        DEC R4                  ;(R4,R5)-256
        INC DPH                 ;DPTR+256
        JMP FWR1
FWRLAST:MOV R6,#0
        MOV A,R5
        MOV R7,A
        LCALL FlashPageWrite    ;写最后一页
        JNC FWRRET              ;ERROR
FWRRET:
        POP ACC
        MOV R5,A
        POP ACC
        MOV R4,A
        POP ACC
        POP B
        RET

;******************************************************************************
;功能:从flash连续读出N字节数据子程序
;标号:FlashRead
;入口参数:(1) LOGIC_ADDR----线性逻辑地址(后19位有效)
;          (2) DPTR----缓冲区(XDATA)
;          (3) (R6,R7)----长度
;出口参数:无
;******************************************************************************

⌨️ 快捷键说明

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