ch375请求设备描述符时总是超时,请大家帮忙!

我用ch375a做主机和USB接口的鼠标通信,发setup包请求设备描述符时总是返回2CH。 以下是我的原程序(试验性质的) START: MOV SP,#STACK CLR EA ;禁止所有中断 LCALL INIT_UART LCALL INIT_VARIABLE START1: mov a,#reset_all mov dptr,#usb1_cmd_addr movx @dptr,a lcall delay_40ms lcall delay_40ms start11: MOV A,#06H MOV DPTR,#USB1_CMD_ADDR ;CHECK EXIST MOVX @DPTR,A MOV A,#55H MOV DPTR,#USB1_DAT_ADDR MOVX @DPTR,A MOVX A,@DPTR LCALL UART_SEND ;AAH

MOV DPTR,#USB1_CMD_ADDR ;SET USB MODE MOV A,#SET_USB_MODE MOVX @DPTR,A MOV A,#05H ;MODE 05H MOV DPTR,#USB1_DAT_ADDR MOVX @DPTR,A START2: MOV A,#20H LCALL DELAY_A MOV DPTR,#USB1_DAT_ADDR MOVX A,@DPTR LCALL UART_SEND CJNE A,#CMD_RET_SUCCESS,START2 ;51H

;==========以上是设置375为主机模式,可以成功完成==============

START4: LCALL DELAY_40MS MOV C,INTO1 ;HOST WAIT DEVICE PLUG JC START4 LCALL GET_INT_STAT1 CJNE A,#USB_INT_CONNECT,START4 LCALL UART_SEND ;15H MOV DPTR,#USB1_CMD_ADDR ;复位USB总线 MOV A,#SET_USB_MODE MOVX @DPTR,A MOV A,#07H ;MODE 07 MOV DPTR,#USB1_DAT_ADDR MOVX @DPTR,A LCALL DELAY_40MS MOV DPTR,#USB1_CMD_ADDR MOV A,#SET_USB_MODE MOVX @DPTR,A MOV A,#05H ;MODE 05 MOV DPTR,#USB1_DAT_ADDR MOVX @DPTR,A START5: MOV C,INTO1 JC START5 LCALL GET_INT_STAT1 CJNE A,#USB_INT_CONNECT,START5 MOV USB1_CONNECT,#15H ;等待复位后设备再次连接上来 LCALL UART_SEND ;15H

;=================USB设备已经正常连接,也可以成功=================

; MOV A,#GET_DESCR ; MOV DPTR,#0200H ; MOVX @DPTR,A ; MOV A,#01H ; MOV DPTR,#0000H ; MOVX @DPTR,A

MOV A,#WR_USB_DATA7 ;GET DEVICE DESCRIPTOR MOV DPTR,#USB1_CMD_ADDR MOVX @DPTR,A MOV A,#08H ;8 BYTE MOV DPTR,#USB1_DAT_ADDR MOVX @DPTR,A MOV A,#80H ;80 MOVX @DPTR,A MOV A,#06H ;06 MOVX @DPTR,A MOV A,#00H ;00 MOVX @DPTR,A MOV A,#01H ;01 MOVX @DPTR,A MOV A,#00H ;00 MOVX @DPTR,A MOV A,#00H ;00 MOVX @DPTR,A MOV A,#12H ;12 MOVX @DPTR,A MOV A,#00H ;00 MOVX @DPTR,A MOV A,#ISSUE_TKN_X MOV DPTR,#USB1_CMD_ADDR MOVX @DPTR,A MOV A,#00H ;同步标志 MOV DPTR,#USB1_DAT_ADDR MOVX @DPTR,A MOV A,#0DH ;事务属性 MOV DPTR,#USB1_DAT_ADDR MOVX @DPTR,A START7: MOV C,INTO1 JC START7 LCALL GET_INT_STAT1    ; LCALL UART_SEND CJNE A,#USB_INT_SUCCESS,START8 ;此时得到的中断状态总是2CH

