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

📄 usb.asm

📁 USB2.0原理与工程开发光盘(第二版)
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*******************************************************************************************
; DS1620.asm - DS1620采集温度的主程序
;*******************************************************************************************

include "63001.inc"   

gbInterruptMask:            equ 20h 
gbUSBValidRqsts:            equ 21h 

gbUSBSendSequence:          equ 24h 
gbUSBSendBytes:             equ 25h 
gbUSBSendBuffer:            equ 26h 
gbSuspendCount:             equ 27h 

gbEnumerated:               equ 28h 

gbLEDBrightnessUpdate:      equ 2Ah 
gbLEDBrightness:            equ 2Bh 
LEDControl:                 equ 2Ch 

gbButtonDebounce:           equ 2Dh 
gbButtonPushed:             equ 2Eh 
Button_Pin:                 equ 04h 

;*************************************************
; ROM代码段 Code Segment (ROM)
;*************************************************
org 00h
    jmp Reset_ISR  
    jmp UnUsed_ISR 
    jmp 1024us_ISR 
    jmp USB_EP0_ISR
    jmp UnUsed_ISR 
    jmp UnUsed_ISR 
    jmp GPIO_ISR   
    jmp UnUsed_ISR 

;*************************************************
; UnUsed_ISR:处理未使用的中断
;*************************************************
UnUsed_ISR:
    push a
    mov a,[gbInterruptMask]
    ipret Global_Interrupt
    
;*******************************************************************************
; Reset_ISR:复位中断
;*******************************************************************************
Reset_ISR:
     mov a,70h 
     swap a,dsp

     mov a,FFh
     iowr P0_Data 
     iowr P1_Data 
                  
     mov a,0
     iowr P0_PullUp
     mov a,Button_Pin 
     iowr P1_PullUp
                    
     mov a,0
     iowr P0_IntEnable 
     iowr P1_IntEnable 
                            
     mov a,0
     mov [gbUSBValidRqsts],a     
     mov [gbUSBSendSequence],a   
     mov [gbEnumerated],a        

     mov a,FFh                   
     mov [LEDControl],a               
     
     mov a,1        
     mov [gbLEDBrightnessUpdate],a 
     mov a,FFh
     mov [gbLEDBrightness],a 
     
     mov a,0
     mov [gbButtonPushed],a 
     
     mov a,0
     mov [gbUSBSendBytes],a 
     mov [gbSuspendCount],a 
     mov [gbButtonDebounce],a 

     mov a,Timer_1024us_IE|USB_EP0_IE
     mov [gbInterruptMask],a
     
     ;****************主循环*****************************
  MainLoop:
     mov a,[gbInterruptMask]
     iowr Global_Interrupt
     
     mov a,0
     cmp a,[gbEnumerated]
     jz MainLoop 
     
     mov a,FEh
     and [LEDControl],a     
     mov a,[LEDControl]
     iowr P1_Data
     
     mov a,FFh
     iowr P1_SinkPin0     

     mov a,10 
     call SysDelayMS
     Call ThermReadTemperature 
     
     mov a,0
     cmp a,[gbLEDBrightnessUpdate]
     jz MainLoopDone
     
     mov a,0
     mov [gbLEDBrightnessUpdate],a
     
     mov a,[gbLEDBrightness]
     iowr P1_SinkPin1
     
   MainLoopDone:
     jmp MainLoop
     ;*********************************************
     
     halt
     ;程序是永远不会执行到这里的。

;********************************************************
;1024us_ISR()
;********************************************************     
1024us_ISR:
    push a
    
    iowr WatchDog
    
    iord USB_Control  
    and a,01h         
    cmp a,0h        
    jz IncCounter    
    
    iord USB_Control  
    and a,0feh
    iowr USB_Control
    mov a,0
    mov [gbSuspendCount],a  
    jmp SuspendEnd
    
  IncCounter:
    mov a,[gbSuspendCount]  
    inc a        
    mov [gbSuspendCount],a
    cmp a,03h               
    jnz SuspendEnd          
    mov a,0h                
    mov [gbSuspendCount],a
    iord StatusControl      
    or a,08h
    iowr StatusControl      
    nop
     
  SuspendEnd:
    mov a,0
    cmp a,[gbButtonDebounce]  
    jz STimerNoDebounce
    
    dec [gbButtonDebounce]
    mov a,0
    cmp a,[gbButtonDebounce]
    jnz STimerNoDebounce 
            
    iord P1_Data  
    and a,Button_Pin 
    jnz STimerDebounceOver   
    
    mov a,0                  
    mov [gbButtonDebounce],a 
    jmp STimerNoDebounce
    
  STimerDebounceOver:
    mov a,1
    xor [gbButtonPushed],a
       
  STimerNoDebounce:
    mov a,[gbInterruptMask]
    ipret Global_Interrupt

