为什么PC机无法接收数据?

从PC机端发送数据到CH372时,全部都正确,

可是PC端要求接收CH372的数据时,接收不到数据,线程一直在等待。

我的单片机程序是这样的。 麻烦WCH的工程师们帮看一下好吗?谢谢!

;*******向CH372写命令操作******************** ORDER: MOV P2,A SETB P0.3 CLR P0.5 MOV P2,A NOP SETB P0.5 mov p2,#0ffh RET ;----------------------------------------------------

;*******向CH372写数据操作************************** WRITE: MOV P2,A CLR P0.3 CLR P0.5 MOV P2,A NOP SETB P0.5 mov p2,#0ffh RET ;--------------------------------------------------

;*******向CH372读数据操作************************* READ: MOV P2,#0FFH CLR P0.3 CLR P0.4 MOV A,P2 NOP SETB P0.4 mov p2,#0ffh RET ;------------- ;*******端点2 批量数据上传子程序******************** BULKUP: MOV A,#CMD_WR_USB_DATA7 ;写入上传命令 ACALL ORDER nop nop nop MOV A,LEN ;先写入数据长度 mov r2,a jz int_unlk ACALL WRITE MOV R1,#BUFFER BULKSEND:MOV A,@R1 ;发送数据 ACALL WRITE INC R1 DJNZ r2,BULKSEND INT_UNLK:MOV A,#CMD_UNLOCK_USB ;发送完毕,解开缓冲区锁 ACALL ORDER nop RET ;-----------------------------------------------------------

;*******端点2 批量数据下传子程序************* BULKDOWN:MOV A,#CMD_RD_USB_DATA ;写入下传数据命令 ACALL ORDER NOP NOP ACALL READ ;读取数据长度 MOV R2,A JZ OUTDOWN MOV LEN,A MOV R1,#BUFFER BULKDS: ACALL READ ;接收下传数据 MOV @R1,A INC R1 DJNZ R2,BULKDS mov a,r1 clr c subb a,#05h mov lenend,a OUTDOWN:NOP RET

改成这样你试下: ;*******向CH372读数据操作************************* READ: MOV P2,#0FFH CLR P0.3 CLR P0.4 MOV A,P2 NOP SETB P0.4 mov p2,#0ffh RET ;------------- ;*******端点2 批量数据上传子程序******************** BULKUP: MOV A,#CMD_WR_USB_DATA7 ;写入上传命令 ACALL ORDER nop nop nop MOV A,LEN ;先写入数据长度 MOV R2,A ACALL WRITE MOV R1,#BUFFER BULKSEND:MOV A,@R1 ;发送数据 ACALL WRITE INC R1 DJNZ r2,BULKSEND INT_UNLK:MOV A,#CMD_UNLOCK_USB ;发送完毕,解开缓冲区锁 ACALL ORDER nop RET 还有一个问题就是你既然是用模拟口的方式来写读写函数,那你的WR,RD怎么没有涉及到?


整个CH372中断服务程序是这样的,接收来自PC机的数据是完全正确的, 就是在发送数据到PC机时,PC机的应用程序线程一直在等待,接收不到数据。我现在都不知道问题出在那里。 如果是读写CH372的函数错了,那在测试CH372时应该通不过才是的。可是他可以接收到PC机的数据,就是不能发送数据到PC机。

麻烦你们帮忙看一下吧,谢谢。

;*******向CH372写命令操作******************** ORDER: MOV P2,A SETB P0.3 CLR P0.5 NOP SETB P0.5 mov p2,#0ffh RET ;----------------------------------------------------

;*******向CH372写数据操作************************** WRITE: MOV P2,A CLR P0.3 CLR P0.5 NOP SETB P0.5 mov p2,#0ffh RET ;--------------------------------------------------

