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

📄 hiduart.asm

📁 USB2.0原理与工程开发光盘(第二版)
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;===============================================================================================
; HIDUART.asm :RS232-USB转换的主程序。
;===============================================================================================

CPU	63001

include		"63001.inc"            
include		"ram.inc"

;***********************************************************************************************
;            ROM代码段 Code Segment (ROM)
;***********************************************************************************************
org  00h  
     jmp  Reset_ISR         
     jmp  128us_ISR	    
     jmp  1024us_ISR	    
     jmp  USB_EP0_ISR	    
     jmp  USB_EP1_ISR		
     jmp  Cext_ISR		
     jmp  SerialReceiveByte    
     jmp  Cext_ISR	

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Reset_ISR:复位中断
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Reset_ISR:
        mov a,DATA_STACK_POINTER_START        
        swap a,dsp

	;iord StatusControl                 
	;and a,RESET_MASK    
	;cmp a,SC_POR                        
	;jz por_reset      
        jmp por_reset

	;and a,SC_USBReset   			  
	;jnz usb_reset       

        ;mov a,00h           
        ;iowr Cext                               

	;jmp wdog_reset   

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; 128us_ISR()
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128us_ISR:
	push a
  	mov a,[interrupt_mask]
	ipret Global_Interrupt

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; 1024us_ISR()
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1024us_ISR:
	push a
  	mov a,[interrupt_mask]
	ipret Global_Interrupt

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; USB_EP0_ISR()
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
USB_EP0_ISR:
        push a 

        mov a,0
        mov [suspend_counter],a      
    
	iord EP0_Rx_Status	     
	and a,EP0_Rx_Setup	     
	jz NotSetup		     

        call DecodeRequest           
	jmp Reti	             
 
     NotSetup:
	iord EP0_Rx_Status
	and a,EP0_Rx_Out             
	jz InPacketReceived
	
	iord EP0_Rx_Status
	and a,D0h	
	jz Reti		
	                
        
        iord USB_Control  
        and a,~USBC_EnableOuts
        iowr USB_Control
        
	call ControlWriteRamDataStage    
	                                 
	jmp Reti
	
     InPacketReceived:
    	iord EP0_Tx_Config          
	and a,EP0_Tx_Respond     
	jnz Reti

        mov a,[current_reportid]  
        cmp a,RID_TRANSMIT        
        jz ep0_reportdone         
                                  
        cmp a,RID_COMMAND                   
        jnz readINdata            
                                  
                                  
     ep0_reportdone:
        mov a,00h                     
        mov a,[current_reportid]             
        
        mov a,~BUSY_TRANSMITTING      
        and [fwcr],a                       

        mov a,SERIAL0RXBIT            
	iowr P0_IntEnable                 

        mov a,ENUMERATED_MASK         
        mov [interrupt_mask],a

        FLOW_ON                       
        jmp Reti
    
      readINdata:							
	call ControlReadDataStage	

    Reti:
	mov a,[interrupt_mask]		
	ipret Global_Interrupt

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; USB_EP1_ISR()
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
USB_EP1_ISR:
	push a

	iord EP1_Tx_Config           
	xor a,EP1_Tx_Toggle
	iowr EP1_Tx_Config

	mov a,[interrupt_mask]				
	ipret Global_Interrupt

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Cext_ISR()
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Cext_ISR:
	push a; 
	mov a,[interrupt_mask]
	ipret Global_Interrupt

;***********************************************************************************************
;	                各种Reset的处理程序
;***********************************************************************************************
por_reset:
	mov a,ffh
	iowr P0_Data		         
	iowr P1_Data           

        mov a,00h
        iowr P0_IntEnable                
	iowr P1_IntEnable                   
	iowr P0_PullUp		         
	iowr P1_PullUp          

	mov a, 0fh		         
	iowr P0_SinkPin0
	iowr P0_SinkPin1		            
	iowr P0_SinkPin2		            
	iowr P0_SinkPin3		            
	iowr P0_SinkPin4	
	iowr P0_SinkPin5	
	iowr P0_SinkPin6	
	iowr P0_SinkPin7
	
	iowr P1_SinkPin0	
	iowr P1_SinkPin1	
	iowr P1_SinkPin2	
	iowr P1_SinkPin3	
	
	iowr WDT                         

	mov a,bottom_of_ram
	mov x,top_of_ram     
      ram_clr_loop:			 
	mov [x+0],a
	dec x
	jnc ram_clr_loop

	iord StatusControl
	and a,SC_USBReset
	;jnz usb_reset      
	jmp usb_reset      
								
suspend_reset:
	iowr WDT

        mov a,01h
        iowr Cext                        

	mov a,(SC_RUN + SC_SUSPEND)
	iowr StatusControl         	 
	nop
	jmp suspend_reset	         

wdog_reset:
	jmp suspend_reset	         

usb_reset:
	;mov a,SC_RUN                   
	;iowr StatusControl 

        mov a,00h           
        iowr Cext 

	mov a,ENUMERATE_MASK       
	mov [interrupt_mask],a
	iowr Global_Interrupt


    ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ;与本例子有关的一些初始化。
    ;-------------------------------------------------------------------------------------------
        mov a, 0                   
        mov [rx_inptr],a 	   
        mov [rx_outptr],a 	   
        
        mov A,00h                  
        mov [fwcr],A          
        
        mov a,BAUD_BITDELAY_DEFAULT    
        mov [baud_bitdelay],a 

    ;-------------------------------------------------------------------------------------------
       mov a,00h                
       iowr P0_PullUp           

       mov a,0FDh               
       iowr P0_Data
       
       iord P0_Data
       or a,(SERIAL0TXBIT+SERIAL0RXBIT)   
       iowr P0_Data                        

       iord P1_Data
       and a,~nRST                        
       iowr P1_Data

       FLOW_OFF                           
    
       DELAY10MS                          

       iord P1_Data
       or a,nRST                          
       iowr P1_Data

       mov a, 00h                         
       iowr P1_PullUp

   holdoff:
       iowr WDT

       mov a,[interrupt_mask]             
       cmp a,ENUMERATED_MASK              
       jnz holdoff

       iord P1_Data                       
       and a,F7h
       iowr P1_Data                         

       FLOW_ON                            

       mov a,SERIAL0RXBIT                 
       iowr P0_IntEnable
       
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;       循环主程序。 
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
main:
	iowr WDT                          

        call SuspendCounter               
	call CheckSuspend                 

 	iord EP1_Tx_Config                
	and a,EP1_Tx_Respond              
	jnz main                            

        mov a,[rx_inptr]                  
        cmp a,[rx_outptr]                 
        jz main                           

        mov a,0                              
        mov [ep1_byte_count],a            

     mgetbyte:                            
        mov x,[rx_outptr]                 
        mov a,[x+RX_BUF_PTR_START]        

        inc x                             
        swap a,x                          
        cmp a,SERIAL_BUF_SIZE             
        jnz .nextdptr                     
        mov a,0                           
    .nextdptr:
        mov [rx_outptr],a

        swap a,x                          
        mov x,[ep1_byte_count]            
        mov [x+(EP1_FIFO+2)], a           

        inc [ep1_byte_count]              
        mov a,[ep1_byte_count]            
        cmp a,6                       
        jz msendem                    

        mov a,[rx_inptr]              
        cmp a,[rx_outptr] 
        jnz mgetbyte                  

⌨️ 快捷键说明

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