程序見(jiàn)附件,插上pc后沒(méi)有反應(yīng),3.3v的系統(tǒng),單片機(jī)是pic,16f77的8m晶振,單從程序上看有沒(méi)有問(wèn)題?請(qǐng)各位指點(diǎn)一二
有沒(méi)有正常啟動(dòng)CH372的USB模式?。?/p>
;CH372測(cè)試程序 include "p16f77.inc"
W EQU H'00' F EQU H'01'
GET_STA EQU 0X20 ;收到的中斷狀態(tài) W_TEMP EQU 0X21 STATUS_TEMP EQU 0X22 PCLATH_TEMP EQU 0X23 SYS_SIGNAL EQU 0X24 ;SYS_SIGNAL 系統(tǒng)信號(hào)量 ;bit0 endpoint1的in事務(wù) 0 未鎖定 程序可以更新相應(yīng)寄存器中的數(shù)據(jù) ; 1 已鎖定 程序不能更新相應(yīng)寄存器中的數(shù)據(jù) ;bit1 endpoint2的in事務(wù) ; 0 未鎖定 程序可以更新相應(yīng)寄存器中的數(shù)據(jù) ; 1 已鎖定 程序不能更新相應(yīng)寄存器中的數(shù)據(jù) ;bit2 endpoint2的out事務(wù) 0 未更新 映射寄存器中的相應(yīng)數(shù)據(jù)未被更新 ; 1 已更新 映射寄存器中的相應(yīng)數(shù)據(jù)已被更新
EP2_OUT_COUNT EQU 0X60 EP2_OUT_DATA0 EQU 0X61
EP2_IN_COUNT EQU 0X70 EP2_IN_DATA0 EQU 0X71
;CH372指令定義 #define RESET_ALL 0X05 #define CHECK_EXIST 0X06 #define SET_USB_ID 0X12 #define SET_USB_MODE 0X15 #define GET_STATUS 0X22 #define UNLOCK_USB 0X23 #define RD_USB_DATA 0X28 #define WR_USB_DATA5 0X2A #define WR_USB_DATA7 0X2B
;操作狀態(tài)定義 #define CMD_SET_SUCCESS 0X51 #define CMD_RET_ABORT 0X5F
;控制線定義 #define PSP_CMD PORTB,2 ;OUT #define PSP_INT PORTB,4 ;IN #define PSP_WR PORTE,1 ;OUT #define PSP_RD PORTE,0 ;OUT #define PSP_TRIS TRISD
;********************************************************************* ;中斷保護(hù)進(jìn)棧 PUSH MACRO ;進(jìn)棧宏指令 MOVWF W_TEMP ;復(fù)制W至TEMP寄存器,可以是任意寄存器組 SWAPF STATUS,W ;SWAPF不影響Z CLRF STATUS MOVWF STATUS_TEMP ;保存STATUS至STATUS_TEMP寄存器. MOVF PCLATH,W ; MOVWF PCLATH_TEMP ; CLRF PCLATH ; ENDM ; ;********************************************************************* ;中斷保護(hù)出棧 POP MACRO ;出棧宏指令 MOVF PCLATH_TEMP,W ; MOVWF PCLATH ; SWAPF STATUS_TEMP,W ; MOVWF STATUS ;移W至STATUS寄存器中 SWAPF W_TEMP,F ;對(duì)換W_TEMP SWAPF W_TEMP,W ;對(duì)換W_TEMP至W中 ENDM ;
ORG 0X0000 NOP RESET_A GOTO START ORG 0X0004 NOP PUSH GOTO INT_SERVE ORG 0X0020 START ;初始化部分() BANKSEL INTCON BCF INTCON,GIE CLRF SYS_SIGNAL BANKSEL TRISA BCF TRISB,2 BSF TRISB,4 BCF TRISE,0 BCF TRISE,1 BANKSEL PORTA BSF PSP_WR BSF PSP_RD
;初始化usart ;初始化RB口電平變化 BSF PORTB,4 BANKSEL INTCON BCF INTCON,RBIF BSF INTCON,RBIE BCF INTCON,RBIF BSF INTCON,GIE NOP NOP ;上電后系統(tǒng)usb復(fù)位 MOVLW RESET_ALL CALL SEND_CMD CALL DELAY_40MS ;作一個(gè)40ms的延時(shí) ;設(shè)置廠商id “OSUN” MOVLW SET_USB_ID CALL SEND_CMD CALL DELAY_CD MOVLW 'S' CALL SEND_DATA CALL DELAY_DD MOVLW 'O' CALL SEND_DATA CALL DELAY_DD MOVLW 'N' CALL SEND_DATA CALL DELAY_DD MOVLW 'U' CALL SEND_DATA CALL DELAY_DD ;設(shè)置usb工作模式 MOVLW SET_USB_MODE CALL SEND_CMD CALL DELAY_CD MOVLW 0X02 CALL SEND_DATA ;-------------------------------- ; 正常工作 ;-------------------------------- ; GOTO $
;________________________________ ;測(cè)試程序 ;僅測(cè)試endpoint2的in和out事務(wù) ;________________________________ LOOP_WORK BANKSEL SYS_SIGNAL BTFSC SYS_SIGNAL,2 ;判斷endpoint2的out事務(wù)的相應(yīng)寄存器是否已被更新 ;但數(shù)據(jù)并未被讀出,需要程序?qū)⑵渥x出 CALL DEAL_EP2_OUT ;對(duì)新到的數(shù)據(jù)取反,同時(shí)將SYS_SIGNAL的bit2清零 BANKSEL SYS_SIGNAL BTFSS SYS_SIGNAL,1 ;判斷endpoint2的in事務(wù)的相應(yīng)寄存器是否已被鎖定, CALL DEAL_EP2_IN ;更新相應(yīng)寄存器的數(shù)據(jù),執(zhí)行endpoint2的in事務(wù),同時(shí)將SYS_SIGNAL中的bit1置位 ;所有的事務(wù)完成后,延時(shí)一段時(shí)間 ;對(duì)所有的事務(wù)信號(hào)量進(jìn)行測(cè)試 ;從而判斷是否有死進(jìn)程 ;有,則復(fù)位 ;無(wú),則跳轉(zhuǎn),循環(huán)執(zhí)行 ;不必對(duì)out事務(wù)進(jìn)行測(cè)試 ; CALL DELAY_CHECK ; BANKSEL SYS_SIGNAL ; BTFSC SYS_SIGNAL,1 ; GOTO RESET_A GOTO LOOP_WORK DEAL_EP2_OUT MOVLW RD_USB_DATA CALL SEND_CMD CALL DELAY_CD CALL READ_DATA MOVWF EP2_OUT_COUNT CALL DELAY_DD CALL READ_DATA MOVWF EP2_OUT_DATA0 COMF EP2_OUT_DATA0,W MOVWF EP2_IN_DATA0 MOVLW UNLOCK_USB CALL SEND_CMD BCF SYS_SIGNAL,2 RETURN DEAL_EP2_IN MOVLW WR_USB_DATA7 CALL SEND_CMD CALL DELAY_CD MOVLW 0X01 CALL SEND_DATA CALL DELAY_DD MOVF EP2_IN_DATA0,W CALL SEND_DATA BSF SYS_SIGNAL,1 RETURN
;________________________________ ; 中斷處理程序 ;所有的中斷服務(wù)程序最后完成后要跳轉(zhuǎn)到END_INT, ;恢復(fù)堆棧后再退出中斷 ;________________________________ INT_SERVE BANKSEL INTCON BTFSC INTCON,RBIF GOTO USB_INT ;添加其他中斷服務(wù)程序 GOTO END_INT USB_INT BANKSEL PORTB BTFSC PSP_INT GOTO END_USB_INT_SERVE MOVLW GET_STATUS CALL SEND_CMD ;命令碼和數(shù)據(jù)之間要有2.5us的間隔 ;延時(shí)3.5us NOP NOP NOP NOP NOP NOP NOP CALL READ_DATA MOVWF GET_STA MOVLW 0X09 XORWF GET_STA,W BTFSC STATUS,Z GOTO ENDPOINT1_IN MOVLW 0X02 XORWF GET_STA,W BTFSC STATUS,Z GOTO ENDPOINT2_OUT MOVLW 0X0A XORWF GET_STA,W BTFSC STATUS,Z GOTO ENDPOINT2_IN GOTO END_USB_INT_SERVE ;ENDPOINT1的IN事務(wù)成功 ENDPOINT1_IN ;添加ENDPOINT1的IN服務(wù)代碼 ;添加ENDPOINT1的IN服務(wù)代碼 GOTO END_USB_INT_SERVE ;ENDPOINT2的OUT事務(wù)成功 ENDPOINT2_OUT ;添加ENDPOINT2的OUT服務(wù)代碼 BANKSEL SYS_SIGNAL BSF SYS_SIGNAL,2 ;添加ENDPOINT2的OUT服務(wù)代碼 GOTO END_USB_INT_SERVE ;ENDPOINT2的IN事務(wù)成功 ENDPOINT2_IN ;添加ENDPOINT2的IN服務(wù)代碼 BANKSEL SYS_SIGNAL BCF SYS_SIGNAL,1 ;添加ENDPOINT2的IN服務(wù)代碼 GOTO END_USB_INT_SERVE ;結(jié)束usb中斷服務(wù)程序 END_USB_INT_SERVE BANKSEL INTCON BCF INTCON,RBIF GOTO END_INT
;結(jié)束INT中斷服務(wù)程序,退出 END_INT POP RETFIE
;________________________________ ; 用到的子程序 ;________________________________
;利用w傳遞變量 SEND_CMD BANKSEL PSP_TRIS CLRF PSP_TRIS BANKSEL PORTD BSF PSP_CMD MOVWF PORTD BCF PSP_WR NOP BSF PSP_WR RETURN ;利用w傳遞變量 SEND_DATA BANKSEL PSP_TRIS CLRF PSP_TRIS BANKSEL PORTD BCF PSP_CMD MOVWF PORTD BCF PSP_RD NOP BSF PSP_RD RETURN ;利用w傳遞變量 READ_DATA BANKSEL PSP_TRIS MOVLW 0XFF MOVWF PSP_TRIS BANKSEL PORTD BCF PSP_CMD BCF PSP_RD MOVF PORTD,W BSF PSP_RD RETURN
;命令和數(shù)據(jù)之間的延時(shí) ;此延時(shí)要大于2.5us DELAY_CD NOP RETURN
;數(shù)據(jù)和數(shù)據(jù)之間的延時(shí) ;此延時(shí)要大于1.5us DELAY_DD NOP RETURN
;延時(shí)40ms DELAY_40MS BANKSEL PIE1 BCF PIE1,TMR1IE BANKSEL PIR1 MOVLW 0XB1 MOVWF TMR1H MOVLW 0XDF MOVWF TMR1L MOVLW 0X01 MOVWF T1CON BCF PIR1,TMR1IF LOOP_CHECK BTFSS PIR1,TMR1IF GOTO LOOP_CHECK CLRF T1CON BCF PIR1,TMR1IF RETURN
END