?? usbex.asm
字號:
;CH372/CH375 USB device mode & external firmware
;by wch 2004.10, 2005.03
;$INCLUDE (reg52.h)
$INCLUDE (CH375INC.ASM)
STACK EQU 50H ;堆棧區(qū)棧頂(向上延伸)
;
; 需要主程序定義的參數(shù)
CH375_CMD_PORT EQU 0BDF1H ;CH375命令口的地址,地址譯碼后自動片選
CH375_DAT_PORT EQU 0BCF0H ;CH375命令口的地址,地址譯碼后自動片選
;
CH375_CON_ACT BIT P1.4
CMD_BUFFER DATA 38H ;命令包緩沖區(qū),本程序約定命令包長度為CONST_CMD_LEN
VAR_SETUP_REQUEST EQU 72H ;USB請求碼
VAR_SETUP_LENGTH EQU 73H ;后續(xù)數(shù)據(jù)長度
VAR_SETUP_DESCR EQU 74H ;描述符偏移地址
VAR_SN_STRING EQU 75H ;產(chǎn)品序列號字符串緩沖區(qū),ANSI字符串
VAR_USB_ADDRESS EQU 76H
; 定義位標志
CH375_CON_FLAG BIT 2FH.0 ;375芯片配置完成標志
;
;****************************************************************************
;主程序
ORG 0000H ;復位后單片機入口
LJMP START
ORG 0003H ;CH375中斷
LJMP CH375_INTER
START:
; 以下初始化指令不是必要的,將單片機恢復為默認狀態(tài)
CLR EA ;關(guān)中斷
MOV SP,#STACK ;置堆棧初值
MOV A,#0FFH
MOV P0,A
MOV P1,A ;清端口狀態(tài)
MOV P2,A
MOV P3,A
CLR A
MOV IE,A ;清中斷允許控制寄存器
MOV IP,A ;清中斷優(yōu)先級控制寄存器
MOV PSW,A ;清程序狀態(tài)字
MOV TCON,A ;清定時器/計數(shù)器控制寄存器
MOV TMOD,A ;清定時器/計數(shù)器工作方式寄存器
MOV PCON,A ;清電源控制寄存器
MOV R7,#0FFH
CALL DELAY_MS ;延時等待CH375初始化完成
; 初始化
CALL CH375_INIT ;初始化
setb EA
ljmp $ ;主程序
;
; 輸出命令碼給CH375
; 輸入: ACC 為命令碼
; 輸出: DPTR 為數(shù)據(jù)口
; USE: ACC, DPTR
WR_CMD_TO_375: MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOVX @DPTR,A ;設置USB工作模式
NOP ;如果時鐘頻率低于20MHz則無需該指令延時,高于30MHz要多加2條指令
MOV DPTR,#CH375_DAT_PORT ;數(shù)據(jù)口地址
RET
;
; 初始化子程序
; USE: ACC, R7, DPTR
CH375_INIT: MOV A,#CMD_SET_USB_MODE ;設置USB工作模式
CALL WR_CMD_TO_375 ;輸出命令碼
; MOV A,#02H ;設置為內(nèi)置固件模式
MOV A,#01H ;設置為外置固件模式
MOVX @DPTR,A ;設置為使用內(nèi)置固件的USB設備方式
NOP ;如果時鐘頻率低于16MHz則無需該指令延時
NOP
CH375_INIT_WT: MOVX A,@DPTR ;返回操作狀態(tài),也可以等待20uS
XRL A,#CMD_RET_SUCCESS
JNZ CH375_INIT_WT ;等待操作成功,通常需要等待10uS-20uS
; 下述三條指令用于啟用中斷
CLR IT0 ;置外部信號為低電平觸發(fā)
SETB PX0 ;置高優(yōu)先級
CLR IE0 ;清中斷標志
SETB EX0 ;允許CH375中斷
RET
;**************************************************************************************
CH375_EP2_DOWN: MOV A,#CMD_RD_USB_DATA ;將下傳的數(shù)據(jù)讀出,釋放端點
CALL WR_CMD_TO_375 ;讀命令發(fā)向CH375
MOVX A,@DPTR ;取出后續(xù)數(shù)據(jù)長度
MOV R4,A ;保存長度
JZ CH375_EP2_UP ;長度為0返回
MOV R5,A
MOV R0,#CMD_BUFFER ;緩沖區(qū)首地址送R0
CH375_EP2_LOOP: MOVX A,@DPTR
MOV @R0,A
INC R0
DJNZ R5,CH375_EP2_LOOP
; 演示回傳
CH375_EP2_UP: MOV A,#CMD_WR_USB_DATA7 ;演示回傳數(shù)據(jù)
CALL WR_CMD_TO_375
MOV A,R4
MOVX @DPTR,A
JZ CH375_EP2_UP_RET ;長度為0
MOV R0,#CMD_BUFFER ;緩沖區(qū)首地址送R0
CH375_EP2_UP_LOOP: MOV A,@R0
MOVX @DPTR,A
INC R0
DJNZ R4,CH375_EP2_UP_LOOP
CH375_EP2_UP_RET: RET
;***************************************************************************************
; 中斷服務子程序
; USE: 堆棧6字節(jié), 工作寄存器組1的R0,R5,R6,R7
CH375_INTER: PUSH PSW ;現(xiàn)場保護
PUSH ACC
PUSH DPL
PUSH DPH
SETB RS0 ;PSW.3,切換至工作寄存器組1
MOV A,#CMD_GET_STATUS
CALL WR_CMD_TO_375 ;獲取中斷狀態(tài)并取消中斷請求
MOVX A,@DPTR ;返回操作狀態(tài)
ANL A,#0FH ;屏蔽高4位
CLR IE0 ;清中斷標志,對應于INT0中斷
;根據(jù)中斷狀態(tài)進行分析處理
CJNE A,#USB_INT_EP2_OUT,CH375_INT_06 ;批量端點下傳成功
LCALL CH375_EP2_DOWN ;接收下傳的數(shù)據(jù)
LJMP CH375_INT_RET ; USB批量數(shù)據(jù)接收成功
CH375_INT_06: CJNE A,#USB_INT_EP2_IN,CH375_INT_07 ;批量端點上傳成功
;USB批量數(shù)據(jù)發(fā)送成功
LJMP CH375_INT_ULOCK ;解鎖后中斷返回
CH375_INT_07:
CJNE A,#USB_INT_EP0_SETUP,CH375_INT_01
LJMP CH375_SETUP_OK ;USB控制傳輸建立事務
CH375_INT_01: CJNE A,#USB_INT_EP0_OUT,CH375_INT_02
LJMP CH375_INT_ULOCK ;端點0下傳,解鎖后中斷返回
CH375_INT_02: CJNE A,#USB_INT_EP0_IN,CH375_INT_03
;端點0數(shù)據(jù)上傳
MOV A,VAR_SETUP_REQUEST
CJNE A,#DEF_USB_GET_DESCR,CH375_EP0_IN_01
;描述符上傳
LCALL CH375_DES_UPLOAD ;調(diào)用描述符上傳
LJMP CH375_INT_ULOCK ;解鎖后中斷返回
CH375_EP0_IN_01: CJNE A,#DEF_USB_SET_ADDRESS,CH375_EP0_IN_02
MOV A,#CMD_SET_USB_ADDR ;設置地址,以便下一次事務用新的地址
CALL WR_CMD_TO_375
MOV A,VAR_USB_ADDRESS ;取出地址
MOVX @DPTR,A
LJMP CH375_INT_ULOCK
CH375_EP0_IN_02: LJMP CH375_INT_ULOCK ;解鎖后中斷返回
CH375_INT_03: CJNE A,#USB_INT_EP1_IN,CH375_INT_04
;端點1數(shù)據(jù)上傳,請在此加上處理代碼
LJMP CH375_INT_ULOCK ;解鎖后中斷返回
CH375_INT_04: CJNE A,#USB_INT_EP1_OUT,CH375_INT_05
;端點1數(shù)據(jù)下傳
MOV A,#CMD_RD_USB_DATA ;將下傳的數(shù)據(jù)讀出,釋放端點
CALL WR_CMD_TO_375 ;讀命令發(fā)向CH375
MOVX A,@DPTR ;
JZ CH375_INT_RET ;長度為0返回
MOV R5,A
CH375_USB_OUT1_LOOP: MOVX A,@DPTR ;讀出數(shù)據(jù)釋放緩沖區(qū)
NOP ;保存到緩沖區(qū)中
DJNZ R5,CH375_USB_OUT1_LOOP ;數(shù)據(jù)未讀完繼續(xù)
LJMP CH375_INT_RET ;中斷返回
CH375_INT_05: ANL A,#03H
CJNE A,#03H,CH375_INT_09
LJMP CH375_USB_REST ;跳轉(zhuǎn)到USB復位
CH375_INT_09: SJMP CH375_INT_ULOCK ;命令不支持錯誤返回
CH375_INT_ULOCK: ;解鎖后中斷返回
MOV A,#CMD_UNLOCK_USB ;解鎖端點
CALL WR_CMD_TO_375
CH375_INT_RET: POP DPH
POP DPL
POP ACC
POP PSW ;恢復寄存器
RETI
CH375_USB_REST: ;USB總線復位
SETB CH375_CON_ACT ;清配置值等,CH372 會自動清USB 地址和同步觸發(fā)標志
CLR CH375_CON_FLAG ;清單片機中各種標志
MOV VAR_SETUP_REQUEST,#0FFH
LJMP CH375_INT_ULOCK
;*****************************************************************************************
;***********************************USB SETUP***********************************************
CH375_SETUP_RET_ERR:
MOV A,#CMD_SET_ENDP3 ;設置端點1
CALL WR_CMD_TO_375
MOV A,#0FH ;設置狀態(tài)為STALL
MOVX @DPTR,A
LJMP CH375_INT_RET ;錯誤的控制傳輸
CH375_SETUP_RET:
LJMP CH375_INT_RET ;跳轉(zhuǎn)到中斷返回
CH375_SETUP_OK: MOV A,#CMD_RD_USB_DATA ;
CALL WR_CMD_TO_375 ;發(fā)出讀數(shù)據(jù)命令
MOVX A,@DPTR ;讀出長度
MOV R6,A
MOV R7,A ;長度放入R7
MOV R0,#CMD_BUFFER ;命令緩沖區(qū)首地址放入間接尋址
CH375_SETUP_REC_CMD: MOVX A,@DPTR ;讀出數(shù)據(jù)
MOV @R0,A ;數(shù)據(jù)放入命令緩沖區(qū)
INC R0
DJNZ R7,CH375_SETUP_REC_CMD ;長度不為0繼續(xù)
CJNE R6,#8H,CH375_INT_RET ;長度不為8跳出不與理睬
MOV R0,#CMD_BUFFER
MOV A,CMD_BUFFER+6 ;取出控制傳輸?shù)拈L度
ANL A,#7FH ;長度不超過128個
MOV VAR_SETUP_LENGTH,A ;存儲長度
MOV A,CMD_BUFFER ;判斷USB請求
JB ACC.6,CH375_USB_REQ_FACT ;USB廠商請求
JB ACC.5,CH375_USB_REQ_CLASS ;跳轉(zhuǎn)到USB類請求
ANL A,#0E0H
CJNE A,#80H,CH375_REQUEST_OTHER1
LJMP CH375_REQUEST_STANDTRAD ;USB標準請求
CH375_REQUEST_OTHER1: CJNE A,#00H,CH375_REQUEST_OTHER
LJMP CH375_REQUEST_STANDTRAD ;USB標準請求
CH375_REQUEST_OTHER: LJMP CH375_SETUP_RET_ERR ;其余命令不支持
CH375_USB_REQ_FACT: LJMP CH375_SETUP_RET ;廠商請求
CH375_USB_REQ_CLASS: LJMP CH375_SETUP_RET ;
;***************************************************************************************
;******************************USB STANDTRAD REQUEST STAR **************************
;*************************************************************************************
;SELECT REQUEST
CH375_REQUEST_STANDTRAD: MOV A,CMD_BUFFER+1 ;USB標準請求
MOV VAR_SETUP_REQUEST,A ;保存請求
CJNE A,#DEF_USB_GET_STATUS,CH375_REQ_SEL_01
LJMP CH375_USB_GET_STATUS
CH375_REQ_SEL_01:
CJNE A,#DEF_USB_CLR_FEATURE,CH375_REQ_SEL_02
LJMP CH375_USB_CLR_FEATURE
CH375_REQ_SEL_02:
CJNE A,#DEF_USB_SET_ADDRESS,CH375_REQ_SEL_03
LJMP CH375_USB_SET_ADDRES
CH375_REQ_SEL_03:
CJNE A,#DEF_USB_GET_DESCR,CH375_REQ_SEL_04 ;
LJMP CH375_USB_GET_DESCR
CH375_REQ_SEL_04:
CJNE A,#DEF_USB_GET_CONFIG,CH375_REQ_SEL_05
LJMP CH375_USB_GET_CONFIG
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -