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

📄 m25p10-copy.asm

📁 Making a cheap 1M SPI Rom Emulator 8 second to copy from parallel to SPI re-Program STM Serial F
💻 ASM
字号:
;***************************************************************
;	Program Serial Flash 25P10 by reading 29010 ROM
;***************************************************************
;
;	P3.0	   DATA
;	P3.1	   CLK
;	P3.2	   Q
;	P3.3	   25P10 CS\
;	P3.4	   LED
;	P3.5	   7407 (Relay)
;	P3.6	   A16
;	P3.7	   29010 CS\
;
;===============================================================
	.RAMCHK	OFF
	.SYMBOLS
	.CHIP 8051
;===============================================================
PORT0		   EQU	  080H	     ; PORT 0	  D00-D07
PORT1		   EQU	  090H	     ; PORT 1	  A00-A07
PORT2		   EQU	  0A0H	     ; PORT 2	  A08-A15
PORT3		   EQU	  0B0H	     ; PORT 3	  Control Pins

TEMP		   EQU	  010H
LOOP1		   EQU	  011H
LOOP2		   EQU	  012H
INDEX1		   EQU	  013H
INDEX2		   EQU	  014H
;===============================================================
	ORG	   000H
	JMP	   START
	ORG	   040H
START:
	NOP
	CLR	   EA		     ; DISABLE ALL INTERRUPT
;===============================================================
INIT_PORT:
	MOV	   PORT0, #FFH	     ; INPUT
	MOV	   PORT1, #00H	     ; ROM Address 0000H
	MOV	   PORT2, #00H	     ;
;===============================================================
SF_INIT:
	SETB	   PORT3.0	     ; 25P10 D input
	SETB	   PORT3.1	     ; 25P10 CLK High
	SETB	   PORT3.2	     ; 25P10 Q input
	SETB	   PORT3.3	     ; 25P10 CS\ High
	CLR	   PORT3.4	     ; LED OFF
	CLR	   PORT3.6	     ; A16 == 0
	CLR	   PORT3.7	     ; 29010 CS\ High
	CALL	   RELAY_SYS
	CALL	   DELAY
	CALL	   DELAY
;===============================================================
ROM_Detect:
	MOV        A, PORT0
	MOV        TEMP, A
	MOV        A, PORT0
	CLR        C
	SUBB       A, TEMP
	JZ         ROM_Detect
;------------------------
	SETB	   PORT3.4	     ; LED ON
;===============================================================
SF_ERASE_START:
	CALL	   RELAY_8051
	CALL	   DELAY
	CALL	   DELAY
	CALL	   DELAY
;------------------------
SF_ERASE:
	CLR        PORT3.3	     ; 25P10 CS\ Low
	MOV        A, #06H           ; WREN
	CALL       WRITE_SF
	SETB	   PORT3.3	     ; 25P10 CS\ High

	CLR        PORT3.3	     ; 25P10 CS\ Low
	MOV        A, #01H           ; WRSR
	CALL       WRITE_SF
	MOV        A, #00H           ; WRSR BP0,1 = 0
	CALL       WRITE_SF
	SETB	   PORT3.3	     ; 25P10 CS\ High

	CLR        PORT3.3	     ; 25P10 CS\ Low
	MOV        A, #06H           ; WREN
	CALL       WRITE_SF
	SETB	   PORT3.3	     ; 25P10 CS\ High

	CLR        PORT3.3	     ; 25P10 CS\ Low
	MOV        A, #C7H           ; Bulk Erase
	CALL       WRITE_SF
	SETB	   PORT3.3	     ; 25P10 CS\ High

        CALL       ACK_SF

SF_ERASE_END:
	CLR	   PORT3.4	     ; LED OFF
	CALL       DELAY
	CALL       DELAY
	CALL       DELAY
;===============================================================
;	KEY
;===============================================================
ROM_Detect_END:
	MOV	   R1, #00H
	MOV	   R2, #00H
	MOV        A, PORT0
	MOV        TEMP, A
ROM_Detect_LOOP:
	MOV        A, PORT0
	CLR        C
	SUBB       A, TEMP
	JNZ        ROM_Detect_END
	DJNZ	   R1, ROM_Detect_LOOP
	DJNZ	   R2, ROM_Detect_LOOP

	CALL       DELAY
	CALL       DELAY
	SETB	   PORT3.4	     ; LED ON
;===============================================================
SF_PGM:
SF_PGM_INIT:
	MOV        PORT1,#00H        ; Address 0000H
	MOV        PORT2,#00H
	CLR        PORT3.6           ; A16 == 0
SF_PGM_256:
	CLR        PORT3.3	     ; 25P10 CS\ Low
	MOV        A, #06H           ; WREN
	CALL       WRITE_SF
	SETB	   PORT3.3	     ; 25P10 CS\ High
;------------------------
	CLR        PORT3.3	     ; 25P10 CS\ Low
	MOV        A, #02H           ; Page Program
	CALL       WRITE_SF
	MOV        A, #00H           ; Address 23-16
	MOV        C, PORT3.6
	RLC        A
	CALL       WRITE_SF
	MOV        A, PORT2          ; Address 15-8
	CALL       WRITE_SF
	MOV        A, PORT1          ; Address 7-0
	CALL       WRITE_SF