LCALL UART_SEND SJMP $ 当我用此程序和处于设备状态的ch375通信时,可以得到14H。请大家帮我找找原因,已经郁闷了好几天了!谢谢了。

请问你的单片机的晶振是多少???


12M的。


模式要设置为0X06 MOV DPTR,#USB1_CMD_ADDR ;SET USB MODE MOV A,#SET_USB_MODE MOVX @DPTR,A MOV A,#05H ;MODE 06H 试下看看,


谢谢,马上去试。


hcn你好: 按照你的提示,已经试过了。仍然没有解决。我现在不明白的是:为什么设备端为ch375就可以成功,设备端不是ch375就总是超时。我的结论是:只要是涉及到USB总线上的数据传输,就会超时。我曾经尝试发送CLR_stall和auto_setup,得到的结果也是超时(返回20h或2ch,设备不同返回的数据不同)。 请你把你怀疑的地方列举出来,无论是硬件上还是软件上,我去一一试验。谢谢了。


还有一个问题就是你和USB鼠标和键盘通信的话,由于USB鼠标和键盘是低速设备(你可以接到计算机上面看下是不是低速设备),那么,用375做主机来获取描述符的话,需要将主频降为1。5M,同时,将375和USB口的UD+和UD-的硬件连线颠倒下在试试,下面是降主频的程序,放在设置模式之后: MOV A,#0x04;CMD_SET_SYS_FREQ MOV DPTR,#USB1_CMD_ADDR MOVX @DPTR ,A MOV A,#0X01; MOV DPTR,,#USB1_DAT_ADDR MOVX @DPTR,A


应该不是速度的问题,因为我插上2.0的优盘,也会提示超时。 刚才按照提示,将主频降为1.5m。出现两种不同的情况: 1如果在设备插上后不复位USB总线,仍然提示超时(2C或20) 2如果设备插上后复位USB总线,则用GET_DESCR()命令375没有任何反应(不产生中断),好像是375没有收到我的命令。若用ISSUE_TOKEN命令,应该是返回超时(我记得不是太清楚了) 再把D+和D-颠倒,同时主频为1.5M,现象和上述一样。

请问是不是我的硬件的问题?


如果是硬件的问题,那为什么让我的硬件做设备就能正常呢?


如果实在找不到原因,明天发给你们原理图和我的程序。


那你这样,你在你的写命令之后加点延时试下看,因为375在命令和数据之间需要2US的延时,数据与数据之间1US的延时,也就是: MOV A,#0x04;CMD_SET_SYS_FREQ MOV DPTR,#USB1_CMD_ADDR MOVX @DPTR ,A NOP NOP MOV A,#0X01; MOV DPTR,,#USB1_DAT_ADDR MOVX @DPTR,A NOP 你也可以将你的原理图发过来看下,还有就是你要检查下你的中断线连接是否正确以及375的晶振是否是12M还有就是UD+和UD-有没有接错


谢谢hcn了,应该是我硬件设计(时钟)有些问题。我在时钟线了加了个15p的退耦电容后,高速设备(USB2.0的优盘)可以正常了。但是低速设备(速度1.5m,如键盘鼠标等)仍然不可以。 请问ch375可以支持低速设备吗?我查阅ch375的pdf文档,没有提是否支持低速设备。 如不支持,我只能改用ch374,重新设计硬件了。


上面和你说了,在你的程序里面加上我说的那段程序在将USB口的UD+,UD-和375的UD+,UD-反接就可以了


昨天按照提示,将D+和D-反接,并新找了两个USB设备。发现两个新设备可以通了。但原来的设备接上还是不通。请问hcn,应该是我程序在某个地方做的不对吧?


你把你的程序发到:tech@wch.cn,或者你看下你的那个设备是低速的设备吗??


昨天把程序发过去了,也忘了在此留言了,不知道收到没有


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