;********************************************************
;GPIO_ISR()
;********************************************************
GPIO_ISR:
    push a
    
    mov a,100
    mov [gbButtonDebounce],a
        
    mov a,[gbInterruptMask]
    ipret Global_Interrupt
     
;//////////////////////////////////USB_EP0_ISR Start/////////////////////////////////////////////
;********************************************************
; USB_EP0_ISR()
;********************************************************
USB_EP0_ISR:
      push a
      
      iord EP0_Rx_Status
      and a,EP0_Rx_Setup    
      jz NoSetup
      
      iord EP0_Tx_Config
      and A, EP0_Rx_Err
      jnz USBEventEP0Stall   
      
      iord EP0_Rx_Status
      and A, f0h
      cmp A, A0h	
      jnz USBEventEP0Stall
      
      iord EP0_Rx_Status
      and A, 08h
      jnz USBEventEP0Stall
      
      mov a,[gbInterruptMask]
      and a,0f7h
      mov [gbInterruptMask],a
      iowr Global_Interrupt
               
      jmp USBEventEP0_SETUP
      
    NoSetup:
      iord EP0_Rx_Status
      and a,EP0_Rx_Out
      jnz USBEventEP0_OUT

      iord EP0_Rx_Status
      and a,EP0_Rx_In
      jnz USBEventEP0_IN
      
      jmp USBEventEP0End

    USBEventEP0_IN:
       jmp USBEventEP0End
   
   USBEventEP0_OUT:
       jmp USBEventEP0End
      
   USBEventEP0End:
      mov a,[gbInterruptMask]
      or a,08h
      mov [gbInterruptMask],a     
      ipret Global_Interrupt 

   USBEventEP0Stall:
      iord EP0_Tx_Config
      or a,EP0_Tx_Stall
      iowr EP0_Tx_Config
      
      jmp USBEventEP0End
   
;*******************************************************************************
; USBEventEP0_SETUP()
;*******************************************************************************
USBEventEP0_SETUP:
      mov a,0 
      mov [gbUSBSendBytes],a 
      
      mov a,0
      iowr EP0_Rx_Status

      mov a,[EP0_FIFO.0]
    
    USBEventEP0SetupTargetDeviceOUT:
      cmp a,USBRqstTargetDevice
      jz USBEventEP0SetupIsSetAddress 
      
    USBEventEP0SetupTargetInterfaceOUT:
      cmp a,USBRqstTargetInterface
      jz USBEventEP0Stall 
      
    USBEventEP0SetupTargetEndpointOUT:
      cmp a,USBRqstTargetEndPoint
      jz USBEventEP0Stall 
    
    USBEventEP0SetupTargetDeviceIN:
      cmp a,USBRqstTargetDevice | USBRqstTypeDirection
      jz USBEventEP0SetupIsGetDescriptor 
      
    USBEventEP0SetupTargetInterfaceIN:
      cmp a,USBRqstTargetInterface | USBRqstTypeDirection
      jz USBEventEP0Stall 
      
    USBEventEP0SetupTargetEndpointIN:    
      cmp a,USBRqstTargetEndPoint | USBRqstTypeDirection  
      jz USBEventEP0Stall 

   USBEventEP0SetupTargetVendorIN_OUT:
      mov a,[EP0_FIFO.0]
      and a,USBRqstTypeVendor | USBRqstTypeDirection
      cmp a,USBRqstTypeVendor | USBRqstTypeDirection
      jz USBEventEP0VendorRqst
      
      jmp USBEventEP0Stall 
     
;********************************************************
; USBEventEP0SetupIsSet***()
;********************************************************
  USBEventEP0SetupIsSetAddress:
     mov a,[USBRqstMessage]
     cmp a,USBRqstSetAddress
     jz USBEventEP0SetupSetAddress 
  
    USBEventEP0SetupIsSetConfig:
     mov a,[USBRqstMessage]
     cmp a,USBRqstSetConfiguration
     jz USBEventEP0SetupSetConfig 

     jmp USBEventEP0Stall 

;********************************************************
; USBEventEP0SetupIsGetDescriptor()
;********************************************************
USBEventEP0SetupIsGetDescriptor:
     mov a,[USBRqstMessage]
     cmp a,USBRqstGetDescriptor
     jz USBEventEP0SetupGetDescriptor

     jmp USBEventEP0Stall