;*******向CH372读数据操作************************* READ: MOV P2,#0FFH CLR P0.3 CLR P0.4 MOV A,P2 NOP SETB P0.4 mov p2,#0ffh RET ;----------------------------------------------------- ;*******端点2 批量数据上传子程序******************** BULKUP: MOV A,#CMD_WR_USB_DATA7 ;写入上传命令 ACALL ORDER nop nop nop MOV A,LEN ;先写入数据长度 mov r2,a ACALL WRITE MOV R1,#BUFFER BULKSEND:MOV A,@R1 ;写入发送数据 ACALL WRITE INC R1 DJNZ r2,BULKSEND INT_UNLK:MOV A,#CMD_UNLOCK_USB ;发送完毕,解开缓冲区锁 ACALL ORDER nop RET ;-----------------------------------------------------------

;*******端点2 批量数据下传子程序************* BULKDOWN:MOV A,#CMD_RD_USB_DATA ;写入下传数据命令 ACALL ORDER NOP NOP ACALL READ ;读取数据长度 MOV R2,A JZ OUTDOWN MOV LEN,A MOV R1,#BUFFER BULKDS: ACALL READ ;接收下传数据 MOV @R1,A INC R1 DJNZ R2,BULKDS OUTDOWN:NOP RET ;---------------------------------------------------------

;*******CH375产生的中断服务子程序******************************* INTER: MOV A,#CMD_GET_STATUS ;读取中断状态码 ACALL ORDER NOP NOP ACALL READ ;*******分析中断产生的原因,并作出相应的响应******************** INT_1: CJNE A,#USB_INT_EP2_OUT,INT_2 ;*******端点2下传中断************************* ACALL BULKDOWN setb p0.1 SJMP EXITINTER INT_2: CJNE A,#USB_INT_EP2_IN,INT_3 ;*******端点2上传中断************************* ACALL BULKUP setb p0.0 SJMP EXITINTER INT_3: setb p0.0 setb p0.1 MOV A,#CMD_UNLOCK_USB ;解开缓冲区 ACALL ORDER ;SJMP EXITINTER EXITINTER: clr flagint setb p3.2 nop ljmp loop ;中断返回 RET ;---------------------------------------------------------------------- ;*******主程序***************************************** main: clr flagint mov p0,#0fch mov p1,#00h mov p2,#0ffh mov p3,#0ffh

acall delay10ms

acall init mov len,#20h acall bulkup 先写入数据到数据块上传端点。等 待PC机取走。

loop: acall delay10ms

wait: acall display nop jb flagint,intin sjmp wait sjmp wait intin: nop ljmp inter ret


先别慌用你的软件接收,用监视软件看看到底有没有数据发上去。很可能还是你的上位机软件问题。


你先用我们的CH372DEBUG上位机程序来调试你的下位机,调试的时候,你要下发一个数据下去(批量端点下传)然后在通过批量端点上传就可以了


我用CH372DEBUG测试过了,一样的问题。 我是下发一个数据,然后上传,同样的,线程一直在等待。 好像单片机都没有响应到CH372的中断, 但是可以接受数据,说明硬件没有问题。

我想最有可能是的单片机程序中的上传批量数据部分有问题。 但是我不知道问题出在那里。

我在单片机中,用查询方式响应CH372的中断, 全部的程序是这样子的。

flagint BIT 20H.3 ;中断标志 lenend data 3eh

ORG 0000H LJMP MAIN

;*******向CH372写命令操作******************** ORDER: MOV P2,A SETB P0.3 CLR P0.5 NOP SETB P0.5 mov p2,#0ffh RET ;----------------------------------------------------

;*******向CH372写数据操作************************** WRITE: MOV P2,A CLR P0.3 CLR P0.5 NOP SETB P0.5 mov p2,#0ffh RET ;--------------------------------------------------

;*******向CH372读数据操作************************* READ: MOV P2,#0FFH CLR P0.3 CLR P0.4 MOV A,P2 NOP SETB P0.4 mov p2,#0ffh RET ;-----------------------------------------------------

;*******初始化CH372子程序 ,测试CH372工作是否正常****** INIT: ;CLR FLAG_SEND_WAIT ;CLR FLAG_INT_WAIT nop MOV A,#CMD_CHECK_EXIST ACALL ORDER MOV A,#55H ACALL WRITE CPL A MOV R7,A ACALL READ XRL A,R7 JZ INIT_OK MOV A,#CMD_RESET_ALL MOV R7,#50H INITHR: ACALL ORDER DJNZ R7,INITHR MOV R7,#0A0H INITD2: CLR A INITD1: DJNZ ACC,INITD1 DJNZ R7,INITD2 SJMP INIT ;-----------------------------------------------------

