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

📄 vectors.a51

📁 演示了如何开发WINDOES下I/O口驱动
💻 A51
字号:
; This module supports an external USB connection using an I2C-connected
; PDIUSBD11 (from Philips).  
; The hardware is shown in Figure 6-17 with the following correction:
;	The 12MHz crystal is connected to the PDIUSBD11.  The EZ-USB is
;	clocked from CLKOUT of the PDIUSBD11. (This saved a divide by
;	two on the 24MHz CLKOUT of the EZ-USB).
; The interrupt from the PDIUSBD11 is fed to INT4 of the EZ-USB
;
; This module contains all of the interrupt vector declarations and
; the first level interrupt servicing of the PDIUSBD11: read Interrupt
; Status Register, Check for Valid Transaction etc)
;
; A Reset sends us to Program space location 0
	CSEG AT	0		; Code space
	USING 0			; Reset forces Register Bank 0
	LJMP	Reset
;
; The interrupt vector table is also located here
;	LJMP	INT0_ISR	; Features not used are commented out
;	ORG	0BH
;	LJMP	Timer0_ISR
;	ORG	13H
;	LJMP	INT1_ISR
;	ORG	1BH
;	LJMP	Timer1_ISR
;	ORG	23H
;	LJMP	UART0_ISR
;	ORG	2BH
;	LJMP	Timer2_ISR
;	ORG	33H
;	LJMP	WakeUp_ISR
;	ORG	3BH
;	LJMP	UART1_ISR
;	ORG	43H
;	LJMP	USB_ISR
	ORG	4BH
	LJMP	I2C_ISR
	ORG	53H
	LJMP	INT4_ISR
;	ORG	5BH
;	LJMP	INT5_ISR
;	ORG	63H
;	LJMP	INT6_ISR

	ORG	0E0H		; Keep out of the way of dScope monitor
				; If you are not using dScope then this memory hole
				; may be used for useful routines.
; When a feature is used insert the required interrupt processing here
; The example use only used Endpoints 0 and 1 and also SOF for timing
Reserved:
INT0_ISR:
Timer0_ISR:
INT1_ISR:
Timer1_ISR:
UART0_ISR:
Timer2_ISR:
UART1_ISR:
I2C_ISR:
INT5_ISR:
INT6_ISR:
Not_Used:			; Should not get any of these
	RETI

ClearINT4:			; Tell the hardware that we're done
	MOV	A, EXIF
	CLR	ACC.4		; Clear the Interrupt 2 bit
	MOV	EXIF, A
	RET

INT4_ISR:			; The PDIUSBD11 needs attention
	MOV	A, #0F4H	; Read it's Interrupt Register
	CALL	ReadI2CByte
	ANL	A, #00000100b	; In this example only the EP0 Control is enabled
	JZ	Done
	MOV	A, #42H		; Read the Last Transaction Status
	CALL	ReadI2CByte
	JB	ACC.0, Done	; Ignore transaction if there are errors
	JNB	ACC.5, Done	; We're waiting for a SETUP packet
Wait4F:	MOV	A, #82H		; Read status of EP0 Control OUT
	Call	ReadI2CByte
	JNB	ACC.5, Wait4F	; Wait til all of the token has been received
;
	MOV	A, #3		; Select Endpoint(3) = EP0 Control IN
	CALL	SendI2Ccommand
	MOV	A, #0F1H	; Acknowledge that the SETUP token has been received
	CALL	SendI2Ccommand
	MOV	A, #0F2H	; Clear the EP0 OUT buffer ready to receive data
	CALL	SendI2Ccommand 
	MOV	A, #2		; Select Endpoint(2) = EP0 Control OUT
	CALL	SendI2Ccommand
	MOV	A, #0F1H	; Acknowledge that the SETUP token has been received
	CALL	SendI2Ccommand  ; This will allow the SETUP data to be received
	MOV	A, #10
	CALL	ReadI2CBytes	; Read 10 bytes [Reserved, Count, SetupData(8)]
				; Returns with Count in ACC
	CJNE	A, #8, Stall	; Need 8 bytes for a valid SETUP packet
;
; We have just received a SETUP packet, interpret and respond to it's contents
	CALL	ServiceSetupPacket
; Note that SETUPDAT, SUDPTR, In0ByteCount and EP0Control are redeclared in this 
; module so that fewer changes are required in ExtINT (was USB_INT)
;
; This routine returns with ACC.1 = HSNAK and ACC.0 = EP0STALL  
                                
	
SUDAV_ISR:			; A Setup packet has been received
	PUSH	PSW		; Save Registers before the service routine
	PUSH	ACC
	PUSH	DPL
	PUSH	DPH
	CALL	ServiceSetupPacket
	CALL	ClearINT2				
	                        ; Clear the source of the interrupt
	MOV	A, #00000001b
ExitISR:MOV	DPTR, #USBIRQ
	MOVX	@DPTR, A
        POP	DPH		; Restore Registers
	POP	DPL
        POP	ACC
        POP	PSW
	RETI

SOF_ISR:			; A Start-Of-Frame packet has been received
	PUSH	PSW		; Save Registers before the service routine
	PUSH	ACC
	PUSH	DPL
	PUSH	DPH
	CALL	ServiceTimerRoutine
	CALL	ClearINT2				
	                        ; Clear the source of the interrupt
	MOV	A, #00000010b
	JMP	ExitISR


⌨️ 快捷键说明

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