第一次使用pic+372,请各位帮忙看个程序

程序见附件,插上pc后没有反应,3.3v的系统,单片机是pic,16f77的8m晶振,单从程序上看有没有问题?请各位指点一二

有没有正常启动CH372的USB模式啊.


;CH372测试程序 include "p16f77.inc"

W EQU H'00' F EQU H'01'

GET_STA EQU 0X20 ;收到的中断状态 W_TEMP EQU 0X21 STATUS_TEMP EQU 0X22 PCLATH_TEMP EQU 0X23 SYS_SIGNAL EQU 0X24 ;SYS_SIGNAL 系统信号量 ;bit0 endpoint1的in事务 0 未锁定 程序可以更新相应寄存器中的数据 ; 1 已锁定 程序不能更新相应寄存器中的数据 ;bit1 endpoint2的in事务 ; 0 未锁定 程序可以更新相应寄存器中的数据 ; 1 已锁定 程序不能更新相应寄存器中的数据 ;bit2 endpoint2的out事务 0 未更新 映射寄存器中的相应数据未被更新 ; 1 已更新 映射寄存器中的相应数据已被更新

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

;操作状态定义 #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

;********************************************************************* ;中断保护进栈 PUSH MACRO ;进栈宏指令 MOVWF W_TEMP ;复制W至TEMP寄存器,可以是任意寄存器组 SWAPF STATUS,W ;SWAPF不影响Z CLRF STATUS MOVWF STATUS_TEMP ;保存STATUS至STATUS_TEMP寄存器. MOVF PCLATH,W ; MOVWF PCLATH_TEMP ; CLRF PCLATH ; ENDM ; ;********************************************************************* ;中断保护出栈 POP MACRO ;出栈宏指令 MOVF PCLATH_TEMP,W ; MOVWF PCLATH ; SWAPF STATUS_TEMP,W ; MOVWF STATUS ;移W至STATUS寄存器中 SWAPF W_TEMP,F ;对换W_TEMP SWAPF W_TEMP,W ;对换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 ;上电后系统usb复位 MOVLW RESET_ALL CALL SEND_CMD CALL DELAY_40MS ;作一个40ms的延时 ;设置厂商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 ;设置usb工作模式 MOVLW SET_USB_MODE CALL SEND_CMD CALL DELAY_CD MOVLW 0X02 CALL SEND_DATA ;-------------------------------- ; 正常工作 ;-------------------------------- ; GOTO $

;________________________________ ;测试程序 ;仅测试endpoint2的in和out事务 ;________________________________ LOOP_WORK BANKSEL SYS_SIGNAL BTFSC SYS_SIGNAL,2 ;判断endpoint2的out事务的相应寄存器是否已被更新 ;但数据并未被读出,需要程序将其读出 CALL DEAL_EP2_OUT ;对新到的数据取反,同时将SYS_SIGNAL的bit2清零 BANKSEL SYS_SIGNAL BTFSS SYS_SIGNAL,1 ;判断endpoint2的in事务的相应寄存器是否已被锁定, CALL DEAL_EP2_IN ;更新相应寄存器的数据,执行endpoint2的in事务,同时将SYS_SIGNAL中的bit1置位 ;所有的事务完成后,延时一段时间 ;对所有的事务信号量进行测试 ;从而判断是否有死进程 ;有,则复位 ;无,则跳转,循环执行 ;不必对out事务进行测试 ; 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

;________________________________ ; 中断处理程序 ;所有的中断服务程序最后完成后要跳转到END_INT, ;恢复堆栈后再退出中断 ;________________________________ INT_SERVE BANKSEL INTCON BTFSC INTCON,RBIF GOTO USB_INT ;添加其他中断服务程序 GOTO END_INT USB_INT BANKSEL PORTB BTFSC PSP_INT GOTO END_USB_INT_SERVE MOVLW GET_STATUS CALL SEND_CMD ;命令码和数据之间要有2.5us的间隔 ;延时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事务成功 ENDPOINT1_IN ;添加ENDPOINT1的IN服务代码 ;添加ENDPOINT1的IN服务代码 GOTO END_USB_INT_SERVE ;ENDPOINT2的OUT事务成功 ENDPOINT2_OUT ;添加ENDPOINT2的OUT服务代码 BANKSEL SYS_SIGNAL BSF SYS_SIGNAL,2 ;添加ENDPOINT2的OUT服务代码 GOTO END_USB_INT_SERVE ;ENDPOINT2的IN事务成功 ENDPOINT2_IN ;添加ENDPOINT2的IN服务代码 BANKSEL SYS_SIGNAL BCF SYS_SIGNAL,1 ;添加ENDPOINT2的IN服务代码 GOTO END_USB_INT_SERVE ;结束usb中断服务程序 END_USB_INT_SERVE BANKSEL INTCON BCF INTCON,RBIF GOTO END_INT

;结束INT中断服务程序,退出 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

;命令和数据之间的延时 ;此延时要大于2.5us DELAY_CD NOP RETURN

;数据和数据之间的延时 ;此延时要大于1.5us DELAY_DD NOP RETURN

;延时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


只有登录才能回复,可以选择微信账号登录