📄 k9f2808u0c.inc
字号:
/* //INCLUDE "K9F2808U0C.H"
INCLUDE "ET44M210_REG.H"
ORG 0X0000
JMP START
;********************************************************
INCLUDE "DEFINE_REG.H"
INCLUDE "ET83X432_CODEC.INC"
;********************************************************
START:
CALL IO_INITIAL
FLASH_MAIN:
CALL IO_INITIAL
CALL FLASH_READ_ID
MOV A,MAKER_CODE
MOV A,FLASH_ID
SUB A,#0X73
JBC STATUS,Z,$ ;CAN'T READ ID,STOP
//CALL VERIFY_INVALID_BLOCK_BEFORE_ERASE ;VERIFY INVALID BLOCK
;USE FOR NEW FLASH
CALL ERASE_FIRST_BLOCK
CALL READ_FIRST_HALF_PAGE
MOV A,#0X55
MOV FLASH_WRITE_DATA,A
CALL WRITE_FIRST_PAGE ;WRITE 55
CALL WRITE_BANK
CALL READ_FIRST_HALF_PAGE
//CALL READ_SPARE_FIELD
JMP $
;main program over */
;================================================
;Subsrute begin
;================================================
FLASH_READ_ID_OK:
CALL FLASH_READ_ID
MOV A,MAKER_CODE
MOV A,FLASH_ID
SUB A,#0X73
JBC STATUS,Z,$
RET
;***********************************************************************************
ERASE_FIRST_BLOCK:
MOV A,#0X00
MOV ROW_ADDRESS_LOW,A
MOV A,#0X00
MOV ROW_ADDRESS_HIGH,A
CALL ERASE_ONE_BLOCK
RET
;***********************************************************************************
WRITE_FIRST_PAGE:
MOV A,#0X00
MOV COLUMN_ADDRESS,A
MOV A,#0X00
MOV ROW_ADDRESS_LOW,A
MOV A,#0X00
MOV ROW_ADDRESS_HIGH,A
CALL PROGRAM_ONE_PAGE
RET
;***********************************************************************************
READ_FIRST_HALF_PAGE_TO_BANK:
MOV A,#0X00
MOV READ_CMD,A
MOV A,#0X00
MOV COLUMN_ADDRESS,A
CALL READ_ONE_PAGE
RET
;***********************************************************************************
READ_SECOND_HALF_PAGE:
MOV A,#0X01
MOV READ_CMD,A
MOV A,#0X80
MOV COLUMN_ADDRESS,A
CALL READ_ONE_PAGE
RET
;***********************************************************************************
READ_SPARE_FIELD:
MOV A,#0X50
MOV READ_CMD,A
MOV A,#0X00
MOV COLUMN_ADDRESS,A
MOV A,#0X00
MOV ROW_ADDRESS_LOW,A
MOV A,#0X00
MOV ROW_ADDRESS_HIGH,A
CALL READ_ONE_PAGE
RET
;***********************************************************************************
ERASE_ONE_BLOCK:
MOV A,#0X60 ;
MOV COMMAND_VAL,A
CALL COMMAND_LATCH_INTO
MOV A,ROW_ADDRESS_LOW
MOV ADDRESS_VALUE,A
CALL ADDRESS_LATCH_INTO
MOV A,ROW_ADDRESS_HIGH
MOV ADDRESS_VALUE,A
CALL ADDRESS_LATCH_INTO
MOV A,#0XD0 ;
MOV COMMAND_VAL,A
CALL COMMAND_LATCH_INTO
CALL DELAY_1MS
CALL READ_STATUS
MOV A,FLASH_STATUS
SUB A,#0
JBS STATUS,Z,ERASE_ONE_BLOCK_OK
JMP $
ERASE_ONE_BLOCK_OK:
RET
;***********************************************************************************
PROGRAM_ONE_PAGE_FROM_BANK:
CLR RE_PROGRAM_COUNT
MOV A,#0X80 ;
MOV COMMAND_VAL,A
CALL COMMAND_LATCH_INTO
MOV A,COLUMN_ADDRESS
MOV ADDRESS_VALUE,A
CALL ADDRESS_LATCH_INTO
MOV A,ROW_ADDRESS_LOW
MOV ADDRESS_VALUE,A
CALL ADDRESS_LATCH_INTO
MOV A,ROW_ADDRESS_HIGH
MOV ADDRESS_VALUE,A
CALL ADDRESS_LATCH_INTO
CALL WRITE_512_DATA_TO_ONE_PAGE_FROM_BANK//WRITE_528_DATA_TO_ONE_PAGE_FROM_BANK
MOV A,#0X10 ;10H INITIATES PROGRAM
MOV COMMAND_VAL,A
CALL COMMAND_LATCH_INTO
CALL READ_STATUS
MOV A,FLASH_STATUS
SUB A,#0
JBS STATUS,Z,PROGRAM_ONE_PAGE_FROM_BANK_OK
CALL ERASE_ONE_BLOCK
INC RE_PROGRAM_COUNT
MOV A,RE_PROGRAM_COUNT
SUB A,#2
JBS STATUS,Z,$
JMP PROGRAM_ONE_PAGE_FROM_BANK
PROGRAM_ONE_PAGE_FROM_BANK_OK:
RET
;***********************************************************************************
PROGRAM_ONE_PAGE:
CLR RE_PROGRAM_COUNT
MOV A,#0X80 ;
MOV COMMAND_VAL,A
CALL COMMAND_LATCH_INTO
MOV A,COLUMN_ADDRESS
MOV ADDRESS_VALUE,A
CALL ADDRESS_LATCH_INTO
MOV A,ROW_ADDRESS_LOW
MOV ADDRESS_VALUE,A
CALL ADDRESS_LATCH_INTO
MOV A,ROW_ADDRESS_HIGH
MOV ADDRESS_VALUE,A
CALL ADDRESS_LATCH_INTO
//CALL DELAY_100US
FIRST_256BYTE:
CALL WRITE_ONE_DATA
INC WRITE_BYTE_COUNT ;0-255
MOV A,#0X00
SUB A,WRITE_BYTE_COUNT
JBC STATUS,Z,FIRST_256BYTE
CLR WRITE_BYTE_COUNT
JMP SECOND_256BYTE
SECOND_256BYTE:
CALL WRITE_ONE_DATA
INC WRITE_BYTE_COUNT
MOV A,#0X00
SUB A,WRITE_BYTE_COUNT
JBC STATUS,Z,SECOND_256BYTE
CLR WRITE_BYTE_COUNT
JMP SPARE_16BYTE
SPARE_16BYTE:
CALL WRITE_ONE_DATA
INC WRITE_BYTE_COUNT
MOV A,#16
SUB A,WRITE_BYTE_COUNT
JBC STATUS,Z,SPARE_16BYTE
CLR WRITE_BYTE_COUNT
MOV A,#0X10 ;10H INITIATES PROGRAM
MOV COMMAND_VAL,A
CALL COMMAND_LATCH_INTO
CALL READ_STATUS
MOV A,FLASH_STATUS
SUB A,#0
JBS STATUS,Z,PROGRAM_ONE_PAGE_OK
CALL ERASE_ONE_BLOCK
INC RE_PROGRAM_COUNT
MOV A,RE_PROGRAM_COUNT
SUB A,#2
JBS STATUS,Z,$
JMP PROGRAM_ONE_PAGE
PROGRAM_ONE_PAGE_OK:
RET
;***********************************************************************************
READ_ONE_PAGE:
CLR PAGE_BYTE_COUNT ;0-128 CHECK PAGE END
MOV A,#0X02
MOV BANK_COUNT,A
MOV RAMBS1,A
MOV A,#0X80
MOV IAP1,A
MOV A,READ_CMD//#0X00 ;00H READ1 0-527BYTE
MOV COMMAND_VAL,A
CALL COMMAND_LATCH_INTO
MOV A,COLUMN_ADDRESS//#0X00
MOV ADDRESS_VALUE,A
CALL ADDRESS_LATCH_INTO
MOV A,ROW_ADDRESS_LOW//#0X00
MOV ADDRESS_VALUE,A
CALL ADDRESS_LATCH_INTO
MOV A,ROW_ADDRESS_HIGH//#0X00
MOV ADDRESS_VALUE,A
CALL ADDRESS_LATCH_INTO
CALL DELAY_20US
READ_NEXT:
CALL READ_ONE_DATA
MOV A,READ_DATA_VALUE
MOV IAC1,A
INC IAP1
INC PAGE_BYTE_COUNT
MOV A,IAP1
SUB A,#0X00
JBC STATUS,Z,READ_NEXT
JMP CHECK_CHANGE_BANK
CHECK_CHANGE_BANK:
MOV A,BANK_COUNT ;CHECK BANK 5 FULL
SUB A,#5 ;BANK_COUNT==5,BANK FULL
JBS STATUS,Z,CHECK_PAGE_END ;IF BANK 5 FULL,CHECK PAGE END
JMP CHANGE_BANK
CHANGE_BANK:
INC BANK_COUNT
CLR PAGE_BYTE_COUNT
MOV A,BANK_COUNT ;SELECT BANK
MOV RAMBS1,A
MOV A,#0X80 ;first Register address
MOV IAP1,A
JMP READ_NEXT
CHECK_PAGE_END:
MOV A,PAGE_BYTE_COUNT ;0-127 TOTAL 128BYTE
SUB A,#0X80 ;0-127 BYTE
JBC STATUS,Z,READ_NEXT
RET
;***********************************************************************************
READ_STATUS:
//CALL DELAY_50US
JBC FLASH_CON_PORT,RB,$ ;CHECK BUSY
MOV A,#0X70
MOV COMMAND_VAL,A
CALL COMMAND_LATCH_INTO
CHECK_BUSY:
CALL READ_ONE_DATA ;WHEN READY,READ STATUS
MOV A,READ_DATA_VALUE
MOV FLASH_STATUS,A
CHECK_IO0:
AND A,#0B000000001
SUB A,#0B000000001
JBS STATUS,Z,FAIL
JMP PASS
FAIL:
MOV A,#1
MOV FLASH_STATUS,A
RET
PASS:
MOV A,#0
MOV FLASH_STATUS,A
RET
;***********************************************************************************
FLASH_READ_ID:
MOV A,#0X90
MOV COMMAND_VAL,A
CALL COMMAND_LATCH_INTO
MOV A,#0X00
MOV ADDRESS_VALUE,A
CALL ADDRESS_LATCH_INTO
CALL READ_ONE_DATA
MOV A,READ_DATA_VALUE
MOV MAKER_CODE,A
CALL READ_ONE_DATA
MOV A,READ_DATA_VALUE
MOV FLASH_ID,A
RET
;***********************************************************************************
COMMAND_LATCH_INTO://FLASH_READ_ID: ;FLASH CONTROL PORT
BS FLASH_CON_PORT,CE ;COMMAND_LATCH_INTO_INITAIL
BC FLASH_CON_PORT,CLE
BS FLASH_CON_PORT,WE
BC FLASH_CON_PORT,ALE
BS FLASH_CON_PORT,RE
BC FLASH_CON_PORT,CE ;CHIP ENABLE
BS FLASH_CON_PORT,CLE ;COMMAND LATCH ENABLE
BC FLASH_CON_PORT,WE ;WRITE ENABLE
//BC FLASH_CON_PORT,ALE
//BS FLASH_CON_PORT,RE
CALL DATA_PORT_OUT_INITIAL ;MCU OUTPUT,FLASH READ COMMAND
MOV A,COMMAND_VAL ;DATA SETUP
MOV DATA_PORT,A ;
BS FLASH_CON_PORT,WE ;LATCH INTO THE COMMAND
RET
;********************************************************
ADDRESS_LATCH_INTO:
//BC FLASH_CON_PORT,CE ;CHIP ENABLE
BC FLASH_CON_PORT,CLE
//BC FLASH_CON_PORT,WE
BS FLASH_CON_PORT,ALE
BC FLASH_CON_PORT,WE
CALL DATA_PORT_OUT_INITIAL ;MCU OUTPUT,FLASH READ ADDRESS
MOV A,ADDRESS_VALUE ;DATA SETUP
MOV DATA_PORT,A
BS FLASH_CON_PORT,WE
BC FLASH_CON_PORT,ALE
RET
;********************************************************
WRITE_ONE_DATA:
BC FLASH_CON_PORT,WE
CALL DATA_PORT_OUT_INITIAL ;MCU OUTPUT,MCU WRITE A DATA TO FLASH
MOV A,FLASH_WRITE_DATA
MOV DATA_PORT,A
BS FLASH_CON_PORT,WE
RET
;********************************************************
READ_ONE_DATA:
BC FLASH_CON_PORT,RE ;RE IS LOW,ENABLE READ DATA
CALL DATA_PORT_IN_INITIAL ;MCU INPUT,MCU READ A DATA
MOV A,DATA_PORT
MOV READ_DATA_VALUE,A
BS FLASH_CON_PORT,RE
//BC FLASH_CON_PORT,RE
//CALL DATA_PORT_IN_INITIAL
//MOV A,DATA_PORT
//MOV FLASH_ID,A
RET
;***********************************************************************************
WRITE_512_DATA_TO_ONE_PAGE_FROM_BANK://WRITE_528_DATA_TO_ONE_PAGE_FROM_BANK:
MOV A,#1
MOV BANK_COUNT,A
READ_BANK_INITIAL:
INC BANK_COUNT
MOV A,BANK_COUNT
MOV RAMBS1,A
MOV A,#0X80
MOV IAP1,A
CALL DELAY_5US
NEXT_REGI: ;NEXT REGISTER
MOV A,IAC1
MOV FLASH_WRITE_DATA,A
CALL WRITE_ONE_DATA
INC IAP1
MOV A,IAP1
SUB A,#0
JBS STATUS,Z,READ_BANK_CHANGE
JMP NEXT_REGI
READ_BANK_CHANGE:
MOV A,BANK_COUNT
SUB A,#5
JBS STATUS,Z,READ_BANK_END
JMP READ_BANK_INITIAL
READ_BANK_END:
RET
;***********************************************************************************
ZERO_ADDRESS:
MOV A,#0X00
MOV COLUMN_ADDRESS,A
MOV A,#0X00
MOV ROW_ADDRESS_LOW,A
MOV A,#0X00
MOV ROW_ADDRESS_HIGH,A
RET
;***********************************************************************************
WRITE_BANK:
MOV A,#1
MOV BANK_COUNT,A
SET_BANK_INITIAL:
INC BANK_COUNT
MOV A,BANK_COUNT
MOV RAMBS1,A
MOV A,#0X80
MOV IAP1,A
NEXT_REGISTER:
MOV A,#0X0F
MOV IAC1,A
INC IAP1
MOV A,IAP1
SUB A,#0
JBS STATUS,Z,BANK_CHANGE
JMP NEXT_REGISTER
BANK_CHANGE:
MOV A,BANK_COUNT
SUB A,#5
JBS STATUS,Z,WRITE_BANK_END
JMP SET_BANK_INITIAL
WRITE_BANK_END:
RET
;************************************************
ROTATE_LEFT:
BC STATUS,C
RLC ROTATE_VALUE_0,#1
RLC ROTATE_VALUE_1,#1
DJZ ROTATE_COUNT,ROTATE_END
JMP ROTATE_LEFT
ROTATE_END:
RET
;***********************************************************************************
ERASE_MAX_NUM_BLOCK:
ERASE_NEXT_BLOCK:
CALL ERASE_ONE_BLOCK
INC BLOCK_COUNT
INC_BLOCK_NUM_LOW:
INC BLOCK_ADDRESS_LOW
JBS STATUS,C,INC_BLOCK_NUM_HIGH
MOV A,BLOCK_COUNT//#0B00000100
SUB A,MAX_BLOCK_NUM
JBS STATUS,Z,LAST_BLOCK
JMP CACULATE_PAGE_NUM ;BLOCK *32==PAGE ADDRESS
INC_BLOCK_NUM_HIGH:
INC BLOCK_ADDRESS_HIGH
MOV A,BLOCK_COUNT//#0B00000100
SUB A,MAX_BLOCK_NUM
JBS STATUS,Z,LAST_BLOCK ;LAST BLOCK #OB00000100 00000000
CACULATE_PAGE_NUM:
MOV A,#5
MOV ROTATE_COUNT,A
MOV A,BLOCK_ADDRESS_LOW
MOV ROTATE_VALUE_0,A
MOV A,BLOCK_ADDRESS_HIGH
MOV ROTATE_VALUE_1,A
CALL ROTATE_LEFT ;CACULATE PAGE ADDRESS
MOV A,ROTATE_VALUE_0
MOV ROW_ADDRESS_LOW,A
MOV A,ROTATE_VALUE_1
MOV ROW_ADDRESS_HIGH,A
JMP ERASE_NEXT_BLOCK
LAST_BLOCK:
CLR BLOCK_COUNT
RET
;***********************************************************************************
;***********************************************************************************
VERIFY_INVALID_BLOCK_BEFORE_ERASE: ;REFER TO K9F2808U0C DATASHEET,PAGE 12
CLR BLOCK_ADDRESS_LOW
CLR BLOCK_ADDRESS_HIGH
CLR PAGE_COUNT
MOV A,#0B00000100
MOV MAX_BLOCK_NUM,A
MOV A,#0X50
MOV READ_CMD,A
MOV A,#0X05
MOV COLUMN_ADDRESS,A
MOV A,#0X00 ;BLOCK ADDRESS==0
MOV ROW_ADDRESS_LOW,A
MOV A,#0X00
MOV ROW_ADDRESS_HIGH,A
CHECK_NEXT_BLOCK_FIRST_PAGE:
CHECK_SAME_BLOCK_SECOND_PAGE:
MOV A,READ_CMD ;50H READ1 511-527BYTE
MOV COMMAND_VAL,A
CALL COMMAND_LATCH_INTO
MOV A,#0X05
OR COLUMN_ADDRESS,A
MOV A,COLUMN_ADDRESS//#0X00
MOV ADDRESS_VALUE,A
CALL ADDRESS_LATCH_INTO
MOV A,ROW_ADDRESS_LOW//#0X00
MOV ADDRESS_VALUE,A
CALL ADDRESS_LATCH_INTO
MOV A,ROW_ADDRESS_HIGH//#0X00
MOV ADDRESS_VALUE,A
CALL ADDRESS_LATCH_INTO
CALL DELAY_20US
CALL READ_ONE_DATA
INC PAGE_COUNT
MOV A,READ_DATA_VALUE
SUB A,#0XFF
JBS STATUS,Z,CHECK_PAGE_COUNT ;1st or 2nd PAGE'S 517 BYTE IN EACH BLOCK==FF VALID
JMP RECORD_INVALID_BLOCK
CHECK_PAGE_COUNT:
MOV A,#2
SUB A,PAGE_COUNT
JBC STATUS,Z,INC_ROW_ADDRESS_LOW ;PAGE_COUNT==1,NEXT PAGE
CLR PAGE_COUNT
JMP INC_BLOCK_ADDRESS_LOW ;PAGE_COUNT==2,NEXT BLOCK
INC_ROW_ADDRESS_LOW:
INC ROW_ADDRESS_LOW
JBS STATUS,C,INC_ROW_ADDRESS_HIGH
JMP CHECK_SAME_BLOCK_SECOND_PAGE ;BLOCK *32==PAGE ADDRESS
INC_ROW_ADDRESS_HIGH:
INC ROW_ADDRESS_HIGH
JMP CHECK_SAME_BLOCK_SECOND_PAGE
INC_BLOCK_ADDRESS_LOW:
INC BLOCK_ADDRESS_LOW
JBS STATUS,C,INC_BLOCK_ADDRESS_HIGH
JMP CACULATE_PAGE_ADDRESS ;BLOCK *32==PAGE ADDRESS
INC_BLOCK_ADDRESS_HIGH:
INC BLOCK_ADDRESS_HIGH
MOV A,MAX_BLOCK_NUM//#0B00000100
SUB A,BLOCK_ADDRESS_HIGH
JBS STATUS,Z,VERIFY_INVALID_END ;LAST BLOCK #OB00000100 00000000
CACULATE_PAGE_ADDRESS:
MOV A,#5
MOV ROTATE_COUNT,A
MOV A,BLOCK_ADDRESS_LOW
MOV ROTATE_VALUE_0,A
MOV A,BLOCK_ADDRESS_HIGH
MOV ROTATE_VALUE_1,A
CALL ROTATE_LEFT ;CACULATE PAGE ADDRESS
MOV A,ROTATE_VALUE_0
MOV ROW_ADDRESS_LOW,A
MOV A,ROTATE_VALUE_1
MOV ROW_ADDRESS_HIGH,A
JMP CHECK_NEXT_BLOCK_FIRST_PAGE
RECORD_INVALID_BLOCK: ;WRITE IN LAST BLOCK
JMP $
VERIFY_INVALID_END:
RET
;***********************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -