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

📄 spi.asm

📁 模拟SPI程序(C语言)
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*********************** SPI.ASM V1.1 ****************************
;        INCLUDE 'POWER MODEM' RECIEVE AND TRANSLATE (1:1)
;         Program by WAYNE of SUNRISE Technology Limited
;                            89C52
;        *********** Osc. freq = 11.0592MHz *************;--------------------------------------------------------------
;PIN DESCRIPTION
;--------------------------------------------------------------
		CO              EQU     P1.0
		CCLK            EQU     P1.1    ;NORMAL "1"
		CI              EQU     P1.2    ;NORMAL "1"
		SINT            EQU     P1.4    ;normal "1"
		LCDCS           EQU     P1.7

		SSCCS           EQU     P2.6    ;normal "1"
		SSCRST          EQU     P2.7    ;normal "1"

		KEY_PRESS       EQU     P3.7    ;NORMAL "1"
		LEDCS0           EQU     P3.6    ;NORMAL "1"

;--------------------------------------------------------------
;REGISTER DESCRIPTION
;--------------------------------------------------------------
		;X               EQU     R0
		;BC              EQU     R1
		SPI_CNT         EQU     R5
		HEAD_CNT        EQU     R6
		DATA_CNT        EQU     R7
	       
		
		TIMER1          EQU     08H
		TIMER2          EQU     09H
		TIMER3          EQU     0AH
		T5CNT           EQU     0BH
		T1SCNT          EQU     0CH

		SPI_DATA        EQU     0DH

		SPI_TMP         EQU     0FH

		RE_TX_CNT       EQU     10H
		MODE_CNTRL      EQU     11H
	      
		;TR_DATA_LENGTH EQU     12H
		;RE_TC_CNT      EQU     13H

		GRP_ADR_LSB     EQU     12H
		GRP_ADR_MSB     EQU     13H
		S_DEV_ADR_LSB EQU       14H
		S_DEV_ADR_MSB EQU       15H
		S_SYS_ADR_LSB EQU       16H
		S_SYS_ADR_MSB EQU       17H

		D_DEV_ADR_LSB EQU       18H
		D_DEV_ADR_MSB EQU       19H
		D_SYS_ADR_LSB EQU       1AH
		D_SYS_ADR_MSB EQU       1BH

		RTRBUF          EQU     1CH ;TRBUF READ POINTER
		;WTRBUF          EQU     1DH ;TRBUF WRITE POINTER
		RRCBUF          EQU     1EH ;RCBUF READ POINTER
		WRCBUF          EQU     1FH ;RCBUF WRITE POINTER

		TMFLAG          EQU     20H
		      T5MS   EQU TMFLAG.0
		      T500MS EQU TMFLAG.1
		      T1S    EQU TMFLAG.2
		      T1     EQU TMFLAG.3
		      T2     EQU TMFLAG.4
		      T3     EQU TMFLAG.5
		      CI_IND EQU TMFLAG.6

		PHYSTATE        EQU     21H
		     PDLLST     EQU     PHYSTATE.0
		     RC_ERROR   EQU     PHYSTATE.1
		     RC_SUCC    EQU     PHYSTATE.2
		     WR_SUCC    EQU     PHYSTATE.3
		     WR_ERROR   EQU     PHYSTATE.4
		     WR_BUS_SUCC EQU    PHYSTATE.5
		     RD_BUS_SUCC EQU    PHYSTATE.6
		     RC_H_SUCC  EQU     PHYSTATE.7

		USRFG2          EQU     22H
		     R_NEW_TH   EQU     USRFG2.0
		     T_NEW_TH   EQU     USRFG2.1
		     RE_TR      EQU     USRFG2.2
		     ;RESET_ALL  EQU     USRFG2.3

		RR4_REG         EQU     23H
		     ;RC_REFUSED EQU     RR4_REG.0
		     ;RC_OVERRUN EQU     RR4_REG.1
		     RC_ADDR_DIFF       EQU     RR4_REG.2

		IR_REG          EQU     24H
		     RESET      EQU     IR_REG.0
		     ;LINK_STATE EQU     IR_REG.1
		     INTER_ER   EQU     IR_REG.2
		     ;PHY_FAIL   EQU     IR_REG.3
		     RC_EXCEPT  EQU     IR_REG.4
		     TR_EXCEPT  EQU     IR_REG.5
		     TR_ATTN    EQU     IR_REG.6
		     RC_ATTN    EQU     IR_REG.7

		CW_REG          EQU     25H ;CONTROL WRITE REGISTER
		     ;LINK_ENABLE EQU    CW_REG.0
		     ;ABORT_TRAN  EQU    CW_REG.2
		     ;HOST_BUSY   EQU    CW_REG.3
		     ;PATH_SELECT EQU    CW_REG.7

		USRFG1          EQU     26H
		     EMP_RC     EQU     USRFG1.0        ;RCBUF EMPTY FLAG
		     EMP_TR     EQU     USRFG1.1        ;TRBUF EMPTY FLAG
		     LEDONF     EQU     USRFG1.2
		     ;END_TR_UART EQU    USRFG1.3
		     KEYSCAN    EQU     USRFG1.4
		     KEYPRESSED EQU     USRFG1.5


		DEBOUNCE_COUNT  EQU     30H
		RR_DATA_LENGTH  EQU     31H
		;TMPBUF          EQU     32H
		;SR_REG          EQU     33H

		TRBUF           EQU     34H     ;OUT START ADDR
		;INCLUDE 16 BYTE
		RCBUF           EQU     46H     ;IN START ADDR
		;INCLUDE 16 BYTE
		LSTTMP          EQU     59H

		CNTRL_FIELD     EQU     5AH
		LCDBUF          EQU     5BH
		;LCDADD          EQU     5CH
                OUTTMP          EQU     5DH

		R_TH_BUF        EQU     60H
		;INCLUDE 7 BYTE


