CH375B获取配置描述符:USB_INT_BUF_OVER,请指点

本人采用MCU控制CH375B芯片来实现对USB设备的控制,MCU和CH375B之间采用的是串口通讯。当连接了USB打印机(该打印机采用的是PL2305作为接口芯片),程序调用打印机初始化函数对其进行初始化时,总是在获取配置描述符处出错,返回的状态是:0x17,即USB_INT_BUF_OVER。打印机的初始化程序是参考沁恒提供的ch375prt.c,ch375inc.h写的。看手册上说,这种情况需要用户自己使用Issue_Token命令自行处理,是需要这样吗?看到一个帖子里说是要用外部固件编程方式,不知是否如此?能够提供一下解决思路和相应的Demo程序,非常感谢 :(

返回USB_INT_BUF_OVER(0x17)是因为你的打印机的配置描述符的长度超过64字节了,解决这个问题需要你通过ISSUE_TOKEN或者ISSUE_TKN_X命令自行处理控制传输。

你可以发一封邮件到我的邮箱zb@wch.cn,我把外置固件操作例子发给你。


啊,好的,多谢了。我这就联系你的邮箱~


邮件已发


嗯,已收到查看中。移植后,在get_descr_ex()函数中的 status=issue_token(( 0 << 4 ) | DEF_USB_PID_IN),返回的status是0x2B,也就是 错误:对于OUT/SETUP事务返回DATA1,这个能帮忙看下大概是什么问题吗?


注意setup阶段数据是否发送成功(两字节数据存在大小端问题),其次IN包接受的同步标志应该是DATA1,是否正确。


我是在Keil C51中进行开发的,Big_endian模式,Demo程序会是Little_endian的吗?ARM类芯片的?


demo是基于51单片机的,大端模式。从你的返回值0x2B:USB_INT_RET_TOGX(0x0010X011B)错误:对于IN事务返回数据不同步。


你好,我在程序中做了如此修改:

tog_recv=0;//

   while(descr_len>0){

            CH375B_Toggle_Recv(tog_recv);//

p+=0x08;

status=CH375B_Issue_Token(( 0 << 4 ) | DEF_USB_PID_IN);

if(status==USB_INT_SUCCESS)/* DATA阶段操作成功 */{

               tog_recv=~tog_recv;//

descr_len-=CH375B_Read_USB_Data(p);}

else {

                return(0);}}

后面有双斜杠的是修改的,使用tog_recv变量交替控制DATA0和DATA1接收数据,就能够成功获取描述符了。


对Demo程序深入分析后,感觉有些地方越看越不明白了。比如:

if ( p_cfg_descr->itf_descr.bInterfaceClass!=0x8 || p_cfg_descr->itf_descr.bInterfaceSubClass!=0x6 ) {

            return( UNKNOWN_USB_PRINT );  /* 不是USB打印机或者不符合USB规范 */

}

而在这之前,包括子函数内,并未调用rd_usb_data函数将数据从ch375读出到buffer中,而这又直接用作判断,在跟踪调试时,程序就总是在这儿return了。程序应该时严格按照Demo程序中的各个函数进行实现的。看来还要再研究下USB通讯协议。。。



给你的程序只是提供给你控制传输的几个函数,其他地方有改动,比如DATA0、DATA1肯定要切换的,原来打印机的判断应该是if(p_cfg_descr->itf_descr.bInterfaceClass!=0x07||p_cfg_descr->itf_descr.bInterfaceSubClass!=0x01 )另外,buffer定义的话#define    p_cfg_descr   ((PUSB_CFG_DESCR_LONG)buffer)



呃,看来要改动改动的地方还很多。。。算是顺带熟悉USB的协议了吧.;)


你好,我现在采用外部固件方式控制CH375B,能够顺利地对连接的USB设备进行枚举,并读取保存了端点的地址,端点数据包大小等信息。枚举流程也基本按照Demo中写的。但在枚举了之后,对连接的USB打印机进行块数据传输时,总是失败:第一次返回的是0x20,后面都是返回0x28,不知这是什么原因,能否提供一些参考意见呢?谢谢~


参考电脑对该打印机的枚举过程,枚举阶段是否还要执行其他命令,例如设置接口等。传输数据也一样,给指定端点发数据才有效。


通过观察,我发现USB设备描述符的bcdUSB域为0100,意味着是USB1.0协议的,但是我通过函数设置了USB总线速度:

CH375B_WriteCmd(0x04);

CH375B_WriteData(0x02);使CH375B工作在1.5Mbps低速模式,但此设置之后,就根本无法和USB设备进行通信了。所以问下,之前发送数据出现返回值是:0x20可能和总线速度不匹配有关吗?这样进行USB总线速度设置是否正确?



USB1.0也不能说明是低速设备。打印机一般默认都是全速的,所以不需要把CH375设置成低速模式,你这样设置你前面初始化都通过不了。你的问题与速度无关。


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