SF_PGM_LOOP:
	CLR        PORT3.7	     ; 29010 CS\ Low
	MOV        A, PORT0          ; Read from 29010
	MOV        A, PORT0          ; Read from 29010
	SETB	   PORT3.7	     ; 29010 CS\ High
	CALL       WRITE_SF
	MOV        A, PORT1
	INC        A
	MOV        PORT1, A
	JNZ        SF_PGM_LOOP
SF_PGM_CYCLE_END:
	SETB	   PORT3.3	     ; 25P10 CS\ High
        CALL       ACK_SF
SF_PGM_LED:
	MOV        C, PORT2.2        ; A10
	MOV        PORT3.4, C        ; Toggle LED
SF_PGM_A15_A08:
	MOV        A, PORT2
	INC        A
	MOV        PORT2, A
	JNZ        SF_PGM_256
SF_PGM_A16:
	MOV        C, PORT3.6
	MOV        A, #00H
	RLC        A
	JNZ        SF_DONE
        SETB       PORT3.6           ; A16 == 1
	JMP        SF_PGM_256
;===============================================================
SF_DONE:
	CALL	   DLY
	CLR	   PORT3.4	     ; LED OFF
	CALL	   RELAY_SYS
	CALL	   DELAY
	CALL	   DELAY
	JMP        START
;***************************************************************
; 	Function Calls
;***************************************************************
RELAY_8051:
	SETB	   PORT3.5	     ; 7407 output High
	RET
;===============================================================
RELAY_SYS:
	CLR	   PORT3.5	     ; 7407 output Low
	RET
;===============================================================
WRITE_SF:
	RLC	   A
	MOV	   PORT3.0, C
	SETB	   PORT3.1	     ; DCLK High 7
	CLR	   PORT3.1	     ; DCLK Low
	RLC	   A
	MOV	   PORT3.0, C
	SETB	   PORT3.1	     ; DCLK High 6
	CLR	   PORT3.1	     ; DCLK Low
	RLC	   A
	MOV	   PORT3.0, C
	SETB	   PORT3.1	     ; DCLK High 5
	CLR	   PORT3.1	     ; DCLK Low
	RLC	   A
	MOV	   PORT3.0, C
	SETB	   PORT3.1	     ; DCLK High 4
	CLR	   PORT3.1	     ; DCLK Low
	RLC	   A
	MOV	   PORT3.0, C
	SETB	   PORT3.1	     ; DCLK High 3
	CLR	   PORT3.1	     ; DCLK Low
	RLC	   A
	MOV	   PORT3.0, C
	SETB	   PORT3.1	     ; DCLK High 2
	CLR	   PORT3.1	     ; DCLK Low
	RLC	   A
	MOV	   PORT3.0, C
	SETB	   PORT3.1	     ; DCLK High 1
	CLR	   PORT3.1	     ; DCLK Low
	RLC	   A
	MOV	   PORT3.0, C
	SETB	   PORT3.1	     ; DCLK High 0
	CLR	   PORT3.1	     ; DCLK Low
	RET
;===============================================================
READ_SF:
	MOV	   C,PORT3.2
	RLC	   A
	SETB	   PORT3.1	     ; DCLK High 7
	CLR	   PORT3.1	     ; DCLK Low
	MOV	   C,PORT3.2
	RLC	   A
	SETB	   PORT3.1	     ; DCLK High 6
	CLR	   PORT3.1	     ; DCLK Low
	MOV	   C,PORT3.2
	RLC	   A
	SETB	   PORT3.1	     ; DCLK High 5
	CLR	   PORT3.1	     ; DCLK Low
	MOV	   C,PORT3.2
	RLC	   A
	SETB	   PORT3.1	     ; DCLK High 4
	CLR	   PORT3.1	     ; DCLK Low
	MOV	   C,PORT3.2
	RLC	   A
	SETB	   PORT3.1	     ; DCLK High 3
	CLR	   PORT3.1	     ; DCLK Low
	MOV	   C,PORT3.2
	RLC	   A
	SETB	   PORT3.1	     ; DCLK High 2
	CLR	   PORT3.1	     ; DCLK Low
	MOV	   C,PORT3.2
	RLC	   A
	SETB	   PORT3.1	     ; DCLK High 1
	CLR	   PORT3.1	     ; DCLK Low
	MOV	   C,PORT3.2
	RLC	   A
	SETB	   PORT3.1	     ; DCLK High 0
	CLR	   PORT3.1	     ; DCLK Low
	RET
;===============================================================
ACK_SF:
	CLR        PORT3.3	     ; 25P10 CS\ Low
	MOV        A, #05H           ; RDSR
	CALL       WRITE_SF
ACK_SF_LOOP:
	CALL       READ_SF
        JB         A.0, ACK_SF_LOOP
	SETB	   PORT3.3	     ; 25P10 CS\ High
	RET
;===============================================================
DLY:				     ; DELAY 500us @ 10MHz
	MOV	   R1, #00H
	MOV	   R2, #01H
	JMP	   DELAY_LOOP
DELAY:				     ; DELAY 150ms @ 10MHz
	MOV	   R1, #00H
	MOV	   R2, #00H
DELAY_LOOP:
	DJNZ	   R1, $
	DJNZ	   R2, DELAY_LOOP
	RET
;===============================================================

⌨️ 快捷键说明

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