用了本站给的操作复合设备键盘的例程,前半部分程序没有问题,最后读键盘数据时,只能读到按下的第一个键的中断,得到键值也没问题,但是之后的再按按键一点反应都没有,不会进入中断里,不知道是不是端点切换同步出现了问题,还是其他问题?我不太懂那个同步切换的原理。出问题的程序在这: while(1) { if(CHECK_DEVICE()==USB_INT_DISCONNECT)break;//检查设备是否存在,断开则退出 else{ status=Interrupt_Data_Trans(Data_Buf,EndpIn1,TogDevice1); if(status==USB_INT_DISCONNECT)break; //设备断开,退出 status=Interrupt_Data_Trans(Data_Buf,EndpIn2,TogDevice2); if(status==USB_INT_DISCONNECT)break; //设备端断开,退出 } }
//复合设备,则可以根据端点地址来切换相应的同步位 unsigned char Interrupt_Data_Trans(unsigned char *buf,unsigned char Endp,unsigned char RecvTog) { unsigned char status,Value=0x00;//,i=0x00,length=0x00 Set_RecvTog(RecvTog); Issus_Token( (Endp<<4)|DEF_USB_PID_IN ); status=wait_interrupt(); if(status==USB_INT_SUCCESS)//事务成功,同步翻转 { Rd_Usb_Data(buf);//读取数据 if(Endp==EndpIn1)//由于在保存参数时,已经限制EndpIn1为键盘的相关参数,是键盘检查是否需要点亮LED { if((buf[2]==0x53)||(buf[2]==0x39)||(buf[2]==0x47))//NUM LOCk,SCROLL LOCK,CAPS LOCK { Value=ReportValueCheck(buf[2]); status=Set_Report(Value); //点亮LED } TogDevice1^=0x40;//获取键盘数据成功,切换相应的同步位 } else TogDevice2^=0x40;//获取其他接口设备的数据成功,切换相应同步位 } return ( status ); //返回设备状态 }