[求助]CH375b读取键盘的数据不全

你好:

我利用avr单片机,主控芯片CH375枚举键盘,发现不能枚举键盘, 我用BUSHOUND查看键盘信息: Bus Hound 6.01 capture on Windows Vista Service Pack 1 (x64). Complements of www.perisoft.net

LXH-EKB-10YA(白色)

Device - Device ID (followed by the endpoint for USB devices) (22) USB 输入设备 (25) USB 输入设备 (26) USB 输入设备 Phase - Phase Type CTL USB control transfer IN Data in transfer OUT Data out transfer Data - Hex dump of the data transferred Descr - Description of the phase Cmd... - Position in the captured data

Device Phase Data Description Cmd.Phase.Ofs(rep) ------ ----- ------------------------ ---------------- ------------------ 25.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR 1.1.0 25.0 IN 12 01 00 02 00 00 00 08 ........ 1.2.0 ef 17 2d 60 30 01 01 02 ..-`0... 1.2.8 00 01 .. 1.2.16 25.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR 2.1.0 25.0 IN 09 02 22 00 01 01 00 a0 .."..... 2.2.0 32 2 2.2.8 25.0 CTL 80 06 00 02 00 00 22 00 GET DESCRIPTOR 3.1.0 25.0 IN 09 02 22 00 01 01 00 a0 .."..... 3.2.0 32 09 04 00 00 01 03 01 2....... 3.2.8 01 00 09 21 11 01 00 01 ...!.... 3.2.16 22 41 00 07 05 81 03 08 "A...... 3.2.24 25.0 CTL 00 09 01 00 00 00 00 00 SET CONFIG 4.1.0 25.0 CTL 21 0a 00 00 00 00 00 00 SET IDLE 5.1.0 25.0 CTL 81 06 00 22 00 00 81 00 GET DESCRIPTOR 6.1.0 25.0 IN 05 01 09 06 a1 01 05 07 ........ 6.2.0 19 e0 29 e7 15 00 25 01 ..)...%. 6.2.8 75 01 95 08 81 02 95 01 u....... 6.2.16 75 08 81 01 95 03 75 01 u.....u. 6.2.24 26.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR 7.1.0 26.0 IN 12 01 00 02 00 00 00 08 ........ 7.2.0 ef 17 2d 60 30 01 01 02 ..-`0... 7.2.8 00 01 .. 7.2.16 26.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR 8.1.0 26.0 IN 09 02 22 00 01 01 00 a0 .."..... 8.2.0 32 2 8.2.8 26.0 CTL 80 06 00 02 00 00 22 00 GET DESCRIPTOR 9.1.0 26.0 IN 09 02 22 00 01 01 00 a0 .."..... 9.2.0 32 09 04 01 00 01 03 00 2....... 9.2.8 00 00 09 21 11 01 00 01 ...!.... 9.2.16 22 a5 00 07 05 82 03 05 "....... 9.2.24 26.0 CTL 00 09 01 00 00 00 00 00 SET CONFIG 10.1.0 26.0 CTL 21 0a 00 00 01 00 00 00 SET IDLE 11.1.0 26.0 CTL 81 06 00 22 01 00 e5 00 GET DESCRIPTOR 12.1.0 26.0 IN 05 01 09 80 a1 01 85 01 ........ 12.2.0 19 81 29 83 15 00 25 01 ..)...%. 12.2.8 95 03 75 01 81 02 95 05 ..u..... 12.2.16 81 01 c0 06 0c 00 09 01 ........ 12.2.24 25.0 CTL 21 09 00 02 00 00 01 00 SET REPORT 13.1.0 25.0 OUT 00 . 13.2.0

我在用单片机枚举时候发现: 获取设备描述符时候完全一样:12 01 00 02 00 00 00 08 EF 17 2D 60 30 01 01 02 00 01

在获取配置描述符时候:02 3b 00 02 01 00 a0 32 , busHound 22->3b,01->02这两位不一样

程序继续运行,获取的别的描述符,个别也有问题,结果键盘不能枚举 我后来改动这个函数 void get_int_in() { endp6_mode=0x80; toggle_recv(); //UDR1=endp_int; endp_int=0x01; issue_token(( endp_int << 4 ) | DEF_USB_PID_IN);//status=wait_interrupt(); }

直接给endp_int=0x01; 就可以从中断接受到键值,但是这个键值需要按下五六秒才能接到一个,并且中断在不按任何按键时候,也不断接受0X14, 由于最近项目赶时间,利用你们的芯片解析USB键盘,恳求帮忙找下解决方法,

根据你的现象必须确保每一步获取到的描述符与BUSHOUND抓到的数据一样。可能原因: (1)鼠标键盘一般是低速设备,必须设置速度set_freq( ); (2)你的单片机主频多块,使用什么接口操作CH375B,如果主频太快你可以在读写函数之间加1~2US延时。


你好, 1、我已经设置成低速设备了; 2、我 以下是设置的程序,参考的是U盘读写的函数,您帮我分析下 void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ delay2us(); PORTD|=(1< PORTB=cmd; DDRB=0XFF; PORTD&=~(1<PORTD&=~(1< //PORTD|=(1< DDRB=0XFF; //该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS PORTD|=0Xf0;//输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; DDRB=0X00; /* 禁止数据输出 */ PORTD&=~(1<delay2us(); }

void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ PORTB=dat; DDRB=0XFF; PORTD&=0X4F;/* 输出有效写控制信号, 写CH375芯片的数据端口, A0=0; CS=0; WR=0; RD=1; */ DDRB=0XFF; //该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS PORTD|=0Xf0;//输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; DDRB=0X00; /* 禁止数据输出 */ delay1us(); }

unsigned int CH375_RD_DAT_PORT() { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ unsigned int temp; delay1us(); DDRB=0X00; PORTD&=0X2F;/* 输出有效读控制信号, 读CH375芯片的数据端口, A0=0; CS=0; WR=1; RD=0; */ DDRB=0X00; //该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS temp=PINB; PORTD|=0Xf0;//输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; return(temp); }


你的读函数CH375_RD_DAT_PORT返回值怎么定义成unsigned int,我们一般是unsigned char。你可以做一下测试命令check_exsit(0x06)来验证接口函数。


我把这个改成unsigned char 和以前效果一样


那你测试命令能够通过吗?或者换一个键盘试一下。


我测试命令可以通过,我们公司我测试了十个键盘,有两个可以通过,可以采集到数据,其余不通过的全是复合键盘,我不太了解对于复合键盘的枚举,


你看下复合键盘是可以再BOIS下使用的话,那么可以让你的键盘工作在BOIS模式。


我可能没有表述清楚,我的单片机+ch375做的是模拟主机,用来读取键盘的值,这样的情况下,有bios设置方式么


使用CH375操作符合设备与普通设备类似,需要你枚举设备,然后分析端点,根据分析的端点上传输数据。


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