用了/bbs/View.asp?T=1&S=101&I=2938这个链接里的程序,但是接上电脑后无法识别设备。不知道什么原因,求指点。
电脑无法识别的设备,说明你枚举没有成功,你得抓一下数据看看那一条命令没有正确响应?
怎样抓数据?是用软件监控USB传输的数据吗?
可以使用USB分析仪或者BusHound软件监控一下。
之前的问题已经解决,但是又有奇怪的情况!就是连接后,可以使用了,但是过了20秒就又无法使用了,请问这是什么问题呢?
你看一下你的程序里怎么处理的,是不是过了20s就超时退出了。
程序初始化ch375后,就进行鼠标枚举,成功后进入一个无限循环,检测单片机按键,用按键控制鼠标移动。
void main(void) { unsigned char i; unsigned char dir=0; unsigned char steps=0;
delay1s(); /* 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 */ CH375_Init( ); /* 初始化CH375 */
SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xfd; /* 11.0592MHz晶振, 9600bps */ TR1 = 1; TI = 1;
IT0=1; EX0=1; EA=1;
printf("系统启动\r\n");
enu_success=0; //枚举成功标志清零
while ( 1 ) { // delay50ms(); mDelaymS( 1 );
if(UP1==0)dir=0; else if(DOWN1==0)dir=1; else if(LEFT1==0)dir=2; else if(RIGHT1==0)dir=3; else if(BUTTON1==0)dir=4; else dir=5; switch(dir) { case 0: //向上 request.buffer[0]=0x00; request.buffer[1]=0x00; request.buffer[2]=0xfd; break; case 2: //向下 request.buffer[0]=0x00; request.buffer[1]=0x00; request.buffer[2]=0x03; break; case 1: //向左 request.buffer[0]=0x00; request.buffer[1]=0xfd; request.buffer[2]=0x00; break; case 3: //向右 request.buffer[0]=0x00; request.buffer[1]=0x03; request.buffer[2]=0x00; break; case 4: //左键 request.buffer[0]=0x01; request.buffer[1]=0x00; request.buffer[2]=0x00; break; case 5: request.buffer[0]=0x00; request.buffer[1]=0x00; request.buffer[2]=0x00; break; }
/// CH375_WR_CMD_PORT( CMD_WR_USB_DATA5 ); CH375_WR_DAT_PORT( 3 ); //写入长度 for( i=0;i!=3;i++ ) CH375_WR_DAT_PORT( request.buffer[i] ); //循环写入数据 } }
如果枚举正常的话,主机会不断地发送IN包,那么你按键数据就会上传上去,除非你数据上传不正确,否则不会导致无法使用。
我用bus hound监控USB口传输的数据,没发现有错误,就是过了一段时间就突然停止工作了,ch375数据就发不出去了。
可以确定的是单片机还是在正常运行的,就是USB那边用bus hound监控接收不到数据,是电脑断开了USB连接吗?
下位机上传数据,需要上位机(电脑)发送IN包下来,你看看你的IN包有没有发下来?
会不会是枚举失败,识别ch375B为鼠标后,可以移动了,但是过了十几秒始终无法得到完整的枚举数据,电脑又自动断开连接了?
有这种可能性,过一段时间就复位了,又重新枚举了。这种情况你可以对比电脑的枚举过程。
用bus hound监控不到电脑发出的数据,只能看到鼠标发出的数据,显示的数据如下。这些是移动鼠标的数据。 9 DI 00 ff ff 00 .... 0us 1.1.0 16 DI 00 ff ff 00 .... 2us 2.1.0 9 DI 00 fe ff 00 .... 377us 3.1.0 16 DI 00 fe ff 00 .... 2us 4.1.0 9 DI 00 fe ff 00 .... 15ms 5.1.0 16 DI 00 fe ff 00 .... 2us 6.1.0 9 DI 00 ff 00 00 .... 252us 7.1.0 16 DI 00 ff 00 00 .... 2us 8.1.0 9 DI 00 fe fe 00 .... 15ms 9.1.0 16 DI 00 fe fe 00 .... 2us 10.1.0 9 DI 00 fd ff 00 .... 252us 11.1.0 16 DI 00 fd ff 00 .... 1us 12.1.0 9 DI 00 fd fe 00 .... 15ms 13.1.0 16 DI 00 fd fe 00 .... 2us 14.1.0 9 DI 00 fe fe 00 .... 245us 15.1.0 16 DI 00 fe fe 00 .... 2us 16.1.0 9 DI 00 fd ff 00 .... 15ms 17.1.0 16 DI 00 fd ff 00 .... 33us 18.1.0 9 DI 00 fc fe 00 .... 347us 19.1.0 16 DI 00 fc fe 00 .... 3us 20.1.0 9 DI 00 fe ff 00 .... 15ms 21.1.0 16 DI 00 fe ff 00 .... 2us 22.1.0 9 DI 00 fe ff 00 .... 380us 23.1.0 16 DI 00 fe ff 00 .... 3us 24.1.0 9 DI 00 ff ff 00 .... 15ms
普通鼠标发送的都是四字节数据,而你只上传了三字节数据,这个会不会有问题?
修改成发送4个字节数据之后电脑就无法识别ch375了,完全不工作。用bus hound监控会出现error提示。这个循环不是应该在联机成功后才开始运行的吗?怎么会使枚举都失败了?