;********设置CH372的工作模式***************** INIT_OK:MOV A,#CMD_SET_USB_MODE ;设置CH372芯片的工作模式 ACALL ORDER MOV A,#02H ;02H为内致固件模式 ACALL ORDER NOP NOP WAITINIT:ACALL READ XRL A,#CMD_RET_SUCCESS ;等待设置成功 JNZ WAITINIT RET ;------------------------------------------------------

;*******端点2 批量数据上传子程序******************** BULKUP: MOV A,#CMD_WR_USB_DATA7 ;写入上传命令 ACALL ORDER nop nop nop MOV A,LEN ;先写入数据长度 mov r2,a ACALL WRITE MOV R1,#BUFFER BULKSEND:MOV A,@R1 ;写入发送数据 ACALL WRITE INC R1 DJNZ r2,BULKSEND INT_UNLK:MOV A,#CMD_UNLOCK_USB ;发送完毕,解开缓冲区锁 ACALL ORDER nop RET ;-----------------------------------------------------------

;*******端点2 批量数据下传子程序************* BULKDOWN:MOV A,#CMD_RD_USB_DATA ;写入下传数据命令 ACALL ORDER NOP NOP ACALL READ ;读取数据长度 MOV R2,A JZ OUTDOWN MOV LEN,A MOV R1,#BUFFER BULKDS: ACALL READ ;接收下传数据 MOV @R1,A INC R1 DJNZ R2,BULKDS OUTDOWN:NOP RET ;---------------------------------------------------------

;*******CH375产生的中断服务子程序******************************* INTER: MOV A,#CMD_GET_STATUS ;读取中断状态码 ACALL ORDER NOP NOP ACALL READ ;*******分析中断产生的原因,并作出相应的响应******************** INT_1: CJNE A,#USB_INT_EP2_OUT,INT_2 ;*******端点2下传中断************************* ACALL BULKDOWN setb p0.1 SJMP EXITINTER INT_2: CJNE A,#USB_INT_EP2_IN,INT_3 ;*******端点2上传中断************************* ACALL BULKUP setb p0.0 SJMP EXITINTER INT_3: setb p0.0 setb p0.1 MOV A,#CMD_UNLOCK_USB ;发送完毕,解开缓冲区锁 ACALL ORDER ;SJMP EXITINTER EXITINTER: clr flagint setb p3.2 nop ljmp loop ;中断返回 RET ;----------------------------------------------------------------------

;*******显示数据子程序***************显示缓冲区为40H~80H********** ;org 00cah display: mov dptr,#tab mov a,30h ;显示30H movc a,@a+dptr mov p1,a clr p3.4 acall delay cpl p3.4 jb flagint,outdis

mov a,31h ;显示31H movc a,@a+dptr mov p1,a clr p3.5 acall delay cpl p3.5 jb flagint,outdis

mov a,32h ;显示32H movc a,@a+dptr mov p1,a clr p3.6 acall delay cpl p3.6 jb flagint,outdis

mov a,33h ;显示33H movc a,@a+dptr mov p1,a clr p3.3 acall delay cpl p3.3 jb flagint,outdis outdis: nop ret ;org 0109h TAB: DB 0D7H, 11H, 0CDH, 05DH, 1BH ;0,1,2,3,4 DB 5EH, 0DEH, 015H , 0DFH, 5FH, ;5,6,7,8,9 db 0f8h, 0dah, 0c8h, 0d9h, 0cfh, 08eh ;a,b,c,d,e,f db 08h, 08h, 08h, 08h, 08h ;end-

;org 0114h ;**************************************************************** ;显示延迟子程序,每调用一次延时1ms delay: del: mov r7,#0fah deh: jnb p3.2,outdel djnz r7,deh nop sjmp outdelx outdel: setb flagint setb p3.2 nop outdelx:nop ret ;-----------------------------------------------------

;*******主程序***************************************** main: clr flagint mov p0,#0fch mov p1,#00h mov p2,#0ffh mov p3,#0ffh