;--------------------------------------------------
;CONST  DESCRIPTION
;--------------------------------------------------
		LED_DATA        EQU     00H
		TIME_MODE       EQU     11H
		DEBOUNCE_VALUE  EQU     03H
;---------------------------------------------------
;COMMANDS TO PM2300
;---------------------------------------------------
		;FIE     EQU     00H    ;FORCE INTERFACE ERROR
		RST     EQU     01H    ;RESET
		LR      EQU     02H    ;LAYER MANAGEMENT READ
		LW      EQU     03H    ;LAYER MANAGEMENT WRITE
		IR      EQU     04H    ;INTERFACE_FLAG READ
		CW      EQU     05H    ;COMMAND WRITE
		;SR      EQU     06H    ;STATUS READ
		;---------------07H
		;PR      EQU     08H    ;PACKET RECIEVE
		;PT      EQU     09H    ;PACKET TRANSMIT
		RRI     EQU     0AH    ;READ RECIEVE INFORMATION
		WTI     EQU     0BH    ;WRITE TRANSMIT INBOKE
		RRH     EQU     0CH    ;READ RECIEVE HEADER
		WTH     EQU     0DH    ;WRITE TRANSMIT HEADER
		;---------0EH---045H
		WR46    EQU     46H    ;WRITE REGISTER 46
		;---------47H---83H
		RR4     EQU     84H   ;READ REGISTER 4
		;---------85H---0FFH


		;IACK            EQU     00H
		;ACK_DATA        EQU     01H
		UNACK_DATA      EQU     02H
		;RESERVED       EQU     03H
		;FAILURE         EQU     04H
		ADD_ACK_DATA    EQU     05H
		;ADDR_IACK       EQU     06H
		;ADDR_UNACK      EQU     07H

		MODE_CONTROL    EQU     08H

		SRC_GROUP_LSB   EQU     01H
		SRC_GROUP_MSB   EQU     00H
		SRC_DEVICE_LSB  EQU     01H
		SRC_DEVICE_MSB  EQU     00H
		SRC_SYS_LSB     EQU     01H
		SRC_SYS_MSB     EQU     00H

		;DES_GROUP_LSB   EQU     02H
		;DES_GROUP_MSB   EQU     00H
		DES_DEVICE_LSB  EQU     02H
		DES_DEVICE_MSB  EQU     00H
		DES_SYS_LSB     EQU     02H
		DES_SYS_MSB     EQU     00H


		       
