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

📄 usb_isr.asm

📁 以&#1049307 &#1049319 &#1049287 &#1049289 &#1049317 &#1049301 &#1049288 &#1049283 为核心设计的&#1049320 &#1
💻 ASM
字号:
;;Established date:		2006/03/01
;;********************************************************************
;;====================================================================
ISR_USB:     
	M_PUSH		
	
	;clr     pa.4
	
			;PUSH
;;	CLR	INTC1.0			;Close USB interrupt
;;	SET	INTC0.0           	;Open other interrupt request
;;	MOV	A,C_USBRegisterBank	;USB register bank(no need in HT46RB50
;;	MOV	BP,A			;because it USB reg in bank0.)
;;--------------------------------------------------------------------
	SNZ	F_Suspend                            
	JMP	L_CheckAccessFIFO	;USB is work                       
	MOV	A,11110000B		;USB is suspend                          
	ANDM 	A,USR			;clear all endpoint status
;;--------------------------------------------------------------------
	SZ	F_Resume		;USB is resume?(reset)                                    
	JMP	L_TurnOnUSB		;Yes(reset),Open USB                          
	JMP 	L_Exit_ISRUSB    	;No(suspend),return                    
L_TurnOnUSB:
	SET	F_USBClockOn		;UCC.3,USB clock on
	JMP	L_Exit_ISRUSB		;return
;;--------------------------------------------------------------------
L_CheckAccessFIFO:
	SET	F_USBClockOn		;Open USB clock
	CLR	F_Suspend2		;clear USB low power mode

	SZ 	F_AccessEP0		;endpoint0 USB?
	JMP	L_AccessFIFO0		;EP0 service
	SZ  	F_AccessEP1		;endpoint1 USB?
	JMP	L_AccessFIFO1		;EP1 service
	JMP	L_Exit_ISRUSB		;exit USB interrupt
;;====================================================================
L_AccessFIFO0:
	SET	F_USBReset		;USB interrupt initial(?????)
	CLR	F_AccessEP0		;Clear EP0 flag
	MOV	A,C_MISC		;point MISC
	MOV	MP1,A
                                                       
	SNZ	F_ControlEvent		;setup finally?		             
	JMP	L_CheckSetupStage	;no,setup                    
		                                               
	SNZ	R1.@Packet0		;receive 0-size from host?                                                  
	JMP	L_ProcessOutDataPacket 	;no,next check             
;;--------------------------------------------------------------------
L_StatusStage:                                          
	CLR	R1.@Packet0		;receive 0-size packet,clear 0-size packet flag 
	SNZ	R1.@SetupToken		;setup common?    			    
        JMP	L_Exit_ISRUSB0		;no,exit USB interrupt                       
;;--------------------------------------------------------------------
L_CheckSetupStage:
	SNZ	R1.@SetupToken
	JMP	L_Exit_ISRUSB0
L_SetupStage:
	CLR	R1.@SetupToken		;clear setup common flag
	CLR	R1.@Packet0		;clear 0-size packet flag
	SET	F_ControlEvent		;set the flag of setup finally
	SET	F_SetupData		;set setup data flag
	JMP	L_Exit_ISRUSB0		;exit
;;-------------------------------------------------------------------- 
L_ProcessOutDataPacket:                                           
	SZ	R1.@SetupToken		;next check,is setup command?
	JMP	L_SetupStage		;yes,jmp to setup service	
	CALL	SBR_FIFO0_RD_Check	;FIFO0 read ready check
	CLR	R1.@USB_REQ
	SNZ	Z
	JMP	L_SendFIFO0		;ready=0,not ready for read FIFO,jmp to write FIFO check
;       JMP	L_ReadFIFO0		;ready=1,ready for read