acall delay10ms

acall init

mov len,#20h acall bulkup ;上传32个随机数

loop: ;acall delay10ms mov r3,#00h acall data0x mov r4,#255

wait: nop acall display nop jb flagint,intin djnz r4,wait mov r4,#255 inc r3 acall data0x mov a,r3 clr c cjne a,len,waitw resetr3:mov r3,#00h acall data0x clr p0.0 clr p0.1 sjmp wait waitw: jnc resetr3 sjmp wait sjmp wait

intin: nop ljmp inter

ret

;******延时10ms ***************** delay10ms: mov r6,#0f0h del10ms:mov r7,#0f0h nop deh10ms:djnz r7,deh10ms djnz r6,del10ms ret ;*******数据转换************************ data0x:mov a,r3 anl a,#0fh mov 31h,a mov a,r3 swap a anl a,#0fh mov 30h,a

mov a,r3 add a,#40h mov r0,a mov a,@r0 anl a,#0fh mov 33h,a mov a,@r0 swap a anl a,#0fh mov 32h,a nop

ret end


当我用中断方式响应CH372的中断时, 发现中断无法正确地返回到产生中断的地方,(可能是在中断里面调用子程序过多) 所在改成查询方式来响应CH372的中断。


你试下我的这个程序,这个程序是先接收上位机的数据,接着将上位机的数据去反之后上传给计算机UploadImages/hcn0012006615144350.rar


对,我就是用你们这个程序作修改的。 只是把里面的数据操作做了改动。 因为我在PCB布线时,为了作一个单面板, 而用P0口时很难布,所以就改成了P2口。用P0口作为读写的地址。 所以现在才那么郁闷。


你用P2口的话,那就是读和写的子函数不一样而已,实际的流程并没有什么大的差别,你的读和写的子程序,个人认为存在问题,读和写的线都没有操作,你怎么进行读和写啊!即使有一个操作成功了,那另外一种也是不可以操作的


我在读写子程序里面,分别对CH372的A0,RD,WR进行位操作。 对应关系是这样的。

A0——P0.3 WR——P0.5 RD——P0.4

写命令时,置P0.3为1,P0.5为0,其它为1 写数据时,P0.3为0,P0.5为0,其它为1 读数据时,P0.3为0,P0.4为0,其它为1


你写的上传程序是有点问题,你应该先写数据到375,当PC机将数据取走之后,375才会产生中断,你读取的中断状态应该为批量端点上传成功,这时候在中断程序里面先将375解锁之后在将数据写到375等待计算机取走数据,


你的意思是不是说, 在获取CH372的批量数据上传上中断之前,一定要先写入一个数据,等待PC机取走, 然后,等到CH372的批量数据上传中断的发生,再解锁,解锁之后,再次写入上传的数据。

是不是这样呢?


可以这样理解,实际是只要先将数据先到372等待主机取走数据,取走之后372才会给单片机中断


我按照这个时序来进行写数据。 还是不行。

我首先是无条件地写一个长度为20H 的数据到批量上传端点里,写完后不作任何处理。 在批量上传中断里,我先作解锁。然后再次写入数据。 这样的一个时序应该没有问题了吧。


你如果先上传的话,在你设置好模式之后,加上这段程序,目的是为了检查你的计算机有没有准备好: CH375_UPLOAD_P0: MOV R3,32H LJMP DELAY50MS CH375_UPLOAD_P01: MOV DPTR,#CH375_CMD_PORT ;检查计算机是否准备好 MOV A,#0AH MOVX @DPTR,A MOV DPTR,#CH375_DAT_PORT MOV A,#20H MOVX @DPTR,A NOP NOP NOP MOVX A,@DPTR ANL A,#20H CJNE A,#20H,CH375_UPLOAD_P0 DELAY50MS: MOV R1,#0AH DL2: MOV R2,#18H DL1: NOP NOP DJNZ R2,DL1 DJNZ R1,DL2 DJNZ R3,DELAY50MS LJMP CH375_UPLOAD_P01 或者你先发一个数据下去之后,然后单片机接收到数据之后在给计算机上传数据也是可以的


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