;------------------------------------------------
;                Start from 0000
;------------------------------------------------
		E87(AEDK51S)
	
		ORG 0000H
		LJMP START
		ORG 0003H
		LJMP EXTINT0
		ORG 000BH
		LJMP T0INT
		ORG 0013H
		LJMP EXTINT1
		ORG 001BH
		RETI
		ORG 0023H
		RETI
	START:  CLR EA
		MOV SP,#6FH

		MOV R1,#02H
	CLRAM:  CLR  A
		MOV @R1,A
		INC R1
		CJNE R1,#6EH,CLRAM

		MOV R1,#07FH
	CLRAM2: CLR A
		MOV @R1,A
		INC R1
		CJNE R1,#0FFH,CLRAM2
		
		ACALL INITILY
		SETB EA
;---------------------------------------------------
;PROGRAM MAIN LOOP STARTS HERE
;---------------------------------------------------
	;MAIN:
		SETB TR0
		LCALL INI_PM

		CLR LEDONF
	MAIN:   LCALL LEDTSK
		LCALL KEY_SCANING

		JB PDLLST,MAIN01   ;ATTENTION SEQUENCE REQUIRED,
					;NO GO ON
		SETB LEDCS0              ;YES READ THE INTERFACE_STATUS
		LCALL HOST_RD_IS
	MAIN01:
		LCALL HOST_READ_RR4     ;READ RECIEVE STATUS REGISTER
		LCALL HOST_REC_PKTH     ;READ PACKET HEAD
		LCALL HOST_REC_PKT      ;READ RECIEVE PACKET

		;JB R_NEW_TH,SEND_LOOP
		;AJMP MAIN02:
	;SEND_LOOP:
		;LCALL HOST_GET_LOOP
		;CLR R_NEW_TH
	;MAIN02:
		LCALL HOST_GET_DATA
		LCALL HOST_WR_TH
		LCALL HOST_SEND_PKT

		AJMP MAIN
;---------------------------------------------------------

;INITILY:
;       INCLUDE PIN, SFR, REGISTER
;------------------------------------------------------
	INITILY:
;------------------------------------------------------
;               PIN INITILY
;------------------------------------------------------
		MOV P1,#0FEH
		MOV P2,#0FFH
		SETB LCDCS
;-------------------------------------------------------
;               SFR INITILY
;-------------------------------------------------------
		MOV TCON,#03H           ;INTI0&INTI1 INTERRUPT FAILING EDGE
		MOV TMOD,#TIME_MODE     ;T0 TIMER IS 16BIT COUNT (MODE 1)
		MOV TH0,#0EFH           ;1388H=5000*1uS=5MS
		MOV TH0,#069H           ;FFFF-1388=EC77
		MOV SPI_DATA,#LED_DATA
		;MOV SCON,#50H
		MOV PCON,#80H
		;MOV T2CON,#30H
		MOV IE,#007H            
		MOV IP,#001H
		CLR RS0
		CLR RS1
;---------------------------------------------------------
;               REGISTER INITILY
;---------------------------------------------------------
		MOV PHYSTATE,#0FFH
		MOV USRFG1,#0FFH
		SETB EMP_TR
		MOV DEBOUNCE_COUNT,#00H

		MOV TMFLAG,#00H
		MOV T5CNT,#64H          ;64H=100
		MOV T1SCNT,#0C8H        ;C8H=200 

		MOV R1,#RTRBUF
		MOV A,#TRBUF
		LCALL PTRSUB
		MOV R1,#RRCBUF
		MOV A,#RCBUF
		LCALL PTRSUB

		MOV MODE_CNTRL,MODE_CONTROL
		MOV GRP_ADR_LSB,#SRC_GROUP_LSB
		MOV GRP_ADR_MSB,#SRC_GROUP_MSB
		MOV S_DEV_ADR_LSB,#SRC_DEVICE_LSB
		MOV S_DEV_ADR_MSB,#SRC_DEVICE_MSB
		MOV S_SYS_ADR_LSB,#SRC_SYS_LSB
		MOV S_SYS_ADR_MSB,#SRC_SYS_MSB

		MOV D_DEV_ADR_LSB,#DES_DEVICE_LSB
		MOV D_DEV_ADR_MSB,#DES_DEVICE_MSB
		MOV D_SYS_ADR_LSB,#DES_SYS_LSB
		MOV D_SYS_ADR_MSB,#DES_SYS_MSB

		MOV CNTRL_FIELD,#UNACK_DATA
		MOV OUTTMP,#00H
		LCALL PREST
		
		RET
