[求助]为什么鼠标或键盘读不出数据

WCH的工程师您们好! 我用51单片机+375B操作一个PS/2(鼠标或键盘)转USB的设备,现在不知道怎么的,不能读取到数据,描述、地址程序中基本设置正确,就是不知道怎么的,程序(根据例程)中的键盘灯是能够点亮的,按鼠标或键盘没有反应,请帮我查看一下! 下面有程序,以及PC机操作此USB设备在Bus Hound软件中所得到的参考数据。 望回复! UploadImages/200941922352682.rar

附注:PS/2(鼠标或键盘)转USB的设备: http://dvd.intozgc.com/157/157668.html

键盘灯不是CH375来点亮的,是PS2设备来点亮的. 这个操作可能比较特殊,因为是复合设备,要对两个设备进行操作.循环顺序进行,另外你看一下端点好分析的是否正确,因为涉及到两个设备,可能原来的程序在细节上并不一定合适.另外报表描述符也要获取两次,总之按照BUSHOUND上面的流程来做,应该问题不大.


WCH的工程师您们好! 我已经按照BUSHOUND上面的流程来做了,但是现在还是不能接受到数据!请帮我再看看程序!

关键是以下这一段: //get_descr(0x01);//获取设备描述符 printf("device\n"); Request.Req.bmRequestType = 0x80;//1-- 80 06 00 01 00 00 12 00 Request.Req.bRequest = 0x06; Request.Req.wValue = 0x0001; Request.Req.wIndex = 0x0000; Request.Req.wLength = 0x1200; if(get_descr_ex()==1) { for(i=0;i!=data_buf[0];i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n"); } else printf("get device descr failed\n"); set_addr(5);//设置地址 //get_descr(0x02);//获取配置描述符 printf("config\n"); //2-- 80 06 00 02 00 00 09 00 Request.Req.bmRequestType = 0x80; Request.Req.bRequest = 0x06; Request.Req.wValue = 0x0002; Request.Req.wIndex = 0x0000; Request.Req.wLength = 0x0900; if(get_descr_ex()==1) { for(i=0;i!=data_buf[0];i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n"); if(data_buf[4]!=0x01)flag_interface_2=1;//有多个接口 } else printf("get config descr failed\n"); printf("config 2\n"); if(data_buf[2]>0x09) { flag_config_2=1; Request.Req.bmRequestType = 0x80;//3-- 80 06 00 02 00 00 22 00 Request.Req.bRequest = 0x06; Request.Req.wValue = 0x0002; Request.Req.wIndex = 0x0000; Request.Req.wLength = 0x0000|((unsigned int)data_buf[2]<<8); printf("\n 3 -- Request.Req.wLength = %02x \n",(unsigned int)Request.Req.wLength); if(get_descr_ex()==1) { for(i=0;i!=data_buf[2];i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n"); flag_config_2=0; } else printf("get device descr again failed\n"); } parse_config_descr();//保存描述符中一些值 set_config(config_value);//设置配置 printf("set config\n"); //if(set_config_ex()!=1)printf("set config failed\n");//4 --- printf("set idle\n"); if(set_idle()!=1)printf("set idle failed\n");//5-- printf("report\n"); Request.Req.bmRequestType= 0x81;//6-- 81 06 00 22 01 00 8b 00 Request.Req.bRequest = 0x06; Request.Req.wValue = 0x0022; Request.Req.wIndex = 0x0100; Request.Req.wLength = 0x0000 | ((unsigned int)(report_descr_len+0x40)<<8); printf("\n 6 -- Request.Req.wLength = %02x \n",(unsigned int)Request.Req.wLength); if(get_report_descr_ex() == 1) { for(i=0;i!=report_cou;i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n"); } else printf("get report descr failed\n"); //操作键盘 printf("set report\n"); //对于键盘这一步,是点亮指示灯 if(set_report()!=1)printf("set report failed\n"); delayms(250); //EA=1; //打开中断,从中断端点接收数据

get_int_in(); //发送从中断端点读数据的令牌

请帮我复查一下!!!


PS2 转USB是不是两个设备,是一个设备,比如你获取报表描述符的时候并没有获取鼠标的,只是获取了键盘的,你应该都要获取,按照流程操作.分别记住两个端点号.如果您只操作1个设备,可能不行的.你看一下键盘是第几个接口.


不是很明白,能不能给我写个步骤?


PS2 转USB是一个设备,但是在PC机的设备管理里是两个设备,能不能给我写个步骤?实在不成我只能把这个设备寄给您们了


一个设备两个接口,流程参考BUSHOUND就可以了.枚举要保证完成,然后看看端点号获取的是不是正确.其余的都和操作一个设备一样.然后发起IN事务就可以了.


最关键的我现在已经改得跟BUSHOUND一样了,就是没有信号出来,所以搞不清楚了


而且我是一个一个的对照下去做的 发送步骤如下 1-- 80 06 00 01 00 00 12 00 2-- 80 06 00 02 00 00 09 00 3-- 80 06 00 02 00 00 22 00 4-- 00 09 01 00 00 00 00 00 5-- 21 0a 00 00 01 00 00 00 6-- 81 06 00 22 01 00 8b 00

发送以上之后利用以下发送从中断端点读数据的令牌 get_int_in(); //发送从中断端点读数据的令牌

就是后面没有接收到数据


20094201713654.jpg

http://wch.cn/bbs/UploadImages/20094201713654.jpg

20094201713654.jpg


希望帮我对照以下我的饿步骤是否正确


这个设备插在PC上应该是一个复合设备,你选择的设备不对,怎么只能看到键盘的,鼠标的呢?你这个数据可能是应用层分析得出的数据,你把设备选择在键盘的上一层上,而且你抓出来的数据肯定和你获取的不一样,你这个是分析得到的.不知道您有没没有明白,这样吧,您可以打电话技术支持:02552638370


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