;********************************************************
; USBEventEP0SetupSetAddress()
;********************************************************
USBEventEP0SetupSetAddress:
     call USBSend0DataAck
     
     inc [gbUSBValidRqsts]
     
     mov a,[USBRqstWordValueLo]
     iowr USB_DeviceAddress

     jmp USBEventEP0End
   
;********************************************************
; USBEventEP0SetupSetConfig()
;********************************************************
USBEventEP0SetupSetConfig:
      
       mov a,[USBRqstWordValueLo]  
       cmp a,00h
       jnz ConfigureDevice
       
   UnConfigureDevice:
       jmp SetConfigureDone
       
   ConfigureDevice:   
       mov a,01h
       mov [gbEnumerated],a
            
       mov a,Button_Pin
       iowr P1_IntEnable 
       
       call ThermInitialize

       mov a,Timer_1024us_IE | GPIO_IE | USB_EP0_IE
       mov [gbInterruptMask],a
       jmp SetConfigureDone
       
    SetConfigureDone:
       call USBSend0DataAck
       jmp USBEventEP0End  
    
;********************************************************
; USBEventEP0SetupGetDescriptor()
;********************************************************
USBEventEP0SetupGetDescriptor:
       mov a,[USBRqstWordValueHi]
    
     USBEventEP0SetupGetDescriptorDevice:
       cmp a,USBDescriptorTypeDevice
       jnz USBEventEP0SetupGetDescriptorConfig 

       inc [gbUSBValidRqsts]

       ;*********************************************
       ;读取设备描述符
       ;*********************************************
       mov a,(USBDeviceDescription -USBSendROMBufferBase)
       mov [gbUSBSendBuffer],a

       mov a,12h             
       mov [gbUSBSendBytes],a
       
       call USBSendDescriptorCheckLength
       
       call USBSendROMBuffer
       jmp USBEventEP0End
       
     USBEventEP0SetupGetDescriptorConfig:
       cmp a,USBDescriptorTypeConfig
       jnz USBEventEP0SetupGetDescriptorString 
       
       inc [gbUSBValidRqsts]

       ;*********************************************
       ;读取配置描述符
       ;*********************************************
       mov a,(USBConfigurationDescription -USBSendROMBufferBase)
       mov [gbUSBSendBuffer],a
       
       mov a,09h 
       add a,09h 
       mov [gbUSBSendBytes],a

       call USBSendDescriptorCheckLength
       
       call USBSendROMBuffer
       jmp USBEventEP0End
       
     USBEventEP0SetupGetDescriptorString:
       cmp a,USBDescriptorTypeString
       jnz USBEventEP0SetupGetDescriptorEnd 
 
       ;*********************************************
       ;读取字符串描述符
       ;*********************************************
       
       mov a,[USBRqstWordValueLo]
       
     USBEventEP0SetupGetDescriptorString0:
       cmp a,0h
       jnz USBEventEP0SetupGetDescriptorString1 

       ;*********************************************
       ;读取字符串0描述符
       ;*********************************************
       mov a,(USBStringDescription0 -USBSendROMBufferBase)
       mov [gbUSBSendBuffer],a

       mov a,4h 
       mov [gbUSBSendBytes],a
       
      call USBSendDescriptorCheckLength
       
       call USBSendROMBuffer
       jmp USBEventEP0End

     USBEventEP0SetupGetDescriptorString1:
       cmp a,1
       jnz USBEventEP0SetupGetDescriptorString2 
       
       ;*********************************************
       ;读取字符串1描述符
       ;*********************************************
       mov a,(USBStringDescription1 -USBSendROMBufferBase)
       mov [gbUSBSendBuffer],a
       
       mov a,8h 
       mov [gbUSBSendBytes],a
       
       call USBSendDescriptorCheckLength

       call USBSendROMBuffer
       jmp USBEventEP0End

    USBEventEP0SetupGetDescriptorString2:
       cmp a,2
       jnz USBEventEP0SetupGetDescriptorString3 
       
       ;*********************************************
       ;读取字符串2描述符
       ;*********************************************
       mov a,(USBStringDescription2 -USBSendROMBufferBase)
       mov [gbUSBSendBuffer],a
       
       mov a,18h 
       mov [gbUSBSendBytes],a
       
       call USBSendDescriptorCheckLength

       call USBSendROMBuffer
       jmp USBEventEP0End

     USBEventEP0SetupGetDescriptorString3:
       cmp a,3
       jnz USBEventEP0SetupGetDescriptorEnd 

⌨️ 快捷键说明

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