請大家?guī)兔纯闯绦蛴惺裁磫栴}吧!

現(xiàn)在的問題是單片機通過中斷能接收到上位機傳來的數(shù)據(jù),但取反后送回給上位機,就看不到數(shù)據(jù)了,并且不能產(chǎn)生上傳成功的中斷了。我把主要的程序?qū)懗鰜恚ㄊ怯脜R編編的),大部分都是參考沁恒的程序: CH375_CMD_PORT EQU 0100H ;CH375命令口的地址,地址譯碼后自動片選 CH375_DAT_PORT EQU 0000H ;CH375命令口的地址,地址譯碼后自動片選 ;中斷服務(wù)子程序: CH375_INTER: PUSH PSW ;現(xiàn)場保護 PUSH ACC PUSH DPL PUSH DPH PUSH 01H ;R1 PUSH 02H ;R2 MOV DPTR,#CH375_CMD_PORT ;命令口地址 MOV A,#CMD_GET_STATUS MOVX @DPTR,A ;獲取中斷狀態(tài)并取消中斷請求 NOP ;如果時鐘頻率低于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ù)接收成功,USB端點2的OUT CH375_INT_1: CJNE A,#USB_INT_EP2_IN,CH375_INT_2 ;批量端點上傳成功 LJMP CH375_UP_OK ;USB批量數(shù)據(jù)發(fā)送成功,USB端點2的IN CH375_INT_2: CJNE A,#USB_INT_EP1_IN,CH375_INT_3 ;中斷端點 LJMP CH375_UP_INT_OK ;USB中斷數(shù)據(jù)發(fā)送成功,USB端點1的IN 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 ; USB批量數(shù)據(jù)接收成功 CH375_DOWN_OK: MOV DPTR,#CH375_CMD_PORT ;命令口地址 MOV A,#CMD_RD_USB_DATA MOVX @DPTR,A ;從當(dāng)前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) NOP ;如果時鐘頻率低于16MHz則無需該指令延時 MOV DPTR,#CH375_DAT_PORT ;數(shù)據(jù)口地址 MOVX A,@DPTR ;首先讀取后續(xù)數(shù)據(jù)長度 MOV R2,A JZ CH375_INT_RET ;長度為0,沒有數(shù)據(jù)則直接退出 MOV RECV_LEN,A MOV R1,#RECV_BUFFER ;接收緩沖區(qū) CH375_INT_RECV: MOVX A,@DPTR ;接收數(shù)據(jù) MOV @R1,A INC R1 DJNZ R2,CH375_INT_RECV ;繼續(xù)接收數(shù)據(jù)直至結(jié)束 CALL PROCESS LJMP CH375_INT_RET ; USB批量數(shù)據(jù)發(fā)送成功 CH375_UP_OK: NOP 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ā)送完成 LJMP CH375_INT_RET ; USB中斷數(shù)據(jù)發(fā)送成功 CH375_UP_INT_OK: MOV DPTR,#CH375_CMD_PORT ;命令口地址 MOV A,#CMD_UNLOCK_USB MOVX @DPTR,A ;釋放當(dāng)前USB緩沖區(qū) CLR FLAG_INT_WAIT ;中斷數(shù)據(jù)已經(jīng)被發(fā)送完成 LJMP CH375_INT_RET

;將從主機接收到的數(shù)據(jù)依次取反送回給主機 PROCESS: MOV R2,RECV_LEN MOV R1,#RECV_BUFFER QUFAN: MOV A,@R1 CPL A MOV @R1,A INC R1 DJNZ R2,QUFAN MOV R7,RECV_LEN MOV R0,#RECV_BUFFER CALL CH375_UPLOAD 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

因為我沒有用譯碼電路,所以直接用兩個端口控制CH372,分別是A15接CS,A8接CH372的A0,所以數(shù)據(jù)地址和命令地址就是上面那樣,應(yīng)該沒什么問題吧?

我用貴公司的調(diào)試程序調(diào)通了,可以接收到返回的數(shù)據(jù)了,看來是上位機程序與下位機之間的協(xié)調(diào)問題。


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频