📄 28sf040a.asm
字号:
;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 + -