;;--------------------------------------------------------------------
;;------------------ Read FIFO ---------------------------------------
L_ReadFIFO0:
	SZ	F_SetupData		;FIFO data is setup data?
	JMP	L_GetSetupStage_Data	;Yes,jmp to get setup data
	CALL	SBR_FIFO0_RD_Check	;no,check RD
	CALL	SBR_ReadFIFO0		;Read FIFO0

	MOV	A,M_ReportIndex		;load report index
	ADDM	A,PCL
	JMP	L_Exit_ISRUSB		;0:exit
	JMP	L_SetFeature		;1:set feature
;	JMP	L_SetOutput

;;====================================================================
;;--------------------ouput data from host to device------------------
;;====================================================================
L_SetOutput:
	MOV	A,M_DataPacketLength	;load packet length which receive
	XOR	A,C_ReportSize 		;packet length=8?               
	SNZ	Z
	JMP	L_StallPipe0		;no,error
;;	CALL	SBR_USBToCOM		;yes,output

;MOV	A,M_FIFOBAK0           ;wang
;MOV	PA,A                   ;wang

	CLR 	M_ReportIndex		;clear report index
	JMP	L_WriteDataToFIFO_0_Packet	;send a 0 size packet
;;--------------------------------------------------------------------
L_SetFeature:
	CLR	M_ReportIndex		;clear report index
	JMP	L_StallPipe0		;error
;;--------------------------------------------------------------------
L_GetSetupStage_Data:
	CLR	F_SetupData 		;clear the flag of setup data                         
	CALL	SBR_FIFO0_RD_Check
	CALL	SBR_ReadFIFO0   	;read FIFO 
                   
	MOV	A,C_Stall
	MOV	MP1,A    

;;	CLR	M_Stall.0		                           
;;	MOV	A,M_Stall                            
;;	MOV	R1,A			;clear EP0 error flag(???)       

CLR	F_SendContinue   		;clear send data flag                         
	CLR	M_ReportIndex		;clear report index
                        
	MOV	A,C_FIFOSize
	XOR	A,M_DataPacketLength	;data packet length = 8 byte?
	SNZ	Z
	JMP	L_StallPipe0		;no,error.(setup data == 8 byte)
		
	MOV	A,C_RequestType
	AND	A,T_RequestType		;check RequestType's D6..5.
	SWAP	ACC
	RR	ACC
	ADDM	A,PCL
	JMP	L_StandardRequest	;0:standard request
	JMP	L_ClassRequest		;1:class request
	JMP	L_StallPipe0		;2:factory reques.  3:NULL
	
;;--------------------------------------------------------------------
;;-------------------- Write FIFO ------------------------------------
L_SendFIFO0:
	SZ	F_SetupData		;the data is setup data?
	JMP	L_Exit_ISRUSB0		;yes,exit
	CALL	SBR_FIFO0_WR_Check	;Write FIFO check
	CLR	R1.@USB_Req
	SNZ	Z                                    
	JMP	L_Exit_ISRUSB0		;not ready for write,exit
		
	SNZ	F_SendContinue		;continue send data which for setup command
	JMP	L_Exit_ISRUSB0		;no,exit
	MOV	A,M_TBLPFIFO		;load TBLP address
	MOV	TBLP,A
	JMP	L_WriteDataToBuffer	;write data to FIFO buffer
;;--------------------------------------------------------------------
;;------------- send any bytes ---------------------------------------
L_WriteDataToFIFO_AnyBytes:
	MOV	M_DataPacketLength,A	;save FIFO buffer's length
	CLR	F_ControlEvent		;clear the flag of setup finally
	JMP	L_WriteDataToFIFO	;write FIFO
;;--------------------------------------------------------------------
;;------------ send 8 byte data --------------------------------------
L_WriteDataToFIFO:
	CLR	F_BufferFull		;clear the flag of buffer full
	CALL	SBR_FIFO0_WR_Check	;FIFO write check
	SZ	Z			;ready?
	JMP	L_WriteDataToFIFOOK	;yes,jmp to write data
	CLR	R1.@USB_Req		;no,clear req
	SZ	R1.@Packet0		;send 0-size packet?
	JMP	L_Exit_ISRUSB0		;yes,exit
	SZ	R1.@SetupToken		;send data is the setup command?
	JMP	L_Exit_ISRUSB0		;yes,exit
	JMP	L_WriteDataToFIFO	;no,continue FIFO write enable check