;-----------------------------------------------
;PREST:
;-----------------------------------------------
	PREST:  MOV R1,#TRBUF
		MOV DATA_CNT,#10H
	PREST1: MOV A,OUTTMP
		MOV @R1,A
		INC R1
		DJNZ DATA_CNT,PREST1
		RET

;------------------------------------------------------
;INI_PM:       INITIALIZATION THE PM2300
;------------------------------------------------------
	INI_PM: MOV PHYSTATE,#0FFH
		MOV IR_REG,#00H
		CLR WR_BUS_SUCC
		SETB WR_SUCC
		;SETB END_TR_UART
		CLR KEYPRESSED
	INI_PM1:CLR SSCRST
		NOP
		NOP
		NOP
		SETB SSCRST
		LCALL DLY30MS
	;INI_PM100:
		LCALL HOST_WR_RST
		JB WR_BUS_SUCC,INI_PM10
		AJMP INI_PM1
	INI_PM10:
		LCALL DLY30MS
		LCALL HOST_READ_IR
		JB WR_BUS_SUCC,INI_PM11
		AJMP INI_PM1
	INI_PM11:
		JB RESET,INI_PM2
		AJMP INI_PM1
	INI_PM2:LCALL DLY10MS
		MOV CW_REG,#08H
		LCALL HOST_WR_CW
		JB WR_BUS_SUCC,INI_PM3
		SJMP INI_PM_1T1
	INI_PM3:MOV TIMER1,#10H
		CLR T1
	INI_PM4:LCALL HOST_WR_LW
		JB WR_BUS_SUCC,INI_PM5
		JB T1,INI_PM_1T1
		AJMP INI_PM4
	INI_PM5:MOV TIMER1,#10H
		CLR T1
	INI_PM6:LCALL HOST_RD_LR
		JB WR_BUS_SUCC,INI_PM7
		JB T1,INI_PM_1T1
		AJMP INI_PM6

	INI_PM_1T1:
		SJMP INI_PM1

	INI_PM7:MOV TIMER1,#00H
		LCALL CHECK_LS_EQU
		MOV A,DATA_CNT
		JZ INI_PM_A
		SJMP INI_PM1
	INI_PM_A:
		MOV TIMER1,#10H
		CLR T1
	INI_PM_B:
		LCALL HOST_WR_WR46
		JB WR_BUS_SUCC,INI_PM_C
		JB T1,INI_PM_1T1
		AJMP INI_PM_B
	INI_PM_C:
		MOV TIMER1,#04H
		CLR T1
	INI_PM_D:
		MOV CW_REG,#00H
		LCALL HOST_WR_CW
		JB WR_BUS_SUCC,INI_PM_X
		JB T1,INI_PM_1T1
		AJMP INI_PM_D
	INI_PM_X:
		MOV TIMER1,#00H
		MOV RE_TX_CNT,#0FFH
		MOV LCDBUF,#00H
		;*MOV LCDADD,#00H
		LCALL LCDON
		LCALL DLY10MS
		MOV LCDBUF,#0FFH
		LCALL LCDON

		RET

