?? ch375blk.asm
字號:
; NOP ;如果時鐘頻率低于16MHz則無需該指令延時
; MOV DPTR,#CH375_DAT_PORT ;數(shù)據(jù)口地址
; MOV A,#USB_VENDOR_ID_L
; MOVX @DPTR,A ;寫入廠商ID的低字節(jié)
; MOV A,#USB_VENDOR_ID_H
; MOVX @DPTR,A ;寫入廠商ID的高字節(jié)
; MOV A,#USB_DEVICE_ID_L
; MOVX @DPTR,A ;寫入設(shè)備ID的低字節(jié)
; MOV A,#USB_DEVICE_ID_H
; MOVX @DPTR,A ;寫入設(shè)備ID的高字節(jié)
; NOP
; 設(shè)置USB工作模式
MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOV A,#CMD_SET_USB_MODE
MOVX @DPTR,A ;設(shè)置USB工作模式
NOP ;如果時鐘頻率低于16MHz則無需該指令延時
MOV DPTR,#CH375_DAT_PORT ;數(shù)據(jù)口地址
MOV A,#02H
MOVX @DPTR,A ;設(shè)置為使用內(nèi)置固件的USB設(shè)備方式
NOP ;如果時鐘頻率低于16MHz則無需該指令延時
CH375_INIT_WT: MOVX A,@DPTR ;返回操作狀態(tài)
XRL A,#CMD_RET_SUCCESS
JNZ CH375_INIT_WT ;等待操作成功,通常需要等待10uS-20uS
; 下述三條指令用于啟用中斷
CLR IT0 ;置外部信號為低電平觸發(fā)
SETB PX0 ;置高優(yōu)先級
CLR IE0 ;清中斷標(biāo)志
SETB EX0 ;允許CH375中斷
RET
;
; 上傳數(shù)據(jù)塊子程序(通過批量端點上傳)
; ENTRY: R0 指向存放了準(zhǔn)備上傳數(shù)據(jù)的緩沖區(qū), R7 準(zhǔn)備上傳的數(shù)據(jù)長度, 有效數(shù)值是0到64
; USE: ACC, R0, R7, DPTR
CH375_UPLOAD: JB FLAG_SEND_WAIT,CH375_UPLOAD ;如果正在等待發(fā)送(前次發(fā)送尚未完成)則繼續(xù)等待
CLR EX0 ;為了防止中途被中斷而亂了順序,必須先禁止中斷
MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOV A,#CMD_WR_USB_DATA7
MOVX @DPTR,A ;向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊
NOP ;如果時鐘頻率低于16MHz則無需該指令延時
MOV DPTR,#CH375_DAT_PORT ;數(shù)據(jù)口地址
MOV A,R7
MOVX @DPTR,A ;首先寫入后續(xù)數(shù)據(jù)長度
CH375_UPLOAD_1: MOV A,@R0
INC R0
MOVX @DPTR,A ;發(fā)送數(shù)據(jù)
DJNZ R7,CH375_UPLOAD_1 ;繼續(xù)發(fā)送數(shù)據(jù)直至結(jié)束
SETB FLAG_SEND_WAIT ;置等待發(fā)送標(biāo)志
SETB EX0 ;允許中斷
RET
;
; 上傳中斷數(shù)據(jù)子程序(通過中斷端點上傳),可選子程序
; ENTRY: R0 指向存放了準(zhǔn)備上傳數(shù)據(jù)的緩沖區(qū), R7 準(zhǔn)備上傳的數(shù)據(jù)長度, 有效數(shù)值是0到8
; USE: ACC, R0, R7, DPTR
CH375_UP_INT: CLR EX0 ;為了防止中途被中斷而亂了順序,必須先禁止中斷
MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOV A,#CMD_WR_USB_DATA5
MOVX @DPTR,A ;向USB端點1的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊
NOP ;如果時鐘頻率低于16MHz則無需該指令延時
MOV DPTR,#CH375_DAT_PORT ;數(shù)據(jù)口地址
MOV A,R7
MOVX @DPTR,A ;首先寫入后續(xù)數(shù)據(jù)長度
CH375_UP_INT_1: MOV A,@R0
INC R0
MOVX @DPTR,A ;發(fā)送中斷數(shù)據(jù)
DJNZ R7,CH375_UP_INT_1 ;繼續(xù)發(fā)送數(shù)據(jù)直至結(jié)束
SETB EX0 ;允許中斷
RET
;
; 中斷服務(wù)子程序
; USE: 堆棧8字節(jié)
CH375_INTER: PUSH PSW ;現(xiàn)場保護(hù)
PUSH ACC
PUSH DPL
PUSH DPH
; PUSH 01H ;R1
; PUSH 02H ;R2
;主程序中未使用R1/R2,所以不必入棧保護(hù),從而提高速度
MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOV A,#CMD_GET_STATUS
MOVX @DPTR,A ;獲取中斷狀態(tài)并取消中斷請求
NOP ;如果時鐘頻率低于16MHz則無需該指令延時,高于30MHz要多加2條指令
NOP
; 單片機(jī)向?qū)慍H375寫入命令碼后,應(yīng)該要等2uS才能讀取數(shù)據(jù),所以時鐘頻率高于16MHz時需要指令延時
MOV DPTR,#CH375_DAT_PORT ;數(shù)據(jù)口地址
MOVX A,@DPTR ;返回操作狀態(tài)
CLR IE0 ;清中斷標(biāo)志,對應(yīng)于INT0中斷
CJNE A,#USB_INT_EP2_OUT,CH375_INT_1 ;批量端點下傳成功
LJMP CH375_DOWN_OK ; USB批量數(shù)據(jù)接收成功
CH375_INT_1: CJNE A,#USB_INT_EP2_IN,CH375_INT_2 ;批量端點上傳成功
LJMP CH375_UP_OK ; USB批量數(shù)據(jù)發(fā)送成功
CH375_INT_2: CJNE A,#USB_INT_EP1_IN,CH375_INT_3 ;中斷端點
LJMP CH375_UP_INT_OK ; USB中斷數(shù)據(jù)發(fā)送成功
CH375_INT_3: SJMP CH375_INT_RET
CH375_INT_RET:
; POP 02H ;R2
; POP 01H ;R1
POP DPH
POP DPL
POP ACC
POP PSW ;恢復(fù)寄存器
RETI ;中斷返回
;
CH375_DOWN_OK: ; USB批量數(shù)據(jù)接收成功
MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOV A,#CMD_RD_USB_DATA
MOVX @DPTR,A ;從當(dāng)前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū)
NOP ;如果時鐘頻率低于16MHz則無需該指令延時,高于30MHz要多加一條指令
NOP
; 單片機(jī)向?qū)慍H375寫入命令碼后,應(yīng)該要等2uS才能讀取數(shù)據(jù),所以時鐘頻率高于16MHz時需要指令延時
MOV DPTR,#CH375_DAT_PORT ;數(shù)據(jù)口地址
MOVX A,@DPTR ;首先讀取后續(xù)數(shù)據(jù)長度
MOV R2,A
JZ CH375_INT_RET ;長度為0,沒有數(shù)據(jù)則直接退出
MOVX A,@DPTR ;接收數(shù)據(jù)
MOV THIS_CMD_CODE,A ;保存當(dāng)前命令碼
CJNE A,#TEST_DOWNLOAD,IS_USB_CMD0
SJMP USB_CMD2_NEXT ;測試下傳速度
USB_CMD2_RECV: MOVX A,@DPTR ;接收數(shù)據(jù),為了測試速度,數(shù)據(jù)舍棄,24MHz的MCS51每讀取一個字節(jié)需要2uS
USB_CMD2_NEXT: DJNZ R2,USB_CMD2_RECV ;繼續(xù)接收數(shù)據(jù)直至結(jié)束
SJMP CH375_INT_RET
IS_USB_CMD0: MOV R1,#RECV_BUFFER ;接收緩沖區(qū)
MOV RECV_LEN,R2
SJMP CH375_INT_RECV0
CH375_INT_RECV: MOVX A,@DPTR ;接收數(shù)據(jù)
CH375_INT_RECV0: MOV @R1,A
INC R1
DJNZ R2,CH375_INT_RECV ;繼續(xù)接收數(shù)據(jù)直至結(jié)束
MOV A,RECV_BUFFER ;首字節(jié)是命令碼
CJNE A,#TEST_UPLOAD,IS_USB_CMD3
USB_CMD3_NEXT: ;測試上傳速度
MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOV A,#CMD_WR_USB_DATA7
MOVX @DPTR,A ;向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊
NOP ;如果時鐘頻率低于16MHz則無需該指令延時
MOV DPTR,#CH375_DAT_PORT ;數(shù)據(jù)口地址
MOV A,#40H
MOVX @DPTR,A ;首先寫入后續(xù)數(shù)據(jù)長度
MOV R7,A
MOV A,TL0 ;隨機(jī)數(shù)
USB_CMD3_SEND: MOVX @DPTR,A ;發(fā)送數(shù)據(jù),為了測試速度,數(shù)據(jù)無效,24MHz的MCS51每寫出一個字節(jié)需要2uS
DJNZ R7,USB_CMD3_SEND ;繼續(xù)發(fā)送數(shù)據(jù)直至結(jié)束
SJMP CH375_INT_UNLK
IS_USB_CMD3: CJNE A,#TEST_START,IS_USB_CMD1
NOP ;測試過程開始
; 由于上一次測試數(shù)據(jù)上傳速度時可能在上傳緩沖區(qū)中遺留有數(shù)據(jù), 所以在第二次測試前需要清除上傳緩沖區(qū)
MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOV A,#CMD_SET_ENDP7
MOVX @DPTR,A ;設(shè)置USB端點2的IN
NOP ;如果時鐘頻率低于16MHz則無需該指令延時
MOV DPTR,#CH375_DAT_PORT ;數(shù)據(jù)口地址
MOV A,#0EH ;同步觸發(fā)位不變
MOVX @DPTR,A ;設(shè)置USB端點2的IN正忙,返回NAK
CLR FLAG_SEND_WAIT ;清除發(fā)送等待標(biāo)志,通知應(yīng)用程序可以繼續(xù)發(fā)送數(shù)據(jù)
LJMP CH375_INT_RET
IS_USB_CMD1: CJNE A,#TEST_DATA,IS_USB_CMD9
NOP ;測試數(shù)據(jù)正確性
MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOV A,#CMD_WR_USB_DATA7
MOVX @DPTR,A ;向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊
NOP ;如果時鐘頻率低于16MHz則無需該指令延時
MOV DPTR,#CH375_DAT_PORT ;數(shù)據(jù)口地址
MOV A,RECV_LEN
MOVX @DPTR,A ;首先寫入后續(xù)數(shù)據(jù)長度
MOV R2,A ;剛接收到的數(shù)據(jù)長度
MOV R1,#RECV_BUFFER ;剛接收到的數(shù)據(jù)塊
USB_CMD1_NEXT: MOV A,@R1
CPL A ;數(shù)據(jù)取反后返回,由計算機(jī)應(yīng)用程序測試數(shù)據(jù)是否正確
MOVX @DPTR,A ;發(fā)送數(shù)據(jù)
INC R1
DJNZ R2,USB_CMD1_NEXT
LJMP CH375_INT_RET
IS_USB_CMD9: SETB FLAG_RECV_OK ;其它命令,設(shè)置接收成功標(biāo)志,通知應(yīng)用程序取走數(shù)據(jù)再分析
LJMP CH375_INT_RET
;
CH375_UP_OK: ; USB批量數(shù)據(jù)發(fā)送成功
MOV A,THIS_CMD_CODE
CJNE A,#TEST_UPLOAD,CH375_INT_UNLK
SJMP USB_CMD3_NEXT ;測試上傳速度,繼續(xù)準(zhǔn)備上傳數(shù)據(jù)
CH375_INT_UNLK: MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOV A,#CMD_UNLOCK_USB
MOVX @DPTR,A ;釋放當(dāng)前USB緩沖區(qū)
CLR FLAG_SEND_WAIT ;清除發(fā)送等待標(biāo)志,通知應(yīng)用程序可以繼續(xù)發(fā)送數(shù)據(jù)
LJMP CH375_INT_RET
;
CH375_UP_INT_OK: ; USB中斷數(shù)據(jù)發(fā)送成功
MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOV A,#CMD_UNLOCK_USB
MOVX @DPTR,A ;釋放當(dāng)前USB緩沖區(qū)
LJMP CH375_INT_RET
;
;
END
;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -