?? ch375451.asm
字號:
; MOV R7,#0A0H ;160*256uS=40mS
;CH375_INIT_D2: CLR A
;CH375_INIT_D1: DJNZ ACC,CH375_INIT_D1 ;延時1uS
; DJNZ R7,CH375_INIT_D2 ;延時256uS
; SJMP CH375_INIT ;再次測試
;CH375_INIT_OK:
; 設置外部自定義的USB設備VID和PID,可選操作,不執行該命令則使用默認的VID和PID
; MOV DPTR,#CH375_CMD_PORT ;命令口地址
; MOV A,#CMD_SET_USB_ID
; MOVX @DPTR,A ;設置外部自定義的USB設備VID和PID,可選操作
; NOP ;如果時鐘頻率低于16MHz則無需該指令延時
; MOV DPTR,#CH375_DAT_PORT ;數據口地址
; MOV A,#USB_VENDOR_ID_L
; MOVX @DPTR,A ;寫入廠商ID的低字節
; MOV A,#USB_VENDOR_ID_H
; MOVX @DPTR,A ;寫入廠商ID的高字節
; MOV A,#USB_DEVICE_ID_L
; MOVX @DPTR,A ;寫入設備ID的低字節
; MOV A,#USB_DEVICE_ID_H
; MOVX @DPTR,A ;寫入設備ID的高字節
; NOP
; 設置USB工作模式
MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOV A,#CMD_SET_USB_MODE
MOVX @DPTR,A ;設置USB工作模式
NOP ;如果時鐘頻率低于16MHz則無需該指令延時
MOV DPTR,#CH375_DAT_PORT ;數據口地址
MOV A,#02H
MOVX @DPTR,A ;設置為使用內置固件的USB設備方式
NOP ;如果時鐘頻率低于16MHz則無需該指令延時
CH375_INIT_WT: MOVX A,@DPTR ;返回操作狀態
XRL A,#CMD_RET_SUCCESS
JNZ CH375_INIT_WT ;等待操作成功,通常需要等待10uS-20uS
; 下述三條指令用于啟用中斷
CLR IT0 ;置外部信號為低電平觸發
SETB PX0 ;置高優先級
CLR IE0 ;清中斷標志
SETB EX0 ;允許CH375中斷
RET
;
; 上傳數據塊子程序(通過批量端點上傳)
; ENTRY: R0 指向存放了準備上傳數據的緩沖區, R7 準備上傳的數據長度, 有效數值是0到64
; USE: ACC, R0, R7, DPTR
;CH375_UPLOAD: JB FLAG_SEND_WAIT,CH375_UPLOAD ;如果正在等待發送(前次發送尚未完成)則繼續等待
; CLR EX0 ;為了防止中途被中斷而亂了順序,必須先禁止中斷
; MOV DPTR,#CH375_CMD_PORT ;命令口地址
; MOV A,#CMD_WR_USB_DATA7
; MOVX @DPTR,A ;向USB端點2的發送緩沖區寫入數據塊
; NOP ;如果時鐘頻率低于16MHz則無需該指令延時
; MOV DPTR,#CH375_DAT_PORT ;數據口地址
; MOV A,R7
; MOVX @DPTR,A ;首先寫入后續數據長度
;CH375_UPLOAD_1: MOV A,@R0
; INC R0
; MOVX @DPTR,A ;發送數據
; DJNZ R7,CH375_UPLOAD_1 ;繼續發送數據直至結束
; SETB FLAG_SEND_WAIT ;置等待發送標志
; SETB EX0 ;允許中斷
; RET
;
; 上傳中斷數據子程序(通過中斷端點上傳),可選子程序
; 雖然每次可以上傳8個字節, 但是本程序中用于鍵盤中斷, 所以每次只需要傳輸兩個字節
; ENTRY: R0 中斷數據首字節, R7 中斷數據首字節
; USE: ACC, R0, R7, DPTR
CH375_UP_INT2: MOV A,#0FFH
CH375_UP_INT2W: JNB FLAG_INT_WAIT,CH375_UP_INT2G ;前次中斷數據已經被PC機取走則繼續
NOP ;等待發送中斷數據
NOP
NOP ;最多等待1毫秒,以24MHz時鐘計算
NOP
DJNZ ACC,CH375_UP_INT2W ;繼續等待,滿1毫秒后超時
; 如果未與計算機相連,或者計算機中的應用程序未運行,則會出現超時,否則不超過1毫秒中斷數據就應該被PC機取走
CH375_UP_INT2G: CLR EX0 ;為了防止中途被中斷而亂了順序,必須先禁止中斷
MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOV A,#CMD_WR_USB_DATA5
MOVX @DPTR,A ;向USB端點1的發送緩沖區寫入數據塊
NOP ;如果時鐘頻率低于16MHz則無需該指令延時
MOV DPTR,#CH375_DAT_PORT ;數據口地址
MOV A,#02H
MOVX @DPTR,A ;首先寫入后續數據長度
MOV A,R0
MOVX @DPTR,A ;發送中斷數據1
MOV A,R7
MOVX @DPTR,A ;發送中斷數據2
SETB FLAG_INT_WAIT ;置中斷等待標志
SETB EX0 ;允許中斷
RET
;
; 上傳中斷數據子程序(通過中斷端點上傳),可選子程序
; ENTRY: R0 指向存放了準備上傳數據的緩沖區, R7 準備上傳的數據長度, 有效數值是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的發送緩沖區寫入數據塊
; NOP ;如果時鐘頻率低于16MHz則無需該指令延時
; MOV DPTR,#CH375_DAT_PORT ;數據口地址
; MOV A,R7
; MOVX @DPTR,A ;首先寫入后續數據長度
;CH375_UP_INT_1: MOV A,@R0
; INC R0
; MOVX @DPTR,A ;發送中斷數據
; DJNZ R7,CH375_UP_INT_1 ;繼續發送數據直至結束
; SETB EX0 ;允許中斷
; RET
;
; 中斷服務子程序
; USE: 堆棧6字節, 工作寄存器組1的R0,R5,R6,R7
CH375_INTER: PUSH PSW ;現場保護
PUSH ACC
PUSH DPL
PUSH DPH
SETB RS0 ;PSW.3,切換至工作寄存器組1
MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOV A,#CMD_GET_STATUS
MOVX @DPTR,A ;獲取中斷狀態并取消中斷請求
NOP ;如果時鐘頻率低于16MHz則無需該指令延時,高于30MHz要多加2條指令
NOP
MOV DPTR,#CH375_DAT_PORT ;數據口地址
MOVX A,@DPTR ;返回操作狀態
CLR IE0 ;清中斷標志,對應于INT0中斷
CJNE A,#USB_INT_EP2_OUT,CH375_INT_1 ;批量端點下傳成功
LJMP CH375_DOWN_OK ; USB批量數據接收成功
CH375_INT_1: CJNE A,#USB_INT_EP2_IN,CH375_INT_2 ;批量端點上傳成功
LJMP CH375_UP_OK ; USB批量數據發送成功
CH375_INT_2: CJNE A,#USB_INT_EP1_IN,CH375_INT_3 ;中斷端點
LJMP CH375_UP_INT_OK ; USB中斷數據發送成功
CH375_INT_3: SJMP CH375_INT_RET
CH375_INT_RET: POP DPH
POP DPL
POP ACC
POP PSW ;恢復寄存器
RETI ;中斷返回
; USB批量數據接收成功
CH375_DOWN_OK: MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOV A,#CMD_RD_USB_DATA
MOVX @DPTR,A ;從當前USB中斷的端點緩沖區讀取數據塊,并釋放緩沖區
NOP ;如果時鐘頻率低于16MHz則無需該指令延時,高于30MHz要多加2條指令
NOP
MOV DPTR,#CH375_DAT_PORT ;數據口地址
MOVX A,@DPTR ;首先讀取后續數據長度
MOV R7,A
JZ CH375_INT_RET ;長度為0,沒有數據則直接退出,在某些應用中也可以將長度0定義為一種特殊命令
CJNE A,#CONST_CMD_LEN,CH375_INT_DOWN ;不是命令包
LJMP CH375_INT_CMD ;命令塊長度總是CONST_CMD_LEN
; 接收下傳的數據塊,每組數據的長度不超過64字節,例如總長度150個字節,則第1組和第2組各是64字節,第3組是剩余長度22字節
; 為了將數據塊與命令包區分開來,剩余長度不能等于CONST_CMD_LEN,可以用填充數據的辦法避免相同
CH375_INT_DOWN: LJMP CH375_INT_DN1 ;接收數據塊
; 分析通過USB接收到的命令塊,長度總是CONST_CMD_LEN,首字節為命令,其余為可選的參數
CH375_INT_CMD: MOV R0,#CMD_BUFFER ;命令包緩沖區
CH375_INT_CMD0: MOVX A,@DPTR ;接收命令包的數據
MOV @R0,A
INC R0
DJNZ R7,CH375_INT_CMD0 ;繼續接收命令包數據直至結束
; 分析通過USB接收到的命令塊,長度總是CONST_CMD_LEN,首字節為命令,其余為可選的參數
; 這種首字節為命令的結構是由單片機和計算機應用層之間自行定義的
MOV A,CMD_BUFFER ;取命令碼分析
CPL A
XRL A,CMD_BUFFER_NOT
JNZ CH375_INT_RET ;命令包反碼校驗錯誤
MOV A,CMD_BUFFER ;命令碼
CJNE A,#DEMO_UP_CLEAR,CH375_INT_CMD1
; 連續上傳數據塊之前進行同步,實際是讓單片機清除上傳緩沖區的已有內容
; 如果上一次進行數據上傳時,計算機提前結束上傳,那么有可能在上傳緩沖區中遺留有數據,所以在第二次上傳前需要清除上傳緩沖區
MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOV A,#CMD_SET_ENDP7
MOVX @DPTR,A ;設置USB端點2的IN,也就是批量上傳端點
NOP ;如果時鐘頻率低于16MHz則無需該指令延時
MOV DPTR,#CH375_DAT_PORT ;數據口地址
MOV A,#0EH ;同步觸發位不變
MOVX @DPTR,A ;設置USB端點2的IN正忙,返回NAK,也就是緩沖區中沒有數據
LJMP CH375_INT_RET
CH375_INT_CMD1: CJNE A,#DEMO_DOWN_DATA,CH375_INT_CMD2
; 連續下傳數據塊
; 假定事先約定, 該命令在第3字節和第4字節指定下面將下傳的數據應該存放在外部RAM的起始地址
MOV A,CMD_BUFFER_ADRL
MOV BUF_ADDR_L,A ;保存用于下傳的外部RAM緩沖區的地址
MOV A,CMD_BUFFER_ADRH
MOV BUF_ADDR_H,A
MOV A,CMD_BUFFER_LENL
MOV BUF_LEN_L,A ;假定事先約定第5和第6字節是將要下傳的數據長度
MOV A,CMD_BUFFER_LENH
MOV BUF_LEN_H,A
LJMP CH375_INT_RET
CH375_INT_CMD2: CJNE A,#DEMO_UP_DATA,CH375_INT_CMD3
; 連續上傳數據塊
; 假定事先約定, 該命令在第3字節和第4字節指定下面將上傳的數據應該來自外部RAM的起始地址
MOV A,CMD_BUFFER_ADRL
MOV BUF_ADDR_L,A ;保存用于上傳的外部RAM緩沖區的地址
MOV A,CMD_BUFFER_ADRH
MOV BUF_ADDR_H,A
MOV A,CMD_BUFFER_LENL
MOV BUF_LEN_L,A ;假定事先約定第5和第6字節是將要下傳的數據長度
MOV A,CMD_BUFFER_LENH
MOV BUF_LEN_H,A
; 數據上傳,準備第一組數據,每組數據的長度不超過64字節
CLR C
MOV A,BUF_LEN_L
SUBB A,#40H ;檢查剩余長度
MOV R5,A
MOV A,BUF_LEN_H
SUBB A,#00H
MOV R6,A
JC CH375_UP_SHORT ;剩余長度不足一個數據包的最大長度64
MOV R7,#40H
MOV BUF_LEN_L,R5
MOV BUF_LEN_H,R6
SJMP CH375_UP_FIRST
CH375_UP_SHORT: MOV R7,BUF_LEN_L
MOV BUF_LEN_L,#00H
MOV BUF_LEN_H,#00H
CH375_UP_FIRST: MOV DPTR,#CH375_CMD_PORT ;命令口地址
MOV A,#CMD_WR_USB_DATA7
MOVX @DPTR,A ;向USB端點2的發送緩沖區寫入數據塊
NOP ;如果時鐘頻率低于16MHz則無需該指令延時
MOV DPTR,#CH375_DAT_PORT ;數據口地址
MOV A,R7 ;每次最多上傳64個字節的數據
MOVX @DPTR,A ;首先寫入后續數據長度
; 下面是從MCS51單片機的內部RAM讀取數據并上傳,速度是外部RAM快3倍
MOV R0,BUF_ADDR_L ;由于演示板中沒有外部RAM,并且外部RAM的效率很低,所以用內部RAM示范
CH375_INT_UP0: MOV A,@R0 ;從內部RAM緩沖區取出準備上傳的數據
INC R0 ;在12MHz時鐘是這種方法每復制1字節大概需要6uS
MOVX @DPTR,A ;將數據寫入批量端點的發送緩沖區
DJNZ R7,CH375_INT_UP0 ;繼續寫入數據直至結束
LJMP CH375_INT_RET
; 下面從MCS51單片機的外部RAM讀取數據并上傳,如果采用較高時鐘并且具有雙DPTR的單片機則速度可以快些
;CH375_INT_UP0: MOV DPL,BUF_ADDR_L ;由于MCS51單片機讀取外部RAM的效率很低
; MOV DPH,BUF_ADDR_H ;所以在12MHz時鐘是這種方法每復制1字節大概需要18uS
; MOVX A,@DPTR ;從外部RAM緩沖區取出準備上傳的數據
; INC DPTR ;緩沖區地址增量
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -