CMD_GET_DESCR ???

如果用CMD_GET_DESCR命令,得到的结果,也是一样 0x2E

type=1,获取设备描述符

unsigned char get_descr( unsigned char type ) { /* 从设备端获取描述符 */ status=0xff; xWriteCH375Cmd( CMD_GET_DESCR ); xWriteCH375Data( type ); /* 描述符类型, 只支持1(设备)或者2(配置) */ status=wait_interrupt(); /* 等待CH375操作完成 */

//**************status返回0x2E***********************************

if ( status==USB_INT_SUCCESS ) { /* 操作成功 */

unsigned char i, len; len=rd_usb_data( data_buf ); //printf( "%s描述符是:", type==1?"设备":"配置" ); //for ( i=0; i!=len; i++ ) printf( "%02x ", (unsigned int)data_buf ); //printf( "\n" ); } return( status ); }

...


setup阶段成功,但在Data阶段操作失败,中断返回0x2E

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(); if(status==USB_INT_SUCCESS)/* SETUP阶段操作成功 */ { endp6_mode=0xc0; toggle_recv(); } else return(status); //*******以上返回正确*****************

issue_token(( 0 << 4 ) | DEF_USB_PID_IN);status=wait_interrupt(); //*********这部返回错误,0x2E 设备返回STALL*********** //***********即status =0x2E*************************** //************************************************** if(status==USB_INT_SUCCESS)/* DATA阶段操作成功 */ { 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(3);

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); else return(4); }


从程序上来看没有错误,这样,你测量一下当设备连接以后,UD+和UD-的的电压是不是UD+3.3左右,UD-是0.4以下,这个程序是操作鼠标键盘的程序上的.检查您的程序有没有切换到低速模式上,如果您实际操作的 是全速或者高速设备,肯定会出现上述错误的. set_freq( ); //使375B进入低速模式 将这个函数去掉,.


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