logo

为什么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怎么没有涉及到?
E-MAIL:fqb@wch.cn TEL:025-52638375
整个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
这人很懒,什么都没留下
先别慌用你的软件接收,用监视软件看看到底有没有数据发上去。很可能还是你的上位机软件问题。
USB
你先用我们的CH372DEBUG上位机程序来调试你的下位机,调试的时候,你要下发一个数据下去(批量端点下传)然后在通过批量端点上传就可以了
E-MAIL:fqb@wch.cn TEL:025-52638375
我用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
E-MAIL:fqb@wch.cn TEL:025-52638375
对,我就是用你们这个程序作修改的。
只是把里面的数据操作做了改动。
因为我在PCB布线时,为了作一个单面板,
而用P0口时很难布,所以就改成了P2口。用P0口作为读写的地址。
所以现在才那么郁闷。
这人很懒,什么都没留下
你用P2口的话,那就是读和写的子函数不一样而已,实际的流程并没有什么大的差别,你的读和写的子程序,个人认为存在问题,读和写的线都没有操作,你怎么进行读和写啊!即使有一个操作成功了,那另外一种也是不可以操作的
E-MAIL:fqb@wch.cn TEL:025-52638375
我在读写子程序里面,分别对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等待计算机取走数据,
E-MAIL:fqb@wch.cn TEL:025-52638375
你的意思是不是说,
在获取CH372的批量数据上传上中断之前,一定要先写入一个数据,等待PC机取走,
然后,等到CH372的批量数据上传中断的发生,再解锁,解锁之后,再次写入上传的数据。

是不是这样呢?
这人很懒,什么都没留下
可以这样理解,实际是只要先将数据先到372等待主机取走数据,取走之后372才会给单片机中断
E-MAIL:fqb@wch.cn TEL:025-52638375
我按照这个时序来进行写数据。
还是不行。

我首先是无条件地写一个长度为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
或者你先发一个数据下去之后,然后单片机接收到数据之后在给计算机上传数据也是可以的
E-MAIL:fqb@wch.cn TEL:025-52638375
只有登录才能回复,可以选择微信和github账号登录