ch375做主机,设置地址后有什么特殊要求吗?

我用ch375作主机,连接键盘鼠标之类的低速设备,设置设备地址后应该是得到设备的配置描述符,此时有的设备可以得到,有的却总是超时,请问这可能是哪的原因???

CH375做主机操作低速设备时,应该将D+,D_调换过来,并且在程序开始将主频从12MHZ降到1.5MHZ。 下面是降主频程序:

void set_freq(unsigned char freq) // 其中freq取1 { CH375_WR_CMD_PORT( CMD_SET_SYS_FREQ ); CH375_WR_DAT_PORT( freq ); delayms(10); }

set_freq(0x01); //work in 1.5M


上面的工作我都做过了。 另,如果我把设置地址那一段程序隐掉,就可以正确的得到设备描述符和配置描述符;如果不隐,得到设备描述符和设置地址所有的设备可以完成;而得到配置描述符只有一部分设备行,另一部分总是提示超时。在得到配置描述符的程序中,我曾在查询中断状态之前延时200ms以上,可仍然没有效果。


再问一句,降频程序必须在程序的开始吗? 我是在设置完ch375的工作模式之后,检测设备插入之前降频,这样应该没有问题吧??


降频放在设置完ch375的工作模式之后,检测设备插入之前。 枚举配置大体过程是: 检测到设备之后,延时等待稳定,获取设备描述符,设置地址,获取配置描述符,根据配置描述符中的值设置配置。


应该在设置模式之后,检测设备连接之前来降主频


USB规范要求,设置地址后必须至少延时2mS才能发出下一个操作


请问: 针对CH375A,是在SET_ADDRESS命令之后延时2MS,还是完成了SET_ADDRESS和SET_USB_ADDR两个命令之后延时2MS呢? 再请教一个问题,在设备枚举阶段,是不是不用考虑DATA0和DATA1呢。我没有考虑,因为我在贵公司提供的源程序中没有发现在设备枚举阶段考虑了DATA0和data1


在SET_USB_ADDR之后延时2mS,在设备端, CH375可以自动切换;但在主机端, 必须由SET_ENDP6和SET_ENDP7命令控制CH375切换DATA0与DATA1.,主机成功发送后就要切换DATA0/DATA1实现数据同步.


可是,我是在向ch375发一系列的命令,还需要数据同步吗?好像不需要吧。

另,如果我不设置设备的地址,用默认的设备地址0去请求设备描述符和配置描述符,不考虑数据同步,则手中所有的设备也都能正常工作啊。

我现在遇到的困难是用非0的设备地址去请求配置描述符时,有些设备(不是全部)没有反应(ch375返回超时),请问这可能是我的程序哪里的问题???


实际上是我们375芯片内置了一些固件程序在里面,例如获取设备描述符,获取配置描述符,设置地址以及设置配置等等,只要用到这些功能的时候,只需要发送一个命令过去,375就实现了你需要的功能,但是,对于没有固件的一些类请求,就需要按照USB协议来操作375,也就是你说的可能需要数据同步,还有发送令牌包等等。 如果有一些设备可以获取描述符,而另一些设备不能获取描述符的话,那你需要查下你的硬件上面会不会供电不足,还有就是对于375操作低速设备是不允许插入全速设备的,这样也会出现获取不到描述符的。


我确信我手头上所有的设备都是低速设备,原因有二: 1 我手头所有的设备目前都可以正确得到“设备描述符”。 2 我手头所有的设备如果去掉“设置地址”这一段程序,用默认地址通信,也都可以正确得到“设备描述符”和“配置描述符”。 我会考虑供电不足的情况,不过我强烈怀疑是我的程序时序不好,所以请你告诉我,考虑时序,应该考虑哪些方面,最好能给个典型值。比如命令与数据之间,手册上说是2微秒到100微秒,我程序上的延时是2微秒,比你们的典型值差多少呢?


如果是时序问题的话,那么你可以将你的三个读写子函数帖出来看下,我可以帮你修改下


这是我的设备枚举子程序。我在主程序中检测到设备插入,就会调用此程序。第一次编程,感觉写的很乱,但又想不出好的办法 EMU_DEV: MOV A,#SET_USB_MODE MOV DPTR,#USB1_CMD_ADDR ;复位USB总线 MOVX @DPTR,A LCALL DELAY_50US MOV A,#07H ;MODE 07 MOV DPTR,#USB1_DAT_ADDR MOVX @DPTR,A LCALL DELAY_50US MOV R1,#28H ;将复位信号保持10ms EMU_1: MOV A,#0FAH LCALL DELAY_A DJNZ R1,EMU_1

MOV A,#SET_USB_MODE ;再把模式设回06H MOV DPTR,#USB1_CMD_ADDR MOVX @DPTR,A LCALL DELAY_50US MOV A,#06H ;MODE 06 MOV DPTR,#USB1_DAT_ADDR MOVX @DPTR,A MOV A,#14H LCALL DELAY_A ;========以下是极其重要的一段延时===================== ;每隔40ms检测一次ch375的中断,共检测50次,. ;若200ms内没有检测到中断,说明设备出错, MOV R1,#50 EMU_DEV1: LCALL DELAY_40MS DJNZ R1,EMU_2 JMP EMU_ERROR_RET EMU_2: MOV C,INTO1 JC EMU_DEV1 LCALL GET_INT_STAT1 LCALL UART_SEND GET_CONFIG_DESC4: MOV R0,#DMABUFFERLEN MOV A,#RD_USB_DATA NOP MOVX A,@DPTR ;读描述符 INC R0


我后来把set_usb1_addr那段程序移到了 get_device_descr程序的前面,又通过了一个鼠标。现在只剩下一个sun的USB键盘不行了。但有一个现象:我若保留set_usb1_addr这段程序,无论地址值设成多少(包括0地址),get_device_desc和get_config_desc都不能完成。若隐掉set_usb1_addr这段程序,get_device_desc和get_config_desc都能完成。(SUN公司的东西向来与众不同,我拆了sun的键盘,它用的是moto的sc513726fb芯片,但网上找不到它的手册)


不会这样吧,按照USB协议来说,设置地址是必要操作,只有不设置地址才会出现获取配置描述符获取不到的现象啊


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