[求助]用375控制鼠标不能实现热插拨,怎么回事?

while( 1 ) { while(wait_interrupt() != USB_INT_CONNECT); /* 等待设备端连接上来 */ Delay_ms( 5 ); reset_device( ); Delay_ms( 5 ); //get_descr(0x01); //获取设备描述符 set_addr( 5 ); //设置地址 设置设备端的USB地址 get_descr(0x02); //获取配置描述符 parse_config_descr( ); //保存描述符中一些值 set_config(config_value);//设置配置,config_value取自USB设备的配置描述符 if(set_idle( ) != 1) err(); Delay_ms(250); _SEI( ); //打开中断,从中断端点接收数据 get_int_in( ); //发送从中断端点读数据的令牌 do{ if(flag_output == 1) // { P1_2 ^= 0x01; flag_output = 0; } if(device_disconnect == 1) //如果在中断程序中操作状态是USB_INT_DISCONNECT, { 则程序跳出do{ }while(1)这个循环,重新检测鼠标的 _CLI(); 连接. PORTC_Bit0 = 0; break; } }while( 1 ); }

我的枚举也有些问题,就是加上 get_descr(0x01) 这个函数,有些鼠标不能通过,所以我就把这个函数给注释了,但是 get_descr(0x02) 这个函数却能通过.怎么回事?

还是当我的鼠标拨出来后,中断是可以接收到 USB_INT_DISCONNECT 这个状态码,程序也跳出了do{ }while(1) 这个循环,这时我再插上鼠标,375就怎么也找不到鼠标了. 但是开机的第一次热插上375时,375是能够找到鼠标并工作的

你可以将你的主程序全部的帖出来看下,以及你插上鼠标之后,程序停在了什么地方??插上去之后375有没有产生中断??你可以测下375的中断脚是高还是低?


void main(void) { AVR_Device_Init( ); //设置波特率为9600 Delay_ms(250); if(modify_baudrate(0x03,0xcc) != 1) //在9600下将CH375波特率修改为115200,或其他值 err( ); if(set_usb_mode( 6 ) != 1) //设置USB主机模式, 如果设备端是CH37X,5和6均可 err( ); #ifdef TEST_LOW_SPEED set_freq(0x01); //work in 1.5M,设置系统工作频率 Delay_ms( 5 ); UBRRH = 0X00; //设置波特率 UBRRL = 0X2F; //14.4Kbps #endif while( 1 ) { while(wait_interrupt() != USB_INT_CONNECT); /* 等待设备端连接上来 */ Delay_ms( 5 ); reset_device( ); Delay_ms( 5 ); //get_descr(0x01); //获取设备描述符 set_addr( 5 ); //设置地址 设置设备端的USB地址 get_descr(0x02); //获取配置描述符 parse_config_descr( ); //保存描述符中一些值 set_config(config_value);//设置配置,config_value取自USB设备的配置描述符 if(set_idle( ) != 1) err(); Delay_ms(250); _SEI( ); //打开中断,从中断端点接收数据 get_int_in( ); //发送从中断端点读数据的令牌 do{ if(flag_output == 1) // { P1_2 ^= 0x01; flag_output = 0; } if(device_disconnect == 1) //如果在中断程序中操作状态是USB_INT_DISCONNECT, { 则程序跳出do{ }while(1)这个循环,重新检测鼠标的连接. _CLI(); PORTC_Bit0 = 0; break; //程序跳出do{ }while(1) } }while( 1 ); } }

枚举时,我是用查询法查询375的状态,枚举完后,单片机用中断接收375的状态.这跟你们给我那个鼠标程序一样.


在你拔出鼠标之后在插上去之后,你监测下你的程序跑到什么地方去了?


hcn,软件复位375怎么做,我想试一下在鼠标拨去后,复位一下375,再重新初始化,


你可以发设置07模式复位USB总线 ,例如: CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); /* 设置USB工作模式 */ CH375_WR_DAT_PORT( 7 ); /* 模式代码,复位USB设备 */ mDelay10mS( ); /* 复位时间应该在10mS左右 */ 也可以进行硬件复位,例如: for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* 多次重复发命令,执行硬件复位 */ CH375_RD_DAT_PORT( ); } CH375_WR_CMD_PORT( 0 ); Delay50ms( ); /* 延时50ms */


在for循环里为什么要CH375_RD_DAT_PORT( ); 循环完后为什么要CH375_WR_CMD_PORT( 0 );

这样行不行: for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* 多次重复发命令,执行硬件复位 */ } Delay50ms( ); /* 延时50ms */


CH375_RD_DAT_PORT( )只是看发了复位命令后读出来的数据是什么.成功后就写命令0. 下面的也可以


loveapple,谢谢


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