;-----------------------------------------------
;HOST_REC_PKT:
;-----------------------------------------------
	HOST_REC_PKT:
		JB RC_SUCC,HOST_REC_PKT0
		RET
	HOST_REC_PKT0:
		JB SINT,HOST_REC_PKT1
		RET
	HOST_REC_PKT1:
		MOV R1,#RCBUF
		CLR SSCCS
		MOV A,#RRI
		LCALL HOSTWR

		JB WR_BUS_SUCC,HOST_REC_PKT2
		AJMP HOST_REC_PKT5
	HOST_REC_PKT2:
		LCALL HOSTRD
		JB RD_BUS_SUCC,HOST_REC_PKT3
		AJMP HOST_REC_PKT5
	HOST_REC_PKT3:
		MOV DATA_CNT,A
	HOST_REC_PKT31:
		LCALL HOSTRD
		JB RD_BUS_SUCC,HOST_REC_PKT4
		AJMP HOST_REC_PKT5
	HOST_REC_PKT4:
		MOV @R1,A
		INC R1
		DJNZ DATA_CNT,HOST_REC_PKT31
		SETB SSCCS

		CLR EMP_RC
		MOV WRCBUF,#LSTTMP
		MOV RRCBUF,#RCBUF

		CLR LEDCS0
		CLR RC_SUCC

		SETB R_NEW_TH

		MOV R1,#RCBUF
		MOV LCDBUF,@R1
		LCALL LCDON
	HOST_REC_PKT5:
		SETB SSCCS
		RET

;-----------------------------------------------
;HOST_REC_PKTH:
;-----------------------------------------------
	HOST_REC_PKTH:
		JB RC_H_SUCC,HOST_REC_PKTH0
		RET
	HOST_REC_PKTH0:
		JB SINT,HOST_REC_PKTH1
		RET
	HOST_REC_PKTH1:
		MOV R1,#R_TH_BUF
		CLR SSCCS
		MOV A,#RRH
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_REC_PKTH2
		AJMP HOST_REC_PKTH5
	HOST_REC_PKTH2:
		LCALL HOSTRD
		JB RD_BUS_SUCC,HOST_REC_PKTH3
		AJMP HOST_REC_PKTH5
	HOST_REC_PKTH3:
		MOV HEAD_CNT,A
	HOST_REC_PKTH6:
		LCALL HOSTRD
		JB RD_BUS_SUCC,HOST_REC_PKTH4
		AJMP HOST_REC_PKTH5
	HOST_REC_PKTH4:
		MOV @R1,A
		INC R1
		DJNZ HEAD_CNT,HOST_REC_PKTH6
		CLR RC_H_SUCC
	HOST_REC_PKTH5:
		SETB SSCCS
		RET

;-----------------------------------------------
;HOST_WR_CW:
;-----------------------------------------------
	HOST_WR_CW:
		CLR WR_BUS_SUCC
		JB SINT,HOST_WR_CW1
		RET
	HOST_WR_CW1:
		CLR SSCCS
		MOV A,#CW
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_WR_CW2
		AJMP HOST_WR_CW5
	HOST_WR_CW2:
		MOV A,#02H
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_WR_CW3
		AJMP HOST_WR_CW5
	HOST_WR_CW3:
		MOV A,CW_REG
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_WR_CW4
		AJMP HOST_WR_CW5
	HOST_WR_CW4:
		MOV A,#00H
		LCALL HOSTWR
	HOST_WR_CW5:
		SETB SSCCS
		RET
;-----------------------------------------------
;HOST_WR_LW:
;-----------------------------------------------
	HOST_WR_LW:
		CLR WR_BUS_SUCC
		JB SINT,HOST_WR_LW1
		RET
	HOST_WR_LW1:
		CLR SSCCS
		MOV A,#LW
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_WR_LW11
		AJMP HOST_WR_LW3
	HOST_WR_LW11:
		MOV A,#07H
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_WR_LW12
		AJMP HOST_WR_LW3
	HOST_WR_LW12:
		MOV R1,#MODE_CNTRL
		MOV DATA_CNT,#07H
	HOST_WR_LW2:
		MOV A,@R1
		INC R1
		LCALL HOSTWR
		JB WR_BUS_SUCC,HOST_WR_LW21
		AJMP HOST_WR_LW3
	HOST_WR_LW21:
		DJNZ DATA_CNT,HOST_WR_LW2
	HOST_WR_LW3:
		SETB SSCCS
		RET

;-----------------------------------------------
;HOST_WR_RST:
;-----------------------------------------------
	HOST_WR_RST:
		SETB PDLLST

⌨️ 快捷键说明

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