CH375主机模式控制传输无法接收超过64个字节数据!Help

CH375主机模式时,有时候控制传输比如读设备的配置描述符,遇到返回的数据大于64字节时,我就很郁闷了,试验了好久,都没有办法成功。用芯片本身提供的get_descr(2)肯定不行了,数据溢出;那么用外部固件方法,按照USB标准的控制传输3步骤,设置阶段完成后,连续2次或以上的数据阶段,理论上就可以接收到超过64个字节的数据了。然后再状态阶段发送0字节握手。现在我的问题就出在数据阶段。控制阶段指明是读配置描述符,需要返回的数据大于64个字节。数据阶段先toggle_recv(1),然后issue_token( ( 0<< 4 )|DEF_USB_PID_IN),成功并读取数据后,toggle_recv(0),再一次issue_token( ( 0<< 4 )|DEF_USB_PID_IN),这次就死活不能成功了,没有buffer数据返回,status返回的错误代码为23H。程序大体如下: if(SETUPDAT[6]||SETUPDAT[7]) { /*Data Stage*/ unsigned char s; unsigned int len=((unsigned int)SETUPDAT[7]*256+SETUPDAT[6]); unsigned char *buf; unsigned char EPBUF0[256]; buf=EPBUF0; tog_recv=1; endp_out_size=64; endp_out_addr=0;

while( len ) { /* 连续接收数据块 */ toggle_recv( tog_recv); /* 数据同步 */ s=issue_token( ( endp_out_addr << 4 )||DEF_USB_PID_IN ); if ( s==USB_INT_SUCCESS ) { /* CH375成功收到数据 */ s=rd_usb_data( buf ); /* 将数据从CH375芯片中读出 */ if(s<64) break; tog_recv = ~ tog_recv; /* 切换DATA0和DATA1 */ len-=s; /* 计数 */ buf+=s; } else { break; } } }

请求哪位大侠指点!

http://wch.cn/bbs/View.asp?S=101&I=19463 下载8楼的例程,是操作键盘鼠标的,不过获取描述符的过程是通用


谢谢SCM建议,不过我的这个程序其实也是参考了例程的,也花了不少时间学习。和键盘鼠标例程相比,不同的就是full speed,数据包是64字节,然后主机端点的接收器的同步触发标志处理方法不一样(其实是一样的,只是语句方面的区别),所以还是不知道问题出在哪里。每次如果只需返回小于64个字节的时候就可以,大于64字节就只能收到64字节,然后就收不到了,issue_token函数返回0x23(手册上查不到什么意义)。


还是程序上的问题,初学者不建议刚开始就自己写程序,最好直接移植例程,把完整的程序传上来吧


我在做的一个实际的东东,整体来讲比较复杂,其中一个功能是先用CH375B主机模式读外接设备的配置描述符,通过单片机把数据传给CYPRESS公司的Cy7c68013(full speed模式),再传给PC。所以完整的程序相对于这个读外接设备的配置描述符的功能来讲显得比较大也乱七八糟~

我把问题描述详细一点吧: 1.上面程序前面已经有get configuration decriptor的setup阶段,已经成功; 2.程序中的 SETUPDAT[6]和SETUPDAT[7]就是setup阶段的wLENGTH; 3.整个程序的编译和运行都是成功的,除了读取这段程序在遇到读取设备的配置描述符超过64字节的时候,如果设备的配置描述符小于64字节的没问题,如果遇到大于64字节,那么第一次读回来的64字节也是对的,但第二次issue_token就是不能成功; 4.第二次issue_token不成功,GET_STATUS返回的是0x23,不知道是什么意思?另外关于CH375的手册,我只能找到CH375DS1.PDF和CH375DS2.PDF,不知道有没有更详细的用户手册或技术手册什么的? 5.上面程序中调用的函数: void toggle_recv( BOOL1 tog ) { /* 主机接收同步控制:0=DATA0,1=DATA1 */ CH375_WR_CMD_PORT( CMD_SET_ENDP6 ); CH375_WR_DAT_PORT( tog ? 0xC0 : 0x80 ); delay1us(); }

unsigned char issue_token( unsigned char endp_and_pid ) { /* 执行USB事务 */ /* 执行完成后, 将产生中断通知单片机, 如果是USB_INT_SUCCESS就说明操作成功 */ CH375_WR_CMD_PORT( CMD_ISSUE_TOKEN ); CH375_WR_DAT_PORT( endp_and_pid ); /* 高4位目的端点号, 低4位令牌PID */ return( wait_interrupt() ); /* 等待CH375操作完成 */ }


1、可能是同步位没有切换成功,监控一下tog_recv = ~ tog_recv是不是正确的?能否控制同步位切换 2、资料就这么多


多谢SCM指点! 果然是tog_recv = ~ tog_recv的问题,因为tog_recv先是1,取反后变成0xfe,本来目的是要变为0的。 该成tog_recv = !tog_recv就好了! 唉,我当时也是从网上下载了一个CH375做的hp5400driver,然后搬过来的~


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