CH375B操作USB键盘的问题

我用的AVR mega128 用本论坛51单片机那个程序改编的 但是插上键盘过后 中断引脚始终是高 接收不到任何东西 不知道问题出在哪里? 请高手帮忙啊 在线等.... 做了好几天了 还没搞定 我的程序如下UploadImages/2010111820541561.txtUploadImages/201011239263668.txt

我重新将我的程序发上来了 我不太清楚怎么样才算初始化完成

出错的开始是从获取设备描述符的数据阶段的中断状态值 返回为0x2e 本来应该为0X14才能 unsigned char get_descr_ex() { unsigned char descr_len; unsigned char *p=data_buf; endp7_mode=0x80; toggle_send(); wr_usb_data(8,Request.Req_buf); issue_token(( 0 << 4 ) | DEF_USB_PID_SETUP); status=wait_interrupt();//printf("SETUP USB_INT_SUCCESS\n");

//此处获取到的状态值为2e 所以下面不能执行

if(status==USB_INT_SUCCESS)/* SETUP阶段操作成功 */ { endp6_mode=0xc0; toggle_recv(); printf("SETUP USB_INT_SUCCESS\n"); } else {return(0);//printf("SETUP USB_INT_fail\n"); } issue_token(( 0 << 4 ) | DEF_USB_PID_IN);status=wait_interrupt(); if(status==USB_INT_SUCCESS)/* DATA阶段操作成功 */ { printf("data USB_INT_SUCCESS\n"); if(flag_config_2)descr_len=data_buf[2]-rd_usb_data(data_buf); else descr_len=data_buf[0]-rd_usb_data(data_buf); while(descr_len>0) { toggle_recv(); p+=0x08; issue_token(( 0 << 4 ) | DEF_USB_PID_IN);status=wait_interrupt(); if(status==USB_INT_SUCCESS) /* DATA阶段操作成功 */ descr_len-=rd_usb_data(p); else return(0); } } else return(0);//printf("data USB_INT_fail\n"); endp7_mode=0xc0; toggle_send(); wr_usb_data(0,Request.Req_buf); issue_token(( 0 << 4 ) | DEF_USB_PID_OUT);status=wait_interrupt(); if(status==USB_INT_SUCCESS)/* 状态阶段操作成功 */ {return(1); //printf("SETUP USB_INT_SUCCESS\n"); } else return(0); } [font=黑体]文字[/font][b]文字[/b][font=宋体]文字[/font]

status=wait_interrupt();//printf("SETUP USB_INT_SUCCESS\n");

//此处获取到的状态值为2e 所以下面不能执行

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

前面时对的 请问怎么解决 ?

我按每个按键都没有反应 不能得到键值 但有一个键盘能点亮灯

都没人回答?、太不给力了


你这么晚发帖,要等我们上班才能回复 你的现象是CH375没有被初始化成功。说明时序或者硬件有问题。 请做测试命令。CHECK_EXIST命令。详细参考CH375DS1


哦 你好 现在的问题是 鼠标能够读到码 也就是点左键右键滚轮移动都可以返回键值 但是插键盘就不行 有一个键盘的NUM灯能点亮但按键没有反应 收不到码值 而另外的一个则灯不亮 一直不断的受到一个值 2 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 。。。。。。。。 这是什么原因 两个键盘插电脑都可以用 为什么现象不一样呢 而且描述符和配置符获取也是错误的


首先普通的按键能否收到?还有点灯的话是需要发送控制传输的SET-REPORT的请求。还有就是你前面对键盘的初始化都完成了吗?还有不能获取键值的键盘哪个步骤是否未完成?


那你的程序在哪一步返回的错误?


我重新将我的程序发上来了 我不太清楚怎么样才算初始化完成

出错的开始是从获取设备描述符的数据阶段的中断状态值 返回为0x2e 本来应该为0X14才能 unsigned char get_descr_ex() { unsigned char descr_len; unsigned char *p=data_buf; endp7_mode=0x80; toggle_send(); wr_usb_data(8,Request.Req_buf);

issue_token(( 0 << 4 ) | DEF_USB_PID_SETUP); status=wait_interrupt();//printf("SETUP USB_INT_SUCCESS\n");

//此处获取到的状态值为2e 所以下面不能执行

if(status==USB_INT_SUCCESS)/* SETUP阶段操作成功 */ { endp6_mode=0xc0; toggle_recv(); printf("SETUP USB_INT_SUCCESS\n"); } else {return(0);//printf("SETUP USB_INT_fail\n"); } issue_token(( 0 << 4 ) | DEF_USB_PID_IN);status=wait_interrupt(); if(status==USB_INT_SUCCESS)/* DATA阶段操作成功 */ { printf("data USB_INT_SUCCESS\n"); if(flag_config_2)descr_len=data_buf[2]-rd_usb_data(data_buf); else descr_len=data_buf[0]-rd_usb_data(data_buf); while(descr_len>0) { toggle_recv(); p+=0x08; issue_token(( 0 << 4 ) | DEF_USB_PID_IN);status=wait_interrupt(); if(status==USB_INT_SUCCESS) /* DATA阶段操作成功 */ descr_len-=rd_usb_data(p); else return(0);

} } else return(0);//printf("data USB_INT_fail\n");

endp7_mode=0xc0; toggle_send(); wr_usb_data(0,Request.Req_buf); issue_token(( 0 << 4 ) | DEF_USB_PID_OUT);status=wait_interrupt(); if(status==USB_INT_SUCCESS)/* 状态阶段操作成功 */ {return(1); //printf("SETUP USB_INT_SUCCESS\n"); } else return(0); } 文字文字文字

status=wait_interrupt();//printf("SETUP USB_INT_SUCCESS\n");

//此处获取到的状态值为2e 所以下面不能执行

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

前面时对的 请问怎么解决 ?

我按每个按键都没有反应 不能得到键值 但有一个键盘能点亮灯


descr12 1 10 1 0 0 0 8 81 a 1 1 10 1 1 2 0 1 这是执行get_descr(0X01);后得到的描述符 执行get_descr(0x02)后得到的配置描述符 descr9 2 3b 0 2 1 0 a0 32 9 4 0 0 1 3 1 1 0 9 21 10 1 21 1 22 41 0 7 5 81 3 8 0 a 9 4 1 0 1 3 0 0 0 9 21 10 1 21 1 22 66 0 7 5 82 3 8 0 a

有问题吗


你这个是复合的HID类设备,需要分析下你的端点,你的设备有2个端点,分别为0X81和0X82。你看下你读取数据是采用哪个端点获取数据的?你在换另外一个端点来获取下数据看是否成功,还有在初始化的时候,还需要分别获取2个HID类的报表描述符。


很感谢你的回复

上面有我的程序你能帮忙看看吗 获取数据的端点是再哪里改呢 那两个HID类的报表描述符又又怎么获取

谢谢


我的程序请看1楼的附件


你把这个函数稍微的修改下: void get_int_in() { endp6_mode=0x80; toggle_recv(); issue_token(( endp_int << 4 ) | DEF_USB_PID_IN);//status=wait_interrupt(); }

里面的endp_int这个是代表的端点号,你可以选择换成0X01和0X02来测试下,至于分别区分的话,修改程序比较麻烦,建议你去看下USB的协议来操作下


感谢你的回答 我修改了端点号为0x01后能读出数据了 只是前面的获取设备 描述符和配置描述符还是失败的 中断状态值是0X2e不是0x14 怎么解决?

还有这个我用另外一个键盘来试出现的是灯不亮 set_report failed 一直不断的收到一个值 2 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 。。。。。。。。 没法停止按键也没有反应


你使用的是CH375S吗?如果是CH375S的话,那么建议你换成CH375B,上面的程序只能在CH375B上面使用,CH375S在使用低速模式的话,需要把D+和D-的引脚换下才可以枚举设备。


是啊 原来用的是375S现在换成了375B 一般的键盘都可以读了 但是就是我要测得那个读不了 灯都没有点亮 端点号我也试了几个了 0x01 0x02 0 都试过了 不行 而且它一直在do{}while 那个循环里 flag_ou一直都是1 但是又没有中断 循环后面是将它置零了的 一直输出0 有时候每组的第一个是2


上面说错了 是一直都在中断 但是我并没有按键 读出的数据全是0 或者第一个是2后面的是0 这是为什么 而我用的另一个键盘又是正常的

求解释

descr12 1 10 1 0 0 0 8 f3 4 3 1 5 1 0 0 0 1

descr9 2 3b 0 2 1 0 a0 32 9 4 0 0 1 3 1 1 0 9 21 10 1 0 1 22 36 0 7 5 81 3 8 0 a 9 4 1 0 1 3 0 0 0 9 21 10 1 0 1 22 34 0 7 5 82 3 3 0 a config


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