L_WriteDataToFIFOOK:
	CALL	SBR_WriteFIFO0		;write FIFO from buffer
	SET	F_DataUpdate 		;set the flag of data updata                        
	JMP	L_Exit_ISRUSB0
;;--------------------------------------------------------------------
;;----------- send 0 byte data ---------------------------------------
L_WriteDataToFIFO_0_Packet:
	CLR	F_BufferFull		;clear buffer full flag
	CALL	SBR_FIFO0_WR_Check	;check ready for write data
	SZ	Z
	JMP	L_Write0PacketToFIFO	;yes,write
	CLR	R1.@USB_Req
	SZ	R1.@Packet0
	JMP	L_Exit_ISRUSB0
	SZ	R1.@SetupToken
	JMP	L_Exit_ISRUSB0
	JMP	L_WriteDataToFIFO_0_Packet	;no,continue check
L_Write0PacketToFIFO:
	CALL	SBR_Write_0_Packet	;write 0 size packet
	CLR	F_ControlEvent		;clear the flag of setup command receive
	JMP	L_Exit_ISRUSB0
;;--------------------------------------------------------------------
L_Stallpipe0:
	MOV	A,C_STALL
	MOV	MP1,A
	SET	M_STALL.0		;set the error flag of EP0
	SET	R1.0
	JMP	L_Exit_ISRUSB
;;--------------------------------------------------------------------
L_Exit_ISRUSB0:
	CLR	USR.0			;clear EP0 request
	JMP	L_Exit_ISRUSB
;;********************************************************************
;;**************************input data to host************************
;;********************************************************************
;;====================================================================
L_AccessFIFO1:
	SZ	M_ReportIndex
	JMP	L_ExitISRUSB1
		
	CALL	SBR_FIFO1_WR_Check	;check FIFO can write
CLR	R1.@USB_Req
	SNZ	Z
	JMP	L_ExitISRUSB1		;not ready to write,exit
	
;;--------------------------------------------------------------------
L_SendFIFOInterruptIn:
	SNZ	F_AD_FULL		;AD receive end?
	JMP	L_Exit_ISRUSB		;no,exiT

	MOV	A,C_FIFOSize
	MOV	M_Temp1,A
	MOV	A,OFFSET M_FIFOBAK0
	MOV	MP0,A
	MOV	A,OFFSET M_AD_BUF0
	MOV	MP1,A

	MOV	A,R1			;LOAD AD
	MOV	R0,A
	INC	MP0
	INC	MP1
	SDZ	M_Temp1
	JMP	$-5			;save data in FIFO buffer
                             
	MOV	A,C_ReportSize                   
	MOV	M_DataPacketLength,A
	CALL	SBR_FIFO1_WR_Check
	CALL	SBR_WriteFIFO1
	CLR	F_AD_FULL

;;;--------------------------
;	INC	M_AD_CHANNEL
;	MOV	A,M_AD_CHANNEL
;	SUB	A,C_AD_CHANNEL		;;AD channel max?
;	SZ	C
;	CLR	M_AD_CHANNEL
;	MOV	A,ADCR
;	AND	A,0F8H
;	OR	A,M_AD_CHANNEL
;	MOV	ADCR,A
;	CLR	START
;	SET	START
;	CLR	START
;;--------------------------------------------------------------------
L_ExitISRUSB1:
	CLR	F_AccessEP1
	JMP	L_Exit_ISRUSB
;;********************************************************************
L_Exit_ISRUSB:


;;	CLR 	INTC0.0			;Clear other interrupt request
;;	SET	INTC1.0			;Open USB interrupt

;	set     pa.4

	M_POP
	RETI
;;********************************************************************  

⌨️ 快捷键说明

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