📄 usb.asm
字号:
;*******************************************************************************************
; 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 + -