📄 at45db041b.asm
字号:
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 + -