📄 at45db041b.asm
字号:
;********************************************************************************
;* 文件名: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 + -