📄 usbex.asm
字号:
CH375_REQ_SEL_05:
CJNE A,#DEF_USB_SET_CONFIG,CH375_REQ_SEL_06
LJMP CH375_USB_SET_CONFIG
CH375_REQ_SEL_06:
CJNE A,#DEF_USB_GET_INTERF,CH375_REQ_SEL_07
LJMP CH375_USB_GET_INTERF
CH375_REQ_SEL_07: LJMP CH375_SETUP_RET_ERR
;*************************************************************************************************
;USB GET STATUS 得到状态
CH375_USB_GET_STATUS: MOV @R0,#00H
INC R0
MOV @R0,#00H
LCALL CH375_EP0_UPLOAD ;调用端点0上传
LJMP CH375_SETUP_RET ;中断返回
CH375_SETUP_RET_ERR_1: LJMP CH375_SETUP_RET_ERR
;************************************************************************************************
;USB CLR FEATURE 清除特性
CH375_USB_CLR_FEATURE: MOV A,CMD_BUFFER ;取请求码
ANL A,#1FH
CJNE A,#02H,CH375_SETUP_RET_ERR_1 ;不是端点则不支持
MOV A,CMD_BUFFER+4
CJNE A,#82H,CH375_USB_CLR_FEA_0
;端点2上传
MOV A,#CMD_SET_ENDP7 ;清除端点2上传
CALL WR_CMD_TO_375
MOV A,#8EH
MOVX @DPTR,A
LCALL CH375_EP0_IN_ZERO ;上传0长读的信息包
LJMP CH375_SETUP_RET
;
CH375_USB_CLR_FEA_0: CJNE A,#02H,CH375_USB_CLR_FEA_1
MOV A,#CMD_SET_ENDP6 ;清除端点2下传
CALL WR_CMD_TO_375
MOV A,#80H
MOVX @DPTR,A
LCALL CH375_EP0_IN_ZERO ;上传0长读的信息包 ;端点2下传
LJMP CH375_SETUP_RET
CH375_USB_CLR_FEA_1: CJNE A,#81H,CH375_USB_CLR_FEA_2
MOV A,#CMD_SET_ENDP5 ;清除端点1上传
CALL WR_CMD_TO_375
MOV A,#8EH ;端点1上传
MOVX @DPTR,A
LCALL CH375_EP0_IN_ZERO ;上传0长读的信息包
LJMP CH375_SETUP_RET
CH375_USB_CLR_FEA_2: CJNE A,#01H,CH375_USB_CLR_FEA_3
MOV A,#CMD_SET_ENDP4 ;清除端点1下传
CALL WR_CMD_TO_375
MOV A,#80H ;端点1下传
MOVX @DPTR,A
LCALL CH375_EP0_IN_ZERO ;上传0长读的信息包
LJMP CH375_SETUP_RET
CH375_USB_CLR_FEA_3:
LJMP CH375_SETUP_RET_ERR ;;不支持
;****************************************************************************************
;USB AET ADDRESS
CH375_USB_SET_ADDRES: MOV A,CMD_BUFFER+2 ;取出地址
MOV VAR_USB_ADDRESS,A ;暂存地址
LCALL CH375_EP0_IN_ZERO ;上传0长读的信息包
LJMP CH375_SETUP_RET ;先退出,到发出状态后才能反改变
;*****************************************************************************************
;USB GET DESCR 获得描述符
CH375_USB_GET_DESCR: MOV A,CMD_BUFFER+3
CJNE A,#1H,CH375_GET_DESCR_1 ;获取设备描述符
MOV A,#00H
MOV VAR_SETUP_DESCR,A ;描述符偏移量=0
LCALL CH375_DES_UPLOAD
LJMP CH375_SETUP_RET
CH375_GET_DESCR_1:
CJNE A,#2H,CH375_GET_DESCR_2
;获取配置描述符
MOV A,#USB_CFG_DESCR_TAB-USB_DEV_DESCR_TAB
MOV VAR_SETUP_DESCR,A ;描述符偏移量
LCALL CH375_DES_UPLOAD
LJMP CH375_SETUP_RET
CH375_GET_DESCR_2:
CH375_GET_DESCR_3: LJMP CH375_SETUP_RET_ERR ;不支持退出
;*******************************************************************************************
;USB GET CONFIG
CH375_USB_GET_CONFIG: MOV @R1,#01H ;配置值为01H,在描述符里指定的
JB CH375_CON_FLAG,CH375_CON_CON
MOV @R1,#00H ;CH375没有配置返回00
CH375_CON_CON: LCALL CH375_EP0_UPLOAD ;调用端点0上传
LJMP CH375_SETUP_RET
;********************************************************************************************
;USB SET CONFIG
CH375_USB_SET_CONFIG: MOV A,CMD_BUFFER+2
CLR CH375_CON_FLAG ;取消配置
SETB CH375_CON_ACT
JZ CH375_USB_SET_CFG1
SETB CH375_CON_FLAG ;设置配置
CLR CH375_CON_ACT ;输出低电平指示完成标志
CH375_USB_SET_CFG1:
LCALL CH375_EP0_IN_ZERO ;上传0长读的信息包
LJMP CH375_SETUP_RET
;*********************************************************************************************
;USB GET INTER
CH375_USB_GET_INTERF: MOV @R1,#01H ;返回一个接口
LCALL CH375_EP0_UPLOAD ;因为在这里我们指定一个接口
LJMP CH375_SETUP_RET
;*********************************************************************************************
CH375_EP0_UPLOAD: MOV A,VAR_SETUP_LENGTH ;取出长度
MOV R5,#08H
CLR C
SUBB A,R5
MOV R5,VAR_SETUP_LENGTH ;上传长度小于8
JC CH375_EP0_UP_LEN
MOV VAR_SETUP_LENGTH,A ;重新给出长度
MOV R5,#08H
CH375_EP0_UP_LEN:
MOV R0,#CMD_BUFFER ;上传缓冲区送R0
MOV A,#CMD_WR_USB_DATA3 ;命令口送入,写端点0
CALL WR_CMD_TO_375
MOV A,R5 ;首先上传长度
MOVX @DPTR,A ;数据长度送375
CH375_EP0_UP_LOOP2: MOV A,@R0 ;数据取出, ;
MOVX @DPTR,A ;数据送入CH375
INC R0 ;缓冲区地址加一
DJNZ R5,CH375_EP0_UP_LOOP2 ;缓冲区不满则继续
CH375_EP0_UP_LOOPRET:
RET
;********************************************************************************************
CH375_DES_UPLOAD: MOV R0,#CMD_BUFFER ;缓冲区首地址送间接寻址
MOV R5,#08H
MOV DPTR,#USB_DEV_DESCR_TAB ;
CH375_DES_UPLOOP:
MOV A,VAR_SETUP_DESCR
LCALL CH375_TAB_TAB
MOV @R0,A
INC VAR_SETUP_DESCR
INC R0
DJNZ R5,CH375_DES_UPLOOP
LCALL CH375_EP0_UPLOAD
RET
;RERUEST OVER
CH375_EP0_IN_ZERO:
MOV A,#CMD_WR_USB_DATA3 ;上传0长度的联络信息包
CALL WR_CMD_TO_375
MOV A,#00H
MOVX @DPTR,A
RET
;********************************************************************************************
; 以毫秒为单位延时
; ENTRY: R7 延时毫秒数
; USE: ACC, R7
DELAY_MS: MOV A,#0FAH ;250*(1*6+2)*0.5=1000uS
DELAY_1MS: NOP
NOP
NOP
NOP
NOP
NOP
DJNZ ACC,DELAY_1MS ;每周期延时1毫秒
DJNZ R7,DELAY_MS
RET
;
;*********************************************************************************************************************
;
CH375_TAB_TAB: MOVC A,@A+DPTR
RET
USB_DEV_DESCR_TAB: DB 12H ;USB设备描述符
DB 01H
DB 10H
DB 01H
DB 0FFH ;04H, DeviceClass
DB 80H ;05H, DeviceSubClass
DB 37H ;06H, DeviceProtocol
DB 08H ;端点0最大包长度8字节
DB 48H ;08H, VendorId-L
DB 43H ;09H, VendorId-H
DB 37H ;0AH, ProductId-L
DB 55H ;0BH, ProductId-H
DB 00H ;0CH, ReleaseId-L
DB 01H ;0DH, ReleaseId-H
DB 00H
DB 00H
DB 00H ;10H, IndexSerialNumber
DB 01H
USB_CFG_DESCR_TAB: DB 09H ;USB配置描述符
DB 02H
DB 27H ;02H, TotalLength-L
DB 00H
DB 01H
DB 01H ;配置值
DB 00H
DB 80H ;07H, Attributes
DB 40H
DB 09H ;USB接口描述符
DB 04H
DB 00H
DB 00H
DB 03H ;0DH, NumberEndpoints
DB 0FFH ;0EH, InterfaceClass
DB 80H ;0FH, InterfaceSubClass
DB 37H ;10H, InterfaceProtocol
DB 00H
DB 07H
DB 05H
DB 82H ;端点82H发送/上传
DB 02H ;批量端点
DB 40H ;最大包长度32字节
DB 00H
DB 00H
DB 07H
DB 05H
DB 02H ;端点02H接收/下传
DB 02H ;批量端点
DB 40H ;最大包长度32字节
DB 00H
DB 00H
DB 07H
DB 05H
DB 81H ;端点81H发送/上传
DB 03H ;中断端点
DB 08H ;最大包长度8字节
DB 00H
DB 01H ;轮询时间1毫秒
DB 07H
DB 05H
DB 01H ;端点01H接收/下传
DB 02H ;批量端点
DB 08H ;最大包长度8字节
DB 00H
DB 00H
END
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -