[求助]CH375B连接鼠标又有新问题了!

紧急求助!!!!! CH375B可以获取设备描述符 配置描述符。。反正GET的都能获取,但是设置配置和SET IDLE这两个又出问题了 也是返回0x2e!啊~~~~~~~~~[Emot]1[/Emot]

把USB信号线上的15K电阻全部去掉,USB信号线上不需要接任何东西,和这个是有关系的,我们的芯片正常情况下USB信号线上不需要任何东西的。你从配置描述符里获取的配置值是多少(buf[5])?然后把buf[5]作为设置配置命令的参数,先把设置配置值命令过了再解决SET IDLE


去除了!!!buf【5】=1; unsigned char set_config_ex() { Request.Req.bmRequestType=0x00; Request.Req.bRequest=0x09;config_value=config_value; Request.Req.wValue=0x0000|((unsigned short int)config_value<<8); Request.Req.wIndex=0x0000; Request.Req.wLength=0x0000; endp7_mode=0x80; toggle_send(); wr_usb_data(8,Request.Req_buf);/* SETUP数据总是8字节 */ issue_token(( 0 << 4 ) | DEF_USB_PID_SETUP);status=wait_interrupt(); if(status==USB_INT_SUCCESS)/* SETUP阶段操作成功 */ { endp6_mode=0xc0; toggle_recv(); issue_token(( 0 << 4 ) | DEF_USB_PID_IN);status=wait_interrupt(); if(status==USB_INT_SUCCESS)/* 状态阶段操作成功 */ { if(rd_usb_data(data_buf)!=0) return(0); } else return(0); } else return(0); return(1) ; } unsigned char set_idle() { Request.Req.bmRequestType=0x21; Request.Req.bRequest=0x0a; Request.Req.wValue=0x0000; Request.Req.wIndex=0x0000;if(flag_interface_2==1)Request.Req.wIndex=0x0100; Request.Req.wLength=0x0000; endp7_mode=0x80; toggle_send(); wr_usb_data(8,Request.Req_buf);/* SETUP数据总是8字节 */ issue_token(( 0 << 4 ) | DEF_USB_PID_SETUP);status=wait_interrupt(); if(status==USB_INT_SUCCESS) /* SETUP阶段操作成功 */ { endp6_mode=0xc0; toggle_recv(); issue_token(( 0 << 4 ) | DEF_USB_PID_IN );status=wait_interrupt(); if(status==USB_INT_SUCCESS) /* 状态阶段操作成功 */ { if(rd_usb_data(data_buf)!=0) return(0); } else return(0); } else return(0); return(1); } unsigned char set_report() { Request.Req.bmRequestType=0x21; Request.Req.bRequest=0x09; Request.Req.wValue=0x0002; Request.Req.wIndex=0x0000; Request.Req.wLength=0x0100; endp7_mode=0x80; toggle_send(); wr_usb_data(8,Request.Req_buf);/* SETUP数据总是8字节 */ issue_token(( 0 << 4 ) | DEF_USB_PID_SETUP);status=wait_interrupt(); if(status==USB_INT_SUCCESS)/* SETUP阶段操作成功 */ { toggle_send(); Request.Req_buf[0]=0x01; wr_usb_data(1,Request.Req_buf); issue_token(( 0 << 4 ) | DEF_USB_PID_OUT);status=wait_interrupt(); if(status==USB_INT_SUCCESS) /* DATA阶段操作成功 */ { endp6_mode=0xc0; toggle_recv(); issue_token(( 0 << 4 ) | DEF_USB_PID_IN);status=wait_interrupt(); if(status==USB_INT_SUCCESS)/* 状态阶段操作成功 */ { if(rd_usb_data(data_buf)!=0) return(0); } else return(0); } else return(0); } else return(0); return(1); } 我用的单片机是小端数据格式,上次我看到一个帖子,就按照上面的改了一下。

set_config_ex()中,我将((unsigned int )config_value<<8改成(unsigned int )congfig_value<<0 后 可以返回1 set_idle()中,我将0x0a改成0x0b,因为我查了一下资料 发现0X0A是GET_INTERFACE 0X0B是SET_INTERFACE.也通过了 这样改行不行呢??? set_report()在if(status==USB_INT_SUCCESS) /* DATA阶段操作成功 */ status一直返回0x2e。应该怎么做呢?


大小端只有在数据类型大于8个字节的时候才会有大小端的问题,这个你自己注意下就好了。设置配置可以了么?set_idle()有可能你的设备不支持这个命令,这个也很正常,返回2E说明你的设备不支持。0x0B命令是指定启用协议或者报表协议,一般不需要处理,0x0a和0x0b都是针对接口的。操作鼠标,如果的设备报表不是复合的你可以把这个命令改成如下: Request.Req.bmRequestType=0x21; Request.Req.bRequest=0x09; Request.Req.wValue=0x0100;(高字节为1,低字节为0) Request.Req.wIndex=0x0000;(这个事接口号,根据你的配置描述符来定义,一般为0) Request.Req.wLength=0x0100; 或者不处理set_report这个命令请求(有些设备必须要处理)


恩恩 是的 我发现不需要SET_REPORT()这个函数 嘿嘿 现在获取鼠标输入的数据应该怎么弄?能不能提供一个函数给我??我发现例程的程序我不好改!我不想用中断!谢谢!(我现在用的是根据例程改的)在鼠标有动作的时候除了第一次返回的是0X14以外。其余时候都是返回的0x20)


额 打错了!是读取鼠标的数据!


每隔10MS左右发送: issue_token(( endp_int1 << 4 ) | DEF_USB_PID_IN);//status=wait_interrupt(); //////////// status=wait_interrupt(); if(status==USB_INT_SUCCESS) { endp6_mode1^=0x40; len_temp=rd_usb_data(data_buf); //键盘中断端点数据长度一般为8字节,鼠标为4字节 for(i=0;i!=len_temp;i++)data_in[i]=data_buf[i]; for(i=0;i!=8;i++)printf("%02x ",(unsigned int)data_in[i]); printf("\n"); }


嗯 现在能接受到鼠标的数据了 是3个值 第一个是鼠标的三个按键 左键是01 右键是02 中间的是04 对不?? 但是X方向和Y方向的分别是哪两个????


一般式4个字节,第一个字节表示左右按键,第二个字节表示左右方向,第三字节表示上下方向。有的鼠标是6个字节的,每个字节又表示不同的意义,你要想把兼容性做的好的话,需要你程序中分析报表描述符的意义,这个需要你看HID协议的


我现在能获取的是3个字节!是标准的!就是按键 左右位移和上下位移。我需要获取4个字节(加一个滑轮)应该怎么做呢????


你设备只返回3个字节,也没有办法。你的设备有没有滑轮呢?!你在电脑用BUSHOUND抓下,你鼠标左右上下按键滑轮的返回值


有滑轮的啊!!!!


你在电脑用BUSHOUND抓下,你鼠标左右上下按键滑轮的返回值


我发现是CH375获取的HID类报表描述符和标准的HID类描述符不同!是不是我发送的获取HID类报表描述符的命令有问题?


你用BUSNOUND抓出来的数据时几个?是否获取报表描述符和鼠标返回数据存不存在关系,要看具体的设备了,报表数据,如果你要做兼容性需要你分析的,就是你的鼠标上传上的数据位数以及意义


0501 0902 A101 0509 1901 2903 1500 2501 9503 7501 8102 9501 7505 8103 0501 0901 A100 0930 0931 1581 257F 7508 9502 8106 C0 0938 1581 257F 7508 9501 8106 C0(CH375)

0501 0902 a101 0901 a100 0509 1901 2903 1500 2501 9503 7501 8102 9501 7505 8103 0501 0930 0931 0938 1581 257f 7508 9503 8106 c0c0 上面一列是CH375从USB鼠标获取的报表描述符 下面一列是标准的带滑轮的USB鼠